Java中怎么使用JVM實現內存管理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創新互聯公司是一家專業提供金灣企業網站建設,專注與成都做網站、成都網站建設、H5網站設計、小程序制作等業務。10年已為金灣眾多企業、政府機構等服務。創新互聯專業網站設計公司優惠進行中。
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實現內存管理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!
網站欄目:Java中怎么使用JVM實現內存管理
文章鏈接:http://vcdvsql.cn/article12/gghgdc.html
成都網站建設公司_創新互聯,為您提供網頁設計公司、域名注冊、ChatGPT、手機網站建設、用戶體驗、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯