日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java内存泄露有什么后果,Java内存泄露问题是什么?

發(fā)布時(shí)間:2023/12/15 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java内存泄露有什么后果,Java内存泄露问题是什么? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

很多人在談?wù)搩?nèi)存泄露問(wèn)題,當(dāng)然對(duì)于c/c++來(lái)說(shuō),這個(gè)應(yīng)該是老掉牙的問(wèn)題,但是很多Java人員也越來(lái)越多得討論這個(gè)問(wèn)題,我這里寫(xiě)個(gè)小結(jié),希望對(duì)大家有一定的參考價(jià)值。

內(nèi)存泄漏的慨念

1。c/c++是程序員自己治理內(nèi)存,Java內(nèi)存是由GC自動(dòng)回收的。

我雖然不是很熟悉C++,不過(guò)這個(gè)應(yīng)該沒(méi)有犯常識(shí)性錯(cuò)誤吧。

2。什么是內(nèi)存泄露?

內(nèi)存泄露是指系統(tǒng)中存在無(wú)法回收的內(nèi)存,有時(shí)候會(huì)造成內(nèi)存不足或系統(tǒng)崩潰。

在C/C++中分配了內(nèi)存不釋放的情況就是內(nèi)存泄露。

3。Java存在內(nèi)存泄露

我們必須先承認(rèn)這個(gè),才可以接著討論。

雖然Java存在內(nèi)存泄露,但是基本上不用很關(guān)心它,非凡是那些對(duì)代碼本身就不講究的就更不要去關(guān)心這個(gè)了。

Java中的內(nèi)存泄露當(dāng)然是指:存在無(wú)用但是垃圾回收器無(wú)法回收的對(duì)象。而且即使有內(nèi)存泄露問(wèn)題存在,也不一定會(huì)表現(xiàn)出來(lái)。

4。Java中參數(shù)都是傳值的。

對(duì)于基本類(lèi)型,大家基本上沒(méi)有異議,但是對(duì)于引用類(lèi)型我們也不能有異議。

Java是如何管理內(nèi)存

為了判斷Java中是否有內(nèi)存泄露,我們首先必須了解Java是如何管理內(nèi)存的。Java的內(nèi)存管理就是對(duì)象的分配和釋放問(wèn)題。在Java中,程序員需要通過(guò)關(guān)鍵字new為每個(gè)對(duì)象申請(qǐng)內(nèi)存空間 (基本類(lèi)型除外),所有的對(duì)象都在堆 (Heap)中分配空間。

另外,對(duì)象的釋放是由GC決定和執(zhí)行的。在Java中,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放是有GC完成的,這種收支兩條線的方法確實(shí)簡(jiǎn)化了程序員的工作。但同時(shí),它也加重了JVM的工作。這也是Java程序運(yùn)行速度較慢的原因之一。因?yàn)?#xff0c;GC為了能夠正確釋放對(duì)象,GC必須監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng)、引用、被引用、賦值等,GC都需要進(jìn)行監(jiān)控。

監(jiān)視對(duì)象狀態(tài)是為了更加準(zhǔn)確地、及時(shí)地釋放對(duì)象,而釋放對(duì)象的根本原則就是該對(duì)象不再被引用。

為了更好理解GC的工作原理,我們可以將對(duì)象考慮為有向圖的頂點(diǎn),將引用關(guān)系考慮為圖的有向邊,有向邊從引用者指向被引對(duì)象。另外,每個(gè)線程對(duì)象可以作為一個(gè)圖的起始頂點(diǎn),例如大多程序從main進(jìn)程開(kāi)始執(zhí)行,那么該圖就是以main進(jìn)程頂點(diǎn)開(kāi)始的一棵根樹(shù)。

在這個(gè)有向圖中,根頂點(diǎn)可達(dá)的對(duì)象都是有效對(duì)象,GC將不回收這些對(duì)象。如果某個(gè)對(duì)象 (連通子圖)與這個(gè)根頂點(diǎn)不可達(dá)(注意,該圖為有向圖),那么我們認(rèn)為這個(gè)(這些)對(duì)象不再被引用,可以被GC回收。

以下,我們舉一個(gè)例子說(shuō)明如何用有向圖表示內(nèi)存管理。

對(duì)于程序的每一個(gè)時(shí)刻,我們都有一個(gè)有向圖表示JVM的內(nèi)存分配情況。以下右圖,就是左邊程序運(yùn)行到第6行的示意圖。

Java使用有向圖的方式進(jìn)行內(nèi)存管理,可以消除引用循環(huán)的問(wèn)題,例如有三個(gè)對(duì)象,相互引用,只要它們和根進(jìn)程不可達(dá)的,那么GC也是可以回收它們的。

這種方式的優(yōu)點(diǎn)是管理內(nèi)存的精度很高,但是效率較低。另外一種常用的內(nèi)存管理技術(shù)是使用計(jì)數(shù)器,例如COM模型采用計(jì)數(shù)器方式管理構(gòu)件,它與有向圖相比,精度行低(很難處理循環(huán)引用的問(wèn)題),但執(zhí)行效率很高。

Java內(nèi)存泄露情況

JVM回收算法是很復(fù)雜的,我也不知道他們?cè)趺磳?shí)現(xiàn)的,但是我只知道他們要實(shí)現(xiàn)的就是:對(duì)于沒(méi)有被引用的對(duì)象是可以回收的。

所以你要造成內(nèi)存泄露就要做到:

持有對(duì)無(wú)用對(duì)象的引用!

不要以為這個(gè)很輕易做到,既然無(wú)用,你怎么還會(huì)持有它的引用? 既然你還持有它,它怎么會(huì)是無(wú)用的呢?

我實(shí)在想不到比那個(gè)堆棧更經(jīng)典的例子了,以致于我還要引用別人的例子,下面的例子不是我想到的,是書(shū)上看到的,當(dāng)然假如沒(méi)有在書(shū)上看到,可能過(guò)一段時(shí)間我自己也想的到,可是那時(shí)我說(shuō)是我自己想到的也沒(méi)有人相信的。

public class Stack {

private Object[] elements=new Object[10];

private int size = 0;

public void push(Object e){

ensureCapacity();

elements[size++] = e;

}。

全部

總結(jié)

以上是生活随笔為你收集整理的java内存泄露有什么后果,Java内存泄露问题是什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。