JDK 1.8 之前JDK 1.8 之后
主要是方法區的變化
程序計數器(PC)程序計數器是一塊較小的內存空間,可以看作是當前線程所執行的字節碼的行號指示器。字節碼解釋器工作時通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等功能都需要依賴這個計數器來完成。
每條線程都需要有一個獨立的程序計數器,各線程之間計數器互不影響,獨立存儲,我們稱這類內存區域為"線程私有"的內存。
程序計數器主要有兩個作用:
1、字節碼解釋器通過改變程序計數器來依次讀取指令,從而實現代碼的流程控制,如:順序執行、選擇、循環、異常處理。
2、在多線程的情況下,程序計數器用于記錄當前線程執行的位置,從而當線程被切換回來的時候能夠知道該線程上次運行到哪兒了。
注意:程序計數器是唯一一個不會出現 OutOfMemoryError 的內存區域,它的生命周期隨著線程的創建而創建,隨著線程的結束而死亡。
java虛擬機棧每個線程都有自己的Java虛擬機棧,與程序計數器一樣,Java 虛擬機棧也是線程私有的,它的生命周期和線程相同,描述的是 Java 方法執行的內存模型,每次方法調用的數據都是通過棧傳遞的。
如果線程執行了一個方法,就會對這個方法調用創建對應的一個棧幀。棧幀里就有這個方法的局部變量表 、操作數棧、動態鏈接、方法出口等東西。
特點:
1、線程私有
2、棧由一系列幀組成(因此Java棧也叫做幀棧)
3、主要存放了編譯器可知的各種數據類型、對象引用
4、每一次方法調用創建一個幀,并壓棧,調用結束后,都會有一個棧幀被彈出。
java堆1、和程序開發密切相關
2、應用系統對象都保存在Java堆中
Java世界中"幾乎"所有的對象都在堆中分配,但是,隨著JIT編譯期的發展與逃逸分析技術逐漸成熟,棧上分配、變量替換優化技術將會導致一些微妙的變化,所有的對象都分配到堆上也漸漸變得不那么"絕對"了。從jdk1.7開始已經默認開啟逃逸分析,如果某些方法中的對象引用沒有被返回或者未被外面使用(也就是未逃逸出去),那么對象可以直接在棧上分配內存。
3、所有線程共享Java堆
4、GC管理的主要工作區,對分代GC來說,堆是分代的。
分為新生代和老年代;新生代又分為Eden空間、From Survivor(來自幸存者)空間、To Survivor(生還者)空間三部分,后續會進行詳細講解分代之間如何運行的。
方法區(jdk8后是元空間)1、方法區與 Java 堆一樣,是各個線程共享的內存區域
2、保存裝載的類信息:類型的常量池、字段,方法信息、方法字節碼。
3、方法區內會不會進行垃圾回收,除非滿足以下條件:
首先該類的所有實例對象都已經從Java堆內存里被回收。
其次加載這個類的ClassLoader已經被回收
最后對該類的Class對象沒有任何引用
本地方法棧和虛擬機棧所發揮的作用非常相似,區別是: 虛擬機棧為虛擬機執行 Java 方法(也就是字節碼)服務,而本地方法棧則為虛擬機使用到的 Native 方法服務。
本地方法被執行的時候,在本地方法棧也會創建一個棧幀,用于存放該本地方法的局部變量表、操作數棧、動態鏈接、出口信息。
下節講解:JVM中有哪些垃圾回收算法?
本文發布于:2023-02-28 20:14:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167766493882453.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:jdk1.7(jdk1.7安裝教程及環境變量配置).doc
本文 PDF 下載地址:jdk1.7(jdk1.7安裝教程及環境變量配置).pdf
| 留言與評論(共有 0 條評論) |