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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员基本功04JAVA的内存回收

發布時間:2023/12/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员基本功04JAVA的内存回收 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀書筆記自己看的(O_O)

1、Java引用的功能和意義

程序員需要通過關鍵字new創建Java對象,即可視作為Java對象申請內存空間,JVM會在堆內存中為每個對象分配空間;當一個Java對象失去引用,Java回收機制會自動清除它們。

2、Java引用與內存回收之間的關系

只要還有引用變量引用該對象,垃圾回收機制就不會回收它。Java對象被創建出來后,垃圾回收機制會實時地監控每一個對象的運行狀態,當垃圾回收機制監控到某一個對象不再被引用變量所引用時,立即回收機制就會回收它所占的空間。

JVM的垃圾回收機制采用有向圖方式管理內存中的對象,可以方便的解決循環引用問題。采用有向圖來管理內存中的對象具有較高的精度,但效率較低。

3、Java對象在內存中的不同狀態

可達狀態:有一個以上的引用變量引用它,程序可以通過引用變量來調用該對象的屬性和方法。

可恢復狀態:程序中的對象不在有程序引用它。它將先進入可恢復狀態,回收機制準備回收該對象所占內存。在回收之前,系統會調用finalize方法進行資源清理,如果系統在調用finalize方法重新讓變量引用該對象,這個對象會變成可達狀態。

不可達狀態:該對象的所有關聯都被切斷,且系統調用finalize方法依然沒有使該對象變成可達狀態,那么該對象將永久性失去引用。

當某個對象被其他類的類變量引用時,只有該類被銷毀后,該對象才會進入可恢復狀態;當某個對象被其他對象的實例變量引用時,只有當引用該對象的對象被銷毀或變成不可達狀態后,該對象才會進入不可達狀態。

程序創建一個對象,并把這個對象賦給一個引用變量,這個就是強引用,JVM不會回收強引用的Java對象,因此強引用是造成內存泄漏的主要原因之一。

4、軟引用的作用和使用軟引用的注意點

軟引用需要通過SoftReferance類來實現,當系統內存空間足夠時,對于只有軟引用的對象而言,它不會被回收,當內存不足時,系統將會回收它。軟引用通常用于內存敏感的程序中,解決內存緊張的難題。

5、弱引用的作用和使用弱引用的注意點

弱引用和軟引用相似,使用WeakReferancd類實現,只是弱引用生存期更短,當垃圾回收機制運行時,不管系統內存夠不夠,總會回收該對象所占內存。

弱引用具有很大的不確定性,因為每次垃圾回收機制執行時都會回收弱引用所引用的對象,而垃圾回收機制不受程序員控制,因此程序獲取弱引用所引用的Java對象時必須小心空指針異常。

6、虛引用的作用和需引用的注意點

虛引用不能單獨使用,必須和引用隊列(ReferenceQueue)聯合使用。虛引用的主要作用是跟蹤對象被垃圾回收的狀態,程序可以通過檢查與虛引用關聯的引用隊列中是否已經包含指定虛引用,從而了解虛引用所引用對象是否即將被回收。

7、Java內存泄漏原因

內存泄漏:程序運行過程中會不斷分配內存空間,哪些不再使用的內存空間應該及時回收它們,從而保證系統能再次使用這些內存,如果存在無用的內存沒有被回收,那就是內存泄漏。

不可達的對象由垃圾回收機制進行回收,如果程序中的一些對象處于可達狀態,但程序永遠都不會訪問它們,那么它們所占的內存也不會被回收,從而造成內存泄漏。

8、Java內存泄漏和C++內存泄漏的差異

對于C++而言,對象占用的內存空間必須由程序員顯示的回收,程序員可在合適的時機釋放它們。但是,Java程序來說,只要它們一直處于可達狀態,垃圾回收機制就不會回收它們。

9、Java內存回收機制的基本算法

垃圾回收機制主要完成倆件事:跟蹤并監控每個Java對象,當某個對象處于不可達狀態時,回收該對象所占的內存;清理內存分配,回收過程中產生的內存碎片。這倆個工作量都不小,因此垃圾回收算法成為限制Java運行效率的重要原因,實現高校JVM的一個重要方面就是提供高校的垃圾回收機制。

JVM垃圾回收機制判斷某個對象是否可以回收的唯一標準是:是否還有其他引用指向該對象。實際上,當一個對象失去引用后,它不會被立即回收,只有等垃圾回收運行時才會被回收。

https://www.cnblogs.com/sunniest/p/4575144.html(垃圾回收算法)

10、堆內存的分代回收

分代回收的策略基于倆點:絕大多數對象不會被長時間引用,這些對象在young代期間就會被回收;很老的對象和很新的對象之間很少存在相互引用的情況。對于young代的對象而言,大部分對象都會很快進入不可達狀態,少數對象能熬到垃圾回收執行時,如果采用復制算法,只需要少量的復制成本,因此大部分垃圾回收器對young代都采用復制算法。

11、Young代、Old代和Permanent代的各自存儲對象

對young代采用復制算法只需遍歷那些處于可達狀態的對象;

old代的垃圾回收具有倆個特征:old代垃圾回收的執行頻率無需太高,因為很少有對象死掉;每次對old代執行垃圾回收需要更長的時間來完成。隨著時間的流逝,old代的對象會越來越多,因此old代的空間比young代空間更大。

12、Young代、Old代和permanent代的特定及適用的回收算法

對young代使用復制算法

對于old代,通常采用標記壓縮算法,這種算法可以避免復制old代的大量對象

垃圾回收機制通常不會回收permanent代中的對象。

13、常見垃圾回收機制對堆內存的回收細節

串行回收器:串行回收器對young代和old代的回收都是串行的,垃圾回收期間程序會暫停,具體策略為,young代采用串行復制算法,old代采用串行標記壓縮算法。系統將Eden中的活動對象直接復制到To區,如果對象占用內存特別大,垃圾回收器會直接將其復制到old中。對于From區的活動對象,如果生存時間長,它將被復制到old代中,否則將被回收到To區中。完成復制后,Eden和From區剩下的均為不可達的對象,由系統直接回收,To區保存了活動對象,在下一次回收時,原To區變為From區,原From區變為To區。

并行回收器:并行回收器對于young代采用與串行回收器基本象失的算發,只是增加了cpu并行能力,即同時啟動多線程并行來執行垃圾回收。并行回收器對于old代采用與串行回收器完全相同的回收算法,采用單線程、標記整理的方式進行回收。

并發壓縮回收器:對于young代,采用與并發回收器完全相同的算法;()

并發標識-清理回收器(CMS):

?

14、設計開發內存管理的小技巧

盡量使用直接量:

使用StringBuilder和StringBuffer進行字符串連接:String代表不可變字符串,而StringBuilder和StringBuffer代表字符序列可變的字符串

盡早釋放無用對象的引用;

盡量少用靜態變量:JVM會將含有靜態變量的類存入到permanent代,這將導致

避免在經常調用的方法、循環中創建Java對象

緩存經常使用的對象:使用HashMap進行緩存,直接使用某些開源的緩存項目

盡量不要使用finalize方法:垃圾回收器本省已經嚴重制約程序性能,如果再使用finalize()進行資源清理,這將導致垃圾回收器負擔更大,效率更差

考慮使用SoftReference:內存夠時,它等同于普通引用,內存不夠時,它會犧牲自己,釋放內存

?

總結

以上是生活随笔為你收集整理的程序员基本功04JAVA的内存回收的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。