jvm內存模型、常見參數及調優


JVM內存結構:

主要分為:方法區、堆、虛擬機棧、本地方法棧、程序計數器,其中方法區和堆是線程共享的,其他的都是線程隔離的。

方法區:

主要存放類的信息、靜態變量、常量、編譯后的方法代碼,永久代PermGen是方法區的實現,JDK1.8后永久代被移除換成了元空間Metaspace,元空間的本質和永久代類似,都是對方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。元空間大小,理論上取決於32/64位系統可虛擬的內存大小。

堆:

唯一用途就是用來存放對象實例,根據對象的存活周期划分為新生代和老年代OldGen,兩者的默認占比為1:2(即新生代:老年代),其中新生代又可以細化為Eden+From Survivor+To Survivor,默認占比為8:1:1

虛擬機棧:

描述了Java方法執行的內存模型,每個方法執行時都會創建一個棧幀,每個方法從調用到執行完的過程就對應着一個棧幀在虛擬機中入棧到出棧的過程。棧幀存儲着局部變量表、操作數棧、動態鏈接、方法返回地址等信息。每一個方法從調用到執行完的過程就對應着一個棧幀在虛擬機中入棧到出棧的過程。

本地方法棧:

與虛擬機棧類似,只是虛擬機服務的對象不同而已,虛擬機棧服務的是Java方法,而本地方法棧服務的是本地方法即native方法。

程序計數器:

用於記錄每條線程當前所執行到的字節碼行號,以便線程切換后能恢復到正確的執行位置。因此每條線程都有獨立的程序計數器,且各線程間互不影響。

 

tomcat調節jvm初始內存大小

windowstomcat的運行文件為catalina.bat,打開文件,在文件中部找到“rem ----- Execute The Requested Command -----”字樣 ,在它后面添加如下內容即可

set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
 
rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=400m -XX:MaxPermSize=700m
echo Using CATALINA_BASE:   "%CATALINA_BASE%"
echo Using CATALINA_HOME2:   "%CATALINA_HOME2%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME:        "%JRE_HOME%"goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME:       "%JAVA_HOME%"
:java_dir_displayed
echo Using CLASSPATH:       "%CLASSPATH%"

 

Eclipse調優:

更改eclipse.ini

做如下更改

當虛擬機進行垃圾回收時會輸出GC日志到gc.log,可以將輸出的gc.log上傳到GC日志在線解析工具https://gceasy.io/進行解析。

 

常見 JVM 參數說明

堆區:
-Xms  初始堆大小,默認是物理內存的1/64
-Xmx  最大堆大小,物理內存的1/4
空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到 -Xms的最小限制
因此服務器一般設置-Xms-Xmx 相等,生產環境建議設為1024m以上
-Xmn  年輕代大小

-XX:NewSize   設置年輕代大小
-XX:MaxNewSize  年輕代最大值

非堆區:
-XX:PermSize   設置持久代(perm gen)初始值(非堆內存初始值),物理內存的1/64
-XX:MaxPermSize   設置持久代最大值(最大非堆內存),物理內存的1/4

 

與垃圾回收相關的JVM參數:

-XX:-DisableExplicitGC — 讓System.gc()不產生任何作用

-XX:+PrintGCDetails — 打印GC的細節

-XX:+PrintGCDateStamps — 打印GC操作的時間戳

-XX:NewRatio — 可以設置老生代和新生代的比例

-XX:PrintTenuringDistribution — 設置每次新生代GC后輸出幸存者樂園中對象年齡的分布

-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設置老年代閥值的初始值和最大值

-XX:TargetSurvivorRatio:設置幸存區的目標使用率

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM