1. 程式人生 > >jvm內存模型、常見參數及調優

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

str 年齡 orm maxperm isp 9.png pac 虛擬機棧 vivo

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:設置幸存區的目標使用率

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