国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制

這篇具有很好參考價值的文章主要介紹了【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

JVM,就是Java虛擬機,Java的的程序都是運行在JVM當中。

JVM執(zhí)行流程

程序在執(zhí)行之前先要把java源代碼轉換成字節(jié)碼(class文件),JVM 首先需要把字節(jié)碼通過一定的方(類加載器(ClassLoader)) 把文件加載到內存中的運行時數據區(qū)(Runtime Data Area) ,而字節(jié)碼文件是 JVM 的一套指令集規(guī)范,并不能直接交個底層操作系統去執(zhí)行,因此需要特定的命令解析器 執(zhí)行引擎(Execution Engine)將字節(jié)碼翻譯成底層系統指令再交由CPU去執(zhí)行,而這個過程中需要調用其他語言的接口(本地庫接口(Native Interface))來實現整個程序的功能。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

執(zhí)行引擎

將Java字節(jié)碼轉換成CPU指令。

本地方法接口

調用不同系統的API實現不同的功能。

運行時數據區(qū)

方法區(qū)

方法區(qū)中存放的是類對象,可以理解為模板。在《Java虛擬機規(guī)范中》把此區(qū)域稱之為“方法區(qū)”,而在 HotSpot 虛擬機的實現中,在 JDK 7 時此區(qū)域叫做永久代(PermGen),JDK 8 中叫做元空間(Metaspace)。運行時常量池是方法區(qū)的一部分,存放字面量與符號引用。

JDK 1.8 元空間的變化
1.對于現在使用最最廣泛的 HotSpot 來說,JDK 8 元空間的內存屬于本地內存,這樣元空間的大小就不在受 JVM 最大內存的參數影響了,而是與本地內存的大小有關。
2.JDK 8 中將字符串常量池移動到了堆中。

堆中存放的是new出來的具體對象。堆區(qū)和方法區(qū)之間是內存共享的:多個線程都可以去new對象,那么必須從方法區(qū)中拿對象的模板;每個線程創(chuàng)建出來的對象都會放在堆中。

虛擬機棧(線程私有)

棧主要記錄的是 方法的調用關系和可能出現的棧溢出錯誤。 每一個線程都有對應的一個Java虛擬機棧,每調用一個方法都會以一個棧幀的形式加入到線程的棧中,方法執(zhí)行完成之后棧幀就會被調出棧。此時可能存在一種情況,在遞歸調用時,調用的深度過深可能會出現棧溢出的錯誤。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

  1. 局部變量表: 存放了編譯器可知的各種基本數據類型(8大基本數據類型)、對象引用。局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在執(zhí)行期間不會改變局部變量表大小。簡單來說就是存放方法參數和局部變量。
  2. 操作棧:每個方法會生成一個先進后出的操作棧。
  3. 動態(tài)連接:指向運行時常量池的方法引用。
  4. 方法返回地址:PC 寄存器的地址。

什么是線程私有?
由于JVM的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現,因此在任何一個確定的時刻,一個處理器(多核處理器則指的是一個內核)都只會執(zhí)行一條線程中的指令。因此為了切換線程后能恢復到正確的執(zhí)行位置,每條線程都需要獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。我們就把類似這類區(qū)域稱之為"線程私有"的內存

本地方法棧(線程私有)

工作原理和Java虛擬機棧一樣,記錄的是本地方法的調用關系。

程序計數器(線程私有)

記錄了當前線程的方法執(zhí)行到了那一行(指令)。程序計數器是一塊比較小的內存空間,可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器。如果當前線程正在執(zhí)行的是一個Java方法,這個計數器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果正在執(zhí)行的是一個Native方法,這個計數器值為空。

堆溢出問題

Java堆用于存儲對象實例,不斷的創(chuàng)建對象,就可能會在對象數量達到最大堆容量后就會產生內存溢出。
演示堆溢出現象:
設置JVM參數-Xms:設置堆的最小值、-Xmx:設置堆最大值。

public class HeapDemo {
    static class OOMObject {}

    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<>();

        // 不停的為list添加元素
        while (true) {
            list.add(new OOMObject());

        }
    }
}

【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
當出現"Java heap space"則很明確的告知我們,OOM發(fā)生在堆上,此時堆內存被占滿。此時需要優(yōu)化堆內存的大?。ㄍㄟ^調整-Xss參數來)來避免這個錯誤。

類加載

類加載的過程

對于一個類來說,它的生命周期是這樣的:

【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

加載

加載就是讀取.class文件。
1)通過一個類的全限定名來獲取定義此類的二進制字節(jié)流。
2)將這個字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數據結構。
3)在內存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數據的訪問入口。

連接

驗證

這一階段的目的是確保Class文件的字節(jié)流中包含的信息符合《Java虛擬機規(guī)范》的全部約束要求,保證這些信 息被當作代碼運行后不會危害虛擬機自身的安全。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

準備

準備階段是正式為類中定義的變量(即靜態(tài)變量,被static修飾的變量)分配內存并設置類變量初始值的階段。比如此時有這樣一行代碼:public static int value = 123;它是初始化 value 的 int 值為 0,而非 123。

解析

解析階段是Java 虛擬機將常量池內的符號引用替換為直接引用的過程,也就是初始化常量的過程。

初始化

初始化階段,Java 虛擬機真正開始執(zhí)行類中編寫的Java 代碼,將控制權移交給應用程序。初始化階段就是執(zhí)行類構造器方法的過程。

雙親委派機制

如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父
類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟
動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)
時,子加載器才會嘗試自己去完成加載。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
1.BootStrap:啟動類加載器:加載 JDK 中 lib 目錄中 Java 的核心類庫,即$JAVA_HOME/lib目錄。 擴展類加載器。加載 lib/ext 目錄下的類。
2.ExtClassLoader: 擴展類加載器,加載lib/ext目錄下的類;
3.AppClassLoader:應用程序類加載器;
4.自定義加載器:根據自己的需求定制類加載器;

垃圾回收

public class GCDemo {
    public static void main(String[] args) {
        test();
    }

    private static void test() {
        Student student = new Student();
        System.out.println(student);
    }
}

對于上述這個實例,當test執(zhí)行完成之后,就不會再使用了,所以對于這種無效的對象,將會被當作垃圾回收掉。如何標記這個對象是垃圾?

死亡對象的判斷算法

引用計數算法

給對象增加一個引用計數器,每當有一個地方引用它時,計數器就+1;當引用失效時,計數器就-1;任
何時刻計數器為0的對象就是不能再被使用的,即對象已"死”。
但是,在主流的JVM中沒有選用引用計數法來管理內存,最主要的原因就是引用計數法無法解決對象的
循環(huán)引用問題

public class GCDemo01 {
    public Object instance = null;
    private static int _1MB = 1024 * 1024;
    private byte[] bigSize = new byte[2 * _1MB];
    public static void testGC() {
        GCDemo01 test1 = new GCDemo01();
        GCDemo01 test2 = new GCDemo01();
        test1.instance = test2;
        test2.instance = test1;
        test1 = null;
        test2 = null;
        // 強制jvm進行垃圾回收
        System.gc();
    }
    public static void main(String[] args) {
        testGC();
    }
}

比如上述代碼,當test1=null;test=null時,那么test1和test2中的instance再也無法訪問到,所以此時堆中對象的引用計數無法歸零,導致無法垃圾回收。

可達性分析算法

通過一系列稱為"GC Roots"的對象作為起始點,從這些節(jié)點開始向下搜索,搜索走過的路徑稱之為"引用鏈",當一個對象到GC Roots沒有任何的引用鏈相連時(從GC Roots到這個對象不可達)時,證明此對象是不可用的。Java中就采用了"可達性分析"來判斷對象是否存活。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
在Java語言中,可作為GC Roots的對象包含下面幾種:
1.虛擬機棧(棧幀中的本地變量表)中引用的對象;
2.方法區(qū)中類靜態(tài)屬性引用的對象;
3.方法區(qū)中常量引用的對象;
4.本地方法棧中 JNI(Native方法)引用的對象。

從上面我們可以看出“引用”的功能,除了最早我們使用它(引用)來查找對象,現在我們還可以使用“引用”來判斷死亡對象了。所以在 JDK1.2 時,Java 對引用的概念做了擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference)四種,這四種引用的強度依次遞減。

1.強引用:類似于Student student = new Student()這種引用,會經歷正常的GC,判定為死亡時會被回收;
2.軟引用:軟引用是用來描述一些還有用但是不是必須的對象,當系統內存不夠或者觸發(fā)閾值時會被回收;
3.弱引用:弱引用也是用來描述非必需對象的。在每次新生代GC時都會回收弱引用;
4.虛引用:只是在對象被回收時,收到一個通知。

垃圾回收的過程

通過上面的學習可以將死亡對象在堆中標記出來,標記出來之后就可以進行垃圾回收操作。先來看一下堆的結構:
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
HotSpot默認新生代與老年代的比例是1:2,新生代中Eden區(qū)與Survivor區(qū)的大小比例是8:1,也就是說Eden:Survivor From(S0):Survivor To(S1)=8:1:1。所有新new出來的對象全都在Eden區(qū)。每次新生代可用內存空間為整個新生代容量的90%,而剩下的10%用來存放回收后存活的對象。

回收過程如下:
1.當Eden區(qū)滿的時候會觸發(fā)第一次Minor gc,把還活著的對象拷貝到Survivor From區(qū);當Eden區(qū)再次觸發(fā)Minor gc的時候會掃描Eden區(qū)和From區(qū)域對兩個區(qū)域進行垃圾回收。經過這次回收后還存活的對象則直接復制到To區(qū)域并將Eden和From區(qū)域清空。
2.當后續(xù)Eden又發(fā)生Minor gc的時候會對Eden和To區(qū)域進行垃圾回收存活的對象復制到From區(qū)域并將Eden和To區(qū)域清空。
3.部分對象會在From和To區(qū)域中來回復制,如此交換15次(由JVM參數MaxTen),最終如果還存活就將其放到老年代中。

新生代:一般創(chuàng)建的對象都會進入新生代;
老年代:大對象和經歷了N次(默認值是15)垃圾回收依然存活下來的對象會從新生代移動到老年代。

新生代的GC稱為Minor GC ,老年代的GC稱為Full GC或Major GC。

每次進行垃圾回收的時候,程序都會進入暫停狀態(tài)(STW),STOP THE WORLD。 為了高效的掃描內存區(qū)域,縮短程序暫停的時間,有一系列的垃圾回收算法。

標記-清除算法

"標記-清除"算法是最基礎的收集算法。算法分為"標記"和"清除"兩個階段 : 首先標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象。
"標記-清除"算法的不足主要有兩個 :
1.效率問題 : 標記和清除這兩個過程的效率都不高
2.空間問題 : 標記清除后會產生大量不連續(xù)的內存碎片,空間碎片太多可能會導致以后在程序運行中
需要分配較大對象時,無法找到足夠連續(xù)內存而不得不提前觸發(fā)另一次垃圾收集。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

復制算法

"復制"算法是為了解決"標記-清理"的效率問題。它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這塊內存需要進行垃圾回收時,會將此區(qū)域還存活著的對象復制到另一塊上面,然后再把已經使用過的內存區(qū)域一次清理掉。這樣做的好處是每次都是對整個半區(qū)進行內存回收,內存分配時也就不需要考慮內存碎片等復雜情況,只需要移動堆頂指針,按順序分配即可。HotSpot在S0和S1區(qū)使用的就是這種算法
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

標記-整理算法

"標記-整理算法"主要應用于老年代。標記過程仍與"標記-清除"過程一致,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活對象都向一端移動,然后直接清理掉端邊界以外的內存。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
缺點是在回收之后多了一步整理內存的工作;優(yōu)點是可以有大量連續(xù)的內存空間。

在新生代中,每次垃圾回收都有大批對象死去,只有少量存活,因此采用復制算法;而老年代中對象存活率高、沒有額外空間對它進行分配擔保,就必須采用"標記-整理"算法。

垃圾收集器

垃圾收集算法是內存回收的方法論,而垃圾收集器就是內存回收的具體實現。垃圾收集器的作用:垃圾收集器是為了保證程序能夠正常、持久運行的一種技術,它是將程序中不用的死亡對象也就是垃圾對象進行清除,從而保證了新對象能夠正常申請到內存空間。垃圾收集器的不斷更新就是為了減少STW。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

Serial

Serial 收集器是最基本、發(fā)展歷史最悠久的串行GC收集器。它是一個單線程的收集器,但它的“單線程”的意義并不僅僅說明它只會使用一個CPU或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

ParNew

ParNew是對Serial優(yōu)化了的并行GC。用多線程的方式掃描內存,提高垃圾回收的效率,減少STW的時間。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

Parallel Scavenge

Parallel Scavenge收集器是一個新生代收集器,它也是使用復制算法的收集器,又是并行的多線程收集器。
與前面的區(qū)別在于,它采用了GC自適應的調節(jié)策略:

Parallel Scavenge收集器有一個參數- XX:+UseAdaptiveSizePolicy 。當這個參數打開之后,就不需要手工指定新生代的大小、Eden與Survivor區(qū)的比例、晉升老年代對象年齡等細節(jié)參數了, 虛擬機會根據當前系統的運行情況收集性能監(jiān)控信息,動態(tài)調整這些參數以提供最合適的停頓時間或者最大的吞吐量。

Serial Old

Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用標記-整理算法。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

Parallel Old

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。

CMS

CMS是一種老年代并發(fā)GC。 與之前的方法不同的是,它使用了三色標記算法。它的運作過程相對于前面幾種收集器來說更復雜一些,整個過程分為4個步驟:初始標記(CMS initial mark)、并發(fā)標記(CMS concurrent mark)、重新標記(CMS remark)、并發(fā)清除(CMS concurrent sweep)。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言

G1

G1(Garbage First)垃圾回收器是用在heap memory很大的情況下,在內存區(qū)域的劃分上不再像之前的新生代和老年代一樣,而是把heap劃分為很多很多的region塊,然后并行的對其進行垃圾回收,從而提高效率。
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言
圖中一個region有可能屬于Eden,Survivor或者Tenured內存區(qū)域。圖中的E表示該region屬于Eden內存區(qū)
域,S表示屬于Survivor內存區(qū)域,T表示屬于Tenured內存區(qū)域。圖中空白的表示未使用的內存空間。
G1垃圾收集器還增加了一種新的內存區(qū)域,叫做Humongous(大對象)內存區(qū)域,如圖中的H塊。這種內存區(qū)域主要用于存儲大對象-即大小超過一個region大小的50%的對象。

1.年輕代
在G1垃圾收集器中,年輕代的垃圾回收過程使用復制算法。把Eden區(qū)和Survivor區(qū)的對象復制到新的Survivor區(qū)域。

2.老年代
對于老年代上的垃圾收集,G1垃圾收集器也分為4個階段,基本跟CMS垃圾收集器一樣。

一個對象的一生
我是一個普通的 Java 對象,我出生在 Eden 區(qū),在 Eden 區(qū)我還看到和我長的很像的小兄弟,我們在 Eden 區(qū)中玩了挺長時間。有一天Eden區(qū)中的人實在是太多了,我就被迫去了 Survivor 區(qū)的 “From” 區(qū)(S0 區(qū)),自從去了 Survivor 區(qū),我就開始漂了,有時候在 Survivor 的 “From” 區(qū),有時候在 Survivor 的 “To” 區(qū)(S1 區(qū)),居無定所。直到我 18 歲的時候,爸爸說我成人了,該去社會上闖闖了。于是我就去了年老代那邊,年老代里,人很多,并且年齡都挺大的,我在這里也認識了很多人。在老年代里,我生活了很多年(每次GC加一歲)然后被回收了。


繼續(xù)加油~
【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制,JavaEE初階,java,jvm,java-ee,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-562851.html

到了這里,關于【Java】JVM執(zhí)行流程、類加載過程和垃圾回收機制的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • JVM解密: 解構類加載與GC垃圾回收機制

    JVM解密: 解構類加載與GC垃圾回收機制

    JVM 其實是一個 Java 進程,該進程會從操作系統中申請一大塊內存區(qū)域,提供給 Java 代碼使用,申請的內存區(qū)域會進一步做出劃分,給出不同的用途。 其中最核心的是棧,堆,方法區(qū)這幾個區(qū)域: 堆,用來放置 new 出來的對象,類成員變量。 棧,維護方法之間的調用關系,放

    2024年02月10日
    瀏覽(24)
  • 【Java虛擬機】JVM垃圾回收機制和常見回收算法原理

    【Java虛擬機】JVM垃圾回收機制和常見回收算法原理

    1.垃圾回收機制 (1)什么是垃圾回收機制(Garbage Collection, 簡稱GC) 指自動管理動態(tài)分配的內存空間的機制,自動回收不再使用的內存,以避免內存泄漏和內存溢出的問題 最早是在1960年代提出的,程序員需要手動管理內存的分配和釋放 這往往會導致內存泄漏和內存溢出等問

    2024年02月02日
    瀏覽(37)
  • JVM及垃圾回收機制

    JVM及垃圾回收機制

    類加載器負責將.class文件加載到JVM中。主要分為三種層次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它們按層次關系加載類,保證類的隔離性和重用性。 運行時數據區(qū)包括方法區(qū)、堆、棧、本地方法棧和程序計數器。堆用于存放對象實例,方法區(qū)保存類信息和

    2024年02月12日
    瀏覽(15)
  • 【JVM】垃圾回收機制

    【JVM】垃圾回收機制

    ?哈嘍,哈嘍,大家好~ 我是你們的老朋友: 保護小周? ?? 今天給大家?guī)淼氖??JVM (Java 虛擬機) 的垃圾回收機制,回收是指回收什么?? 如何確定要回收的內存: 引用計數,可達性分析,如何釋放空間 : 標記清除,復制算法,標記整理,分代回收 ,一起來看看叭~ 本期

    2024年02月09日
    瀏覽(21)
  • 淺談JVM垃圾回收機制

    新生代收集(Minor GC/Young GC):只對新生代進行垃圾收集 老年代收集(Major GC/Old GC):只隊老年代進行垃圾收集 混合收集(Mixed GC):對整個新生代和老年代進行垃圾收集 收集整個Java堆和方法區(qū) 空間分配擔保是為了確保在Minor GC之前老年代還有容納新生代所有對象的剩余空間 垃圾回收算

    2024年02月10日
    瀏覽(20)
  • JVM基礎(3)——JVM垃圾回收機制

    JVM基礎(3)——JVM垃圾回收機制

    作者簡介:大家好,我是smart哥,前中興通訊、美團架構師,現某互聯網公司CTO 聯系qq:184480602,加我進群,大家一起學習,一起進步,一起對抗互聯網寒冬 學習必須往深處挖,挖的越深,基礎越扎實! 階段1、深入多線程 階段2、深入多線程設計模式 階段3、深入juc源碼解析

    2024年01月25日
    瀏覽(19)
  • java面經03-虛擬機篇-jvm內存結構&垃圾回收、內存溢出&類加載、引用&悲觀鎖&HashTable、引用&finalize

    java面經03-虛擬機篇-jvm內存結構&垃圾回收、內存溢出&類加載、引用&悲觀鎖&HashTable、引用&finalize

    要求 掌握 JVM 內存結構劃分 尤其要知道方法區(qū)、永久代、元空間的關系 結合一段 java 代碼的執(zhí)行理解內存劃分 執(zhí)行 javac 命令編譯源代碼為字節(jié)碼 執(zhí)行 java 命令 創(chuàng)建 JVM,調用類加載子系統加載 class,將類的信息存入 方法區(qū) 創(chuàng)建 main 線程,使用的內存區(qū)域是 JVM 虛擬機棧 ,

    2024年02月09日
    瀏覽(22)
  • JVM——類加載和垃圾回收

    JVM——類加載和垃圾回收

    目錄 前言 JVM簡介 JVM內存區(qū)域劃分 JVM的類加載機制 1.加載 雙親委派模型 2.驗證 驗證選項 3.準備 4.解析 5.初始化 觸發(fā)類加載 JVM的垃圾回收策略 GC 一:找? ? ?誰是垃圾? 1.引用計數 2.可達性分析? (這個方案是Java采取的方案)。 二:釋放垃圾對象 三種典型的策略 JVM實現思

    2024年02月16日
    瀏覽(20)
  • JVM中的垃圾回收機制

    JVM中的垃圾回收機制

    java相較于c、c++語言的優(yōu)勢之一是自帶垃圾回收器,垃圾回收是指 不定時 去堆內存中清理 不可達 對象。不可達的對象并不會 馬上 就會直接回收, 垃圾收集器在一個Java程序中的執(zhí)行是自動的,不能強制執(zhí)行,程序員唯一能做的就是通過調用System.gc 方法來建議執(zhí)行垃圾收集

    2024年02月16日
    瀏覽(69)
  • JVM:垃圾回收機制(GC)

    JVM:垃圾回收機制(GC)

    引用計數算法: ? ? ? ? 在對象中添加一個引用計數器,當每有一個地方引用它時,計數器值加一。當引用失效時,計數器值就減一。當一個對象的計數器為零時,表示該對象沒有被任何其他對象引用,因此可以被釋放。 優(yōu)點 :是可以及時回收垃圾對象,避免內存泄漏,且

    2024年01月19日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包