成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

java內存泄露的理解與解決

開發 后端
在c++ 語言中,如果需要動態分配一塊內存,程序員需 要負責這塊內存的整個生命周期。從申請分配、到使用、再到最后的釋放。這樣的過程非常靈活,但是卻十分繁瑣,程序員很容易由于疏忽而忘記釋放內存,從而導 致內存的泄露。 java 語言對內存管理做了自己的優化,這就是垃圾回收機制。 java 的幾乎所有內存對象都是在堆內存上分配(基本數據類型除外),然后由 gc ( garbage collection)負責自動回收不再使用的內存。

java內存管理機制

在c++ 語言中,如果需要動態分配一塊內存,程序員需 要負責這塊內存的整個生命周期。從申請分配、到使用、再到***的釋放。這樣的過程非常靈活,但是卻十分繁瑣,程序員很容易由于疏忽而忘記釋放內存,從而導 致內存的泄露。 java 語言對內存管理做了自己的優化,這就是垃圾回收機制。 java 的幾乎所有內存對象都是在堆內存上分配(基本數據類型除外),然后由 gc ( garbage collection)負責自動回收不再使用的內存。

java內存泄露的理解與解決

上面是java 內存管理機制的基本情況。但是如果僅僅理解到這里,我們在實際的項目開發中仍然會遇到內存泄漏的問題。也許有人表示懷疑,既然 java 的垃圾回收機制能夠自動的回收內存,怎么還會出現內存泄漏的情況呢?這個問題,我們需要知道 gc 在什么時候回收內存對象,什么樣的內存對象會被 gc 認為是“不再使用”的。

java 中對內存對象的訪問,使用的是引用的方式。在 java 代碼中我們維護一個內存對象的引用變量,通過這個引用變量的值,我們可以訪問到對應的內存地址中的內存對象空間。在 java 程序中,這個引用變量本身既可以存放堆內存中,又可以放在代碼棧的內存中(與基本數據類型相同)。 gc 線程會從代碼棧中的引用變量開始跟蹤,從而判定哪些內存是正在使用的。如果 gc 線程通過這種方式,無法跟蹤到某一塊堆內存,那么 gc 就認為這塊內存將不再使用了(因為代碼中已經無法訪問這塊內存了)。

通過這種有向圖的內存管理方式,當一個內存對象失去了所有的引用之后,gc 就可以將其回收。反過來說,如果這個對象還存在引用,那么它將不會被 gc 回收,哪怕是 java 虛擬機拋出 outofmemoryerror 。

java內存泄露

一 般來說內存泄漏有兩種情況。一種情況如在c/c++ 語言中的,在堆中的分配的內存,在沒有將其釋放掉的時候,就將所有能訪問這塊內存的方式都刪掉(如指針重新賦值);另一種情況則是在內存對象明明已經不需 要的時候,還仍然保留著這塊內存和它的訪問方式(引用)。***種情況,在 java 中已經由于垃圾回收機制的引入,得到了很好的解決。所以, java 中的內存泄漏,主要指的是第二種情況。

可能光說概念太抽象了,大家可以看一下這樣的例子:

vector v = new vector( 10 ); for ( int i = 1 ;i < 100 ; i ++ ){ object o = new object; v.add(o); o = null ; }

在 這個例子中,代碼棧中存在vector 對象的引用 v 和 object 對象的引用 o 。在 for 循環中,我們不斷的生成新的對象,然后將其添加到 vector 對象中,之后將 o 引用置空。問題是當 o 引用被置空后,如果發生 gc ,我們創建的 object 對象是否能夠被 gc 回收呢?答案是否定的。因為, gc 在跟蹤代碼棧中的引用時,會發現 v 引用,而繼續往下跟蹤,就會發現 v 引用指向的內存空間中又存在指向 object 對象的引用。也就是說盡管 o 引用已經被置空,但是 object 對象仍然存在其他的引用,是可以被訪問到的,所以 gc 無法將其釋放掉。如果在此循環之后, object 對象對程序已經沒有任何作用,那么我們就認為此 java 程序發生了內存泄漏。

盡管對于c/c++ 中的內存泄露情況來說, java 內存泄露導致的破壞性小,除了少數情況會出現程序崩潰的情況外,大多數情況下程序仍然能正常運行。但是,在移動設備對于內存和 cpu都有較嚴格的限制的情況下, java 的內存溢出會導致程序效率低下、占用大量不需要的內存等問題。這將導致整個機器性能變差,嚴重的也會引起拋出 outofmemoryerror ,導致程序崩潰。

一般情況下內存泄漏的避免

在不涉及復雜數據結構的一般情況下,java 的內存泄露表現為一個內存對象的生命周期超出了程序需要它的時間長度。我們有時也將其稱為“對象游離”。

例如:

public class filesearch{ private byte content; private file mfile; public filesearch(file file){ mfile = file; } public boolean hasstring(string str){ int size = getfilesize(mfile); content = new byte [size]; loadfile(mfile, content); string s = new string(content); return s.contains(str); } }

在這段代碼中,filesearch 類中有一個函數 hasstring ,用來判斷文檔中是否含有指定的字符串。流程是先將mfile 加載到內存中,然后進行判斷。但是,這里的問題是,將 content 聲明為了實例變量,而不是本地變量。于是,在此函數返回之后,內存中仍然存在整個文件的數據。而很明顯,這些數據我們后續是不再需要的,這就造成了內存的 無故浪費。

要避免這種情況下的內存泄露,要求我們以c/c++ 的內存管理思維來管理自己分配的內存。***,是在聲明對象引用之前,明確內存對象的有效作用域。在一個函數內有效的內存對象,應該聲明為 local 變量,與類實例生命周期相同的要聲明為實例變量……以此類推。第二,在內存對象不再需要時,記得手動將其引用置空。

復雜數據結構中的內存泄露問題

在 實際的項目中,我們經常用到一些較為復雜的數據結構用于緩存程序運行過程中需要的數據信息。有時,由于數據結構過于復雜,或者我們存在一些特殊的需求(例 如,在內存允許的情況下,盡可能多的緩存信息來提高程序的運行速度等情況),我們很難對數據結構中數據的生命周期作出明確的界定。這個時候,我們可以使用 java 中一種特殊的機制來達到防止內存泄露的目的。

之前我們介紹過,java 的 gc 機制是建立在跟蹤內存的引用機制上的。而在此之前,我們所使用的引用都只是定義一個“ object o; ”這樣形式的。事實上,這只是 java 引用機制中的一種默認情況,除此之外,還有其他的一些引用方式。通過使用這些特殊的引用機制,配合 gc 機制,就可以達到一些我們需要的效果。

 
責任編輯:王雪燕 來源: 站長網
相關推薦

2011-11-17 13:59:41

Java內存管理內存泄露

2009-06-16 11:11:07

Java內存管理Java內存泄漏

2010-09-25 11:23:15

Java內存泄露

2017-05-04 16:07:11

Tomcat內存泄露

2010-10-25 10:10:27

ibmdwJava

2015-12-07 09:39:27

Java內存泄露

2017-02-21 16:40:16

Android垃圾回收內存泄露

2010-08-12 09:30:08

Flex內存泄露

2011-06-16 10:27:55

.NET內存泄漏

2010-07-29 14:08:05

Flex內存泄露

2013-08-07 10:07:07

Handler內存泄露

2018-07-17 08:58:57

垃圾回收內存泄露方法

2013-12-23 09:25:21

2010-09-25 11:32:24

Java內存泄漏

2015-07-16 15:16:41

內存泄露解決辦法

2013-12-17 16:01:02

iOSXcodeInstruments

2010-06-02 13:00:43

Linux 內存監控

2022-08-26 07:33:49

內存JVMEntry

2010-08-10 10:10:34

Flex內存泄露

2017-12-11 11:00:27

內存泄露判斷
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产不卡一区二区三区 | 97精品一区二区 | 亚洲网在线| 欧美极品在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 亚洲国产一区在线 | 久久9视频 | 无人区国产成人久久三区 | 国产精品久久久久久久一区探花 | 中文字幕一区二区三区四区五区 | 中日av | 成人黄色电影在线观看 | 亚洲综合一区二区三区 | 99只有精品| 99久久免费精品国产男女高不卡 | 欧美freesex黑人又粗又大 | 亚洲视频一区在线观看 | 欧美一区二区三区日韩 | 中文字幕欧美一区 | 神马九九| 中文字幕一区二区三区乱码在线 | 久久一区二区三区四区 | 久久91视频| 激情 一区 | 欧洲视频一区二区 | 日韩精品四区 | 最新国产精品 | 在线观看视频91 | 一区二区国产精品 | 激情六月丁香婷婷 | 精品国产乱码久久久久久蜜柚 | 99小视频| 午夜精品福利视频 | 福利片一区二区 | 91偷拍精品一区二区三区 | 国产精品自拍一区 | 久久久久国产精品午夜一区 | 亚洲免费观看视频 | 亚洲国产精品一区在线观看 | 日韩在线免费视频 | 亚洲444eee在线观看 |