JVM體系結構

1 JVM體系結構

JVM_ARGS="-Xmx2g -Xms2g -Xmn1024m -XX:PermSize=256m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedOops -XX:-ReduceInitialCardMarks"


 方法區:存放JVM加載的類型信息。包括: 類型基本信息,常量池,字段信息,方法信息,類變量,指向ClassLoader的引用,Class類的引用,方法表等。

(對應JVM內存配置中的-PermSize等)

 

java:程序中創建的類的實例和數組,包括class對象和exception對象,存放在堆裏面。堆中除了存儲對象的實例數據外,還要存儲該對象指向方法區中類型信息的指針。

JVM中所有的線程共享堆空間,對應JVM內存配置中的-Xms-Xmx等)

java:當JVM創建一個新線程時,都會產生線程計數器(PC Register)和棧。每一次方法調用都會產生棧幀,棧幀中包含局部變量區和操作數棧。

 

JVM中棧被線程獨享,對應JVM內存配置中的-Xss

線程計數器:每個線程擁有自己的程序計數器,它指向下一條指令。當線程調用本地方法的時候, 它爲undefined

 

本地方法棧:當JVM線程調用了本地方法, 則會跳入本地方法棧。本地方法返回後可能再次跳回java方法棧。

 

JVM支持本地方法調用,故JVM佔用的OS內存可能會超出JVM堆內存大小設置,甚至會產生本地內存泄漏)

 

 

附錄1:  heapstack的區別:

    java的內存分爲兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。

    堆是與棧作用不同的內存,一般用於存放不放在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆裏,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。

附錄2: 本地方法

    如果應用程序需要使用系統特性或設備,比如,調用操作系統的API函數,可能使用Java編寫這樣的代碼是非常麻煩甚至是不可能的。在這種情況下,需要調用其他語言(比如C/C++)編寫的代碼,這些代碼被稱爲本地(native)方法或本機方法。

    詳細請參見:http://ajava.org/readbook/java/kfjsdq/4982.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章