Java虛擬機-JVM特性總結分享(1)

Java虛擬機-JVM特性總結分享(1)

圖1 深入理解java虛擬機封面

大家好!最近第三遍看這本書,頗有心得,自己也算深入的瞭解到了不少知識,從這本書裡提取了自己認為比較重要的知識點分享給大家,還有自己的一些圖例總結。

側重於本書的以下幾章內容:第2章-java內存區域與內存溢出異常第3章-垃圾收集器與垃圾回收策略第6章-類文件結構第7章-虛擬機類加載機制第8章-虛擬機字節碼執行引擎。下圖是我自己繪製的一個圖例,簡單介紹了一下這幾章之間的聯繫:

Java虛擬機-JVM特性總結分享(1)

圖2 主要章節鏈接圖例

從上圖可以看出,這幾個主要章節是有一定的內在聯繫。虛擬機中內存佔用最大的就是堆內存,而對象的實例就存在堆中,所以這部分內存的使用效率最高。java語言是面向對象的,而對象是怎樣來佔用堆中這部分內存的呢?下面內容或者下面幾期我會為大家揭開迷霧!

當然,java虛擬機中不僅僅只有佔用內存還有:java虛擬機棧程序計數器本地方法棧方法區這5類瓜分虛擬機內存。如下圖:

Java虛擬機-JVM特性總結分享(1)

圖3 運行時數據區

如上圖所示,由java虛擬機管理的這五部分數據區域,可分為兩大類:一類是線程共享的,一類是線程私有的。而線程私有的數據區,每一部分的內存和線程的生命週期相同,每個線程之間互不影響,獨立存儲。

線程共享的區域可分為:java堆(佔用的內存最大)、方法區

java堆:在虛擬機啟動時創建,幾乎所有對象的實例都在堆上分配內存。是垃圾收集器管理的主要區域

方法區:主要存儲運行時常量池、常量、靜態變量、已被虛擬機加載的類信息、即時編譯器編譯後的代碼等數據

線程私有的區域可分為:程序計數器、java虛擬機棧、本地方法棧

程序計數器: 存儲當前線程執行的字節碼的行號指示器

java虛擬機棧: 是描述java方法執行的內存模型,每個方法在執行時都會申請一段內存存放方法執行時的數據,稱為棧幀;其包含局部變量、操作數棧、動態鏈接、方法出口等數據。JVM是基於棧的,所以每個方法從開始執行到結束,對應這一個棧幀在虛擬機中入棧到出棧的過程。

下期會接著分享類加載機制~敬請期待!


分享到:


相關文章: