圖 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:? heap
和
stack的區別:
??? java
的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
??? 堆是與棧作用不同的內存,一般用于存放不放在當前方法棧中的那些數據,例如,使用
new
創建的對象都放在堆里,所以,它不會隨方法的結束而消失。方法中的局部變量使用
final
修飾后,放在堆中,而不是棧中。
?
附錄2: 本地方法
??? 如果應用程序需要使用系統特性或設備,比如,調用操作系統的API函數,可能使用Java編寫這樣的代碼是非常麻煩甚至是不可能的。在這種情況下,需要調用其他語言(比如C/C++)編寫的代碼,這些代碼被稱為本地(native)方法或本機方法。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
