當前位置:首頁 » 編程語言 » java內存回收

java內存回收

發布時間: 2022-03-03 21:59:02

java語言的內存回收機制是什麼

內存回收機制就是對象沒有引用就會回收
其實Java垃圾回收主要做的是兩件事:1)內存回收 2)碎片整理
垃圾回收演算法
1)串列回收(只用一個CPU)和並行回收(多個CPU才有用):串列回收是不管系統有多少個CPU,始終只用一個CPU來執行垃圾回收操作,而並行回收就是把整個回收工作拆分成多個部分,每個部分由一個CPU負責,從而讓多個CPU並行回收。並行回收的執行效率很高,但復雜度增加,另外也有一些副作用,如內存隨便增加。
2)並發執行和應用程序停止 :應用程序停止(Stop-the-world)顧名思義,其垃圾回收方式在執行垃圾回收的同時會導致應用程序的暫停。並發執行的垃圾回收雖然不會導致應用程序的暫停,但由於並發執行垃圾需要解決和應用程序的執行沖突(應用程序可能在垃圾回收的過程修改對象),因此並發執行垃圾回收的系統開銷比Stop-the-world高,而且執行時需要更多的堆內存。
3)壓縮和不壓縮和復制 :
①支持壓縮的垃圾回收器(標記-壓縮 = 標記清除+壓縮)會把所有的可達對象搬遷到一起,然後將之前佔用的內存全部回收,減少了內存碎片。
②不壓縮的垃圾回收器(標記-清除)要遍歷兩次,第一次先從跟開始訪問所有可達對象,並將他們標記為可達狀態,第二次便利整個內存區域,對未標記可達狀態的對象進行回收處理。這種回收方式不壓縮,不需要額外內存,但要兩次遍歷,會產生碎片
③復制式的垃圾回收器:將堆內存分成兩個相同空間,從根(類似於前面的有向圖起始頂點)開始訪問每一個關聯的可達對象,將空間A的全部可達對象復制到空間B,然後一次性回收空間A。對於該演算法而言,因為只需訪問所有的可達對象,將所有的可達對象復制走之後就直接回收整個空間,完全不用理會不可達對象,所以遍歷空間的成本較小,但需要巨大的復製成本和較多的內存。
看看這個:http://developer.51cto.com/art/201304/387381_1.htm

⑵ java元數據區域如何進行內存回收

方法區不存儲對象,所以方法區是不進行內存回收的,進行內存回收的只有堆中才有,也就是說GC這個概念只是對應堆區,不是對應你所說的元數據區(方法區)

⑶ java堆內存怎樣回收

JVM的一個系統級線程會自動釋放該內存塊。垃圾回收意味著程序不再需要的對象是"無用信息",這些信息將被丟棄。當一個對象不再被引用的時候,內存回收它佔領的空間,以便空間被後來的新對象使用。事實上,除了釋放沒用的對象,垃圾回收也可以清除內存記錄碎片。由於創建對象和垃圾回收器釋放丟棄對象所佔的內存空間,內存會出現碎片。碎片是分配給對象的內存塊之間的空閑內存洞。碎片整理將所佔用的堆內存移到堆的一端,JVM將整理出的內存分配給新的對象。參考資料:http://blog.csdn.net/zsuguangh/article/details/6429592

⑷ java的內存回收機制是什麼呢程序員能自己手動釋放內存么能指定內存釋放時間么

不能手動釋放,內存中沒有引用指向的對象為垃圾,java垃圾回收機制會不定時的收回這些垃圾對象

⑸ Java運行時數據區域中的哪些部分需要進行內存回收什麼時候回收如何回收

java運行時是會有一個java系統本身的GC(內存清理)的線程,只要發現沒有地方用到這塊內存的話就會回收,這塊東西是不需要人為管理的,如果需要一次那就System.gc();這樣調用下,就會主動調用內存清理了。
回收就是把這塊內存清理掉,釋放掉這部分內存。

⑹ java垃圾回收是回收的堆內存還是棧內存

回收的是堆內存;
Java語言規范沒有明確地說明JVM使用哪種垃圾回收演算法,但是任何一種垃圾回收演算法一般要做2件基本的事情:
(1)發現無用信息對象;
(2)回收被無用對象佔用的內存空間,使該空間可被程序再次使用。
大多數垃圾回收演算法使用了根集(root set)這個概念;所謂根集就是正在執行的Java程序可以訪問的引用變數的集合(包括局部變數、參數、類變數),程序可以使用引用變數訪問對象的屬性和調用對象的方法。垃圾回收首先需要確定從根開始哪些是可達的和哪些是不可達的,從根集可達的對象都是活動對象,它們不能作為垃圾被回收,這也包括從根集間接可達的對象。而根集通過任意路徑不可達的對象符合垃圾收集的條件,應該被回收。下面介紹幾個常用的演算法。

⑺ java的垃圾回收機制是否允許程序員指定回收並立即回收不用的內存嗎指定回收就馬上能回收嗎

1. 引用計數器演算法
解釋
系統給每個對象添加一個引用計數器,每當有一個地方引用這個對象的時候,計數器就加1,當引用失效的時候,計數器就減1,在任何一個時刻計數器為0的對象就是不可能被使用的對象,因為沒有任何地方持有這個引用,這時這個對象就被視為內存垃圾,等待被虛擬機回收
優點
客觀的說,引用計數器演算法,他的實現很簡單,判定的效率很高,在大部分情況下這都是相當不錯的演算法
其實,很多案例中都使用了這種演算法,比如 IOS 的Object-C , 微軟的COM技術(用於給window開發驅動,.net裡面的技術幾乎都是建立在COM上的),Python語言等.
缺陷
無法解決循環引用的問題.
這就好像是懸崖邊的人採集草葯的人, 想要活下去就必須要有一根繩子綁在懸崖上. 如果有兩個人, 甲的手拉著懸崖, 乙的手拉著甲, 那麼這兩個人都能活, 但是, 如果甲的手拉著乙, 乙的手也拉著甲, 雖然這兩個人都認為自己被別人拉著, 但是一樣會掉下懸崖.
比如說 A對象的一個屬性引用B,B對象的一個屬性同時引用A A.b = B() B.a = A(); 這個A,B對象的計數器都是1,可是,如果沒有其他任何地方引用A,B對象的時候,A,B對象其實在系統中是無法發揮任何作用的,既然無法發揮作用,那就應該被視作內存垃圾予以清理掉,可是因為此時A,B的計數器的值都是1,虛擬機就無法回收A,B對象,這樣就會造成內存浪費,這在計算機系統中是不可容忍的.
解決辦法
在語言層面處理, 例如Object-C 就使用強弱引用類型來解決問題.強引用計數器加1 ,弱引用不增加
Java中也有強弱引用
2. 可達性分析演算法
解釋
這種演算法通過一系列成為 "GC Roots " 的對象作為起始點,從這些節點開始向下搜索所有走過的路徑成為引用鏈(Reference Chain) , 當一個對象GC Roots沒有任何引用鏈相連(用圖論的話來說就是從GC Roots到這個對象不可達),則證明此對象是不可用的
優點
這個演算法可以輕松的解決循環引用的問題
大部分的主流java虛擬機使用的都是這種演算法
3. Java語言中的GC Roots
在虛擬機棧(其實是棧幀中的本地變數表)中引用的對象
在方法區中的類靜態屬性引用對象
在方法區中的常量引用的對象
在本地方法棧中JNI(即一般說的Native方法)的引用對象

⑻ java 內存回收不了什麼原因

垃圾回收(garbagecollection,簡稱GC)可以自動清空堆中不再使用的對象。垃圾回收機制最早出現於1959年,被用於解決Lisp語言中的問題。垃圾回收是Java的一大特徵。並不是所有的語言都有垃圾回收功能。比如在C/C++中,並沒有垃圾回收的機制。程序員需要手動釋放堆中的內存。由於不需要手動釋放內存,程序員在編程中也可以減少犯錯的機會。利用垃圾回收,程序員可以避免一些指針和內存泄露相關的bug(這一類bug通常很隱蔽)。但另一方面,垃圾回收需要耗費的計算時間。垃圾回收實際上是將原本屬於程序員的責任轉移給計算機。使用垃圾回收的程序需要更長的運行時間。在Java中,對象的是通過引用使用的(把對象相像成致命的毒物,引用就像是用於提取毒物的鑷子)。如果不再有引用指向對象,那麼程序員就再也無從調用或者處理該對象。這樣的對象將不可到達(unreachable)。垃圾回收用於釋放不可到達對象所佔據的內存。這是垃圾回收的基本原則。(不可到達對象是死對象,是垃圾回收所要回收的垃圾)早期的垃圾回收採用引用計數(referencecounting)的機制。每個對象包含一個計數器。當有新的指向該對象的引用時,計數器加1。當引用移除時,計數器減1。當計數器為0時,認為該對象可以進行垃圾回收。然而,一個可能的問題是,如果有兩個對象循環引用(cyclicreference),比如兩個對象互相引用,而且此時沒有其它(指向A或者指向B)的引用,程序員實際上根本無法通過引用到達這兩個對象。因此,程序員以棧和static數據為根(root),從根出發,跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可到達對象引用。

⑼ java回收內存

1、可達性分析
2、引用計數法

⑽ java的內存回收既可以由系統完成也可以由程序員完成嗎

程序員對於GC只有建議權沒有執行權,所以java的內存回收只能由系統完成。

熱點內容
原神過主線任務腳本 發布:2025-01-12 06:34:51 瀏覽:513
醫保電子密碼在哪裡找到 發布:2025-01-12 06:34:38 瀏覽:348
安卓手機有網卻不能使用怎麼辦 發布:2025-01-12 06:25:20 瀏覽:212
arm存儲器映射 發布:2025-01-12 06:25:12 瀏覽:250
安卓系統個人字典有什麼用 發布:2025-01-12 06:13:37 瀏覽:928
geventpython安裝 發布:2025-01-12 06:13:34 瀏覽:339
放鬆解壓助睡眠直播 發布:2025-01-12 06:13:00 瀏覽:829
車載wince和安卓哪個好用 發布:2025-01-12 05:58:18 瀏覽:840
vb6遍歷文件夾 發布:2025-01-12 05:58:13 瀏覽:366
c在C語言中代表什麼 發布:2025-01-12 05:52:59 瀏覽:48