您好,登錄后才能下訂單哦!
Java中怎么使用JVM實現內存管理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. 查找失效對象
1.1 引用計數法
可以為每一個對象添加一個引用計數器,用于存儲當前對象被幾處引用。
引用計數法簡單高效,但無法解決循環引用問題,如A引用B,B又引用A,且這兩個對象不再被其它對象引用,那么在使用引用計數法的情況下,這兩個對象的引用數均為1,且無法減至0。
1.2 可達性分析算法
可以通過一系列成為“GC Roots”的對象作為起始點,并從這些節點向下搜索,當一個對象到GC Roots不可達,則證明該對象不可用。
圖1-1
GC Roots對象包括下面幾種:
o 虛擬機棧中引用的對象。
o 方法區中類靜態屬性引用的對象。
o 方法區中常量引用的對象。
o 本地方法棧中引用的對象。
一個對象要真正被清理,至少需要兩次標記過程。
1.3 回收方法區
方法區垃圾回收的效率與性價比都遠低于堆內存的回收。
主要回收兩部分:廢棄常量和無用的類。
2. 垃圾收集算法
2.1 標記-清除算法
圖2-1
標記清除算法的標記階段與清除階段效率都不高,且會產生大量內存碎片。
2.2 復制算法
圖2-2
將內存平分為兩塊,每次只使用其中一塊。
當一塊內存快用完時,可將存活的對象復制到另一塊上面,然后將剛才使用的內存一次性清理掉。
該算法簡單高效,且不會產生內存碎片,但由于有一半空閑內存,所以內存使用率不高。
HotSpot中,新生代內存結構為 1 * Eden + 2 * Survivor,每次只使用Eden區和其中一塊Survivor區,當發生回收時,會將Eden與在用的Survivor中的存活對象復制到另一塊Survivor區中。
根據HotSpot的內存結構,可見只有10%的內存(其中一塊Survivor)被浪費,但此時有另一個問題,即實際情況下我們不能保證每次回收的存活對象都僅占內存的10%以下,所以當Survivor也不夠用時,就需要依賴其它內存(老年代)做分配擔保。
2.3 標記-整理算法
在對象存活率高的情況下,復制算法需要進行較多的賦值操作,效率會變低,同時備用空間也是對內存的一種浪費。
對于老年代,可能存在所有對象都存活的情況,所以直接使用復制算法是不合適的,所以出現了標記-整理算法。
圖2-3
看完上述內容,你們掌握Java中怎么使用JVM實現內存管理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。