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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java gc 可以对方法区进行回收_浅谈 Java 之 GC

發布時間:2024/2/28 java 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java gc 可以对方法区进行回收_浅谈 Java 之 GC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀本文假設你對java內存模型已有一些了解。

1、Java虛擬機中哪些內存需要回收?

先來看看jvm內存模型,如下圖

線程隔離的區域隨線程而生,隨線程而滅;程序計數器可保存著虛擬機字節碼指令的地址(可以看做是當前線程所執行的字節碼的行號指示器);棧中的棧幀(與方法關聯)隨著方法的進入和退出執行壓棧出棧操作。既然每一個棧幀與方法關聯,那每個棧幀分配多少內存基本上在類結構確定下來就已知??梢钥闯鼍€程隔離的區域內存的分配和回收具有確定性,當方法結束或線程結束時,內存自然就進行回收了,不需要我們去考慮回收的問題。而在java堆和方法區來說,一個接口可能有多個實現類,我們只有在程序運行期間才知道創建了哪些對象,也即在運行時動態分配內存,并且是否回收是根據對象是否還可用進行回收判斷的,java的GC關注的就是這部分的內存。

2、什么時候回收?

當對象已經“死亡“(即不可能再被任何途徑使用的對象)。

那么判斷對象是否存活的算法有哪些?

(1)引用計數算法:給對象添加一個引用計數器,每當有一個地方引用它,計數器加1;引用失效時,計數器減1,任何計數器為0的對象就是不可能再被使用的。該算法實現簡單,判斷效率高,但是Java虛擬機里并沒有選用該算法來管理內存,因為該算法很難解決對象相互循環引用問題(相互引用的對象除了它們倆之間沒有其他別的引用)。

(2)可達性分析算法:通過一系列的“GC Roots”作為對象的起點,從這些節點開始向下搜索,搜索走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連(即不可達),則該對象是不可用的。如下圖對象5、6為可回收對象。

在Java中,可作為GC Roots 的對象包括以下:

1) 虛擬機棧(棧幀中的本地變量表)中引用的對象;

2) 方法區中類靜態屬性引用的對象;

3) 方法區中常量引用的對象;

4) 本地方法棧中JNI(Java Native Interface)引用的對象。

但是,請注意,不可達對象并非是“非死不可”,宣告對象“死亡”要經過至少兩次標記過程,沒有引用鏈到達GC Roots標記第一次,并進行篩選,篩選的條件是此對象是否有必要執行finalize()方法。當對象沒有重寫finalize()方法時或finalize()已被虛擬機調用過,虛擬機將這兩種情況視為沒有必要執行。Finalize() 方法是對象自我拯救的最后機會,資源重新與引用鏈上的任何一個對象建立關聯,在第二次標記它將被移除出即將回收的集合。

方法區上的回收時機

垃圾回收包含兩部分內容:廢棄常量和無用的類。

廢棄常量:與java堆對象回收相似,沒有再被任何對象引用,就會被回收;

無用的類:滿足以下條件,即為無用類,可被回收。

1) 該類的所有實例都已經被回收,java堆中不存在該類的任何實例;

2) 加載該類的ClassLoader已經被回收;

3) 該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

3、垃圾回收算法

(1)標記-清除算法:算法分為“標記”和“清除”兩個階段,首先標記出所有要回收的對象,然后統一回收被標記的對象,由于死亡的對象大部分不是連續的,該算法會較多的內存碎片,在下一次對較大對象分配內存時可能會因為無法分配足夠大的連續空間而再次進行垃圾回收;

(2)復制算法:將內存進行分區,一塊區域用完就進行垃圾回收,把存活對象復制到另一塊區域,然后清空原來區域。在新生代中就是使用復制算法,把內存以8:1:1分配,分別稱為Eden,From Survivor,To Survivor,至于為什么要8:1:1分配,可以參考以下兩個鏈接

(3)標記-整理算法:與標記清理相似,但后續不是直接清理而是先移到一端后在進行清理,避免了該內存里的內存碎片產生。

(4)分代回收算法:新生代使用復制算法,老年代使用標記-整理算法

書暫時看到這部分,下次再來講講垃圾回收算法在jvm的基本實現及具體的垃圾回收器。

來源:https://www.cnblogs.com/X-huang/p/10811723.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的java gc 可以对方法区进行回收_浅谈 Java 之 GC的全部內容,希望文章能夠幫你解決所遇到的問題。

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