首頁  >  文章  >  Java  >  Java虛擬機器學習 - 體系結構 記憶體模型

Java虛擬機器學習 - 體系結構 記憶體模型

黄舟
黄舟原創
2017-02-17 10:48:291816瀏覽


  • 一:Java技術系統模組圖



1.方法區



也稱"永久代」 、「非堆疊」,  它用於儲存虛擬機器載入的類別資訊、尺寸、各個靜態變數的記憶體區域

。預設最小值為16MB,最大值為64MB,可透過-XX:PermSize 和 -XX:MaxPermSize 參數限制方法區的大小。

運行時常數池:是方法區的一部分,Class檔案中除了有類別的版本、欄位、方法、介面等描述資訊外,還有一項資訊是常數池,用於存放編譯器產生的各種符號引用,這部分內容將在類別載入後放到方法區的執行時間常數池中。

2.虛擬機棧

描述的是java 方法執行的記憶體模型:每個方法被執行的時候都會建立一個「堆疊幀」來儲存局部變數表( )、操作棧、方法出口等資訊。每個方法被呼叫到執行完的過程,就對應一個堆疊幀在虛擬機器棧中從入棧到出棧的過程。宣告週期與執行緒相同,是
線程私有的

 局部變數表存放了編譯器可知的各種基本資料型別(boolean、byte、char、short、int、float、long、double)、物件參考(引用指針,並非物件本身),其中64位元長度的long和double類型的資料會佔用2個局部變數的空間,其餘資料型別只佔1個。局部變數表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在堆疊幀中分配多大的局部變數是完全確定的,在運行期間棧幀不會改變局部變數表的大小空間。

3.本地方法堆疊

 與虛擬機棧基本上類似,區別在於虛擬機棧為虛擬機執行的java方法服務,而本地端方法則為Nativeativeative服務。

4.堆 

也叫做java 堆、GC堆是java虛擬機所管理的記憶體中最大的一塊記憶體區域,也是J時創建。此記憶體區域存放了物件實例及陣列(所有new的物件)。 其大小透過-Xms(最小值)和-Xmx(最大值)參數設置,-Xms為JVM啟動時申請的最小內存,默認為操作系統物理內存的1/64但小於1G, -Xmx為JVM可申請的最大內存,預設為物理內存的1/4但小於1G,默認當空餘堆內存小於40%時,JVM會增大Heap到-Xmx指定的大小,可通過-XX:MinHeapFreeRation=來指定這個比列;當空餘堆記憶體大於70%時,JVM會減少heap的大小到-Xms指定的大小,可透過XX:MaxHeapFreeRation=來指定這個比列,對於運行系統,為避免在運行時頻繁調整Heap的大小,通常-Xms與-Xmx的值設為一樣

由於現在收集器都是採用分代收集演算法,堆被劃分為新生代和老年代。新生代主要儲存新創建的物件和尚未進入老年代的物件。老年代存放經過多次新生代GC(Minor GC)任然存活的對象。

新生代:

 程式新建立的物件都是從新生代分配記憶體,新生代由Eden Space和兩塊相同大小的Survivor From和To)構成,可透過-Xmn參數來指定新生代的大小,也可以透過-XX:SurvivorRation來調整

Eden Space及Survivor Space的大小。

老年代:

年代,主要有兩種情況:①.大對象,可透過啟動參數設定-XX:PretenureSizeThreshold=1024(單位為字節,預設為0)來代表超過多大時就不在新生代分配,而是直接在老年代分配。 ②.大的數組對象,切數組中無引用外部對象。

老年代所佔的記憶體大小為-Xmx對應的值減去-Xmn對應的值。

5.程式計數器 


是最小的一塊記憶體區域,它的作用是

  • 是最小的一塊內存指示器,它的作用是當前虛擬機所執行的字節碼裡,字節碼解釋器工作時就是透過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、異常處理、線程恢復等基礎功能都需要依賴計數器完成。


三:直接記憶體


🎜🎜🎜🎜三:直接記憶體🎜🎜🎜🎜🎜🎜🎜。 jdk1.4中新加入的NIO,引入了通道與緩衝區的IO方式,它可以呼叫Native方法直接分配堆外內存,這個堆外內存就是本機內存,不會影響到堆內存的大小。 🎜🎜🎜 以上就是Java虛擬機器學習 - 體系結構 記憶體模型的內容,更多相關內容請關注PHP中文網(www.php.cn)! 🎜🎜🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn