73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令
73.JVM內存基礎結構,參數分類,推薦的配置項,參數混用問題,常用工具,常用命令
73.1.堆內存基本結構
73.2.參數分類
73.3.推薦的配置項
73.4.參數混用問題
73.5.常用命令
73.JVM內存基礎結構,參數分類,推薦的配置項,參數混用問題,常用工具,常用命令
73.1.堆內存基本結構
注:以下內容無特殊說明都是jdk7 hotspot虛擬機環境下的配置。
73.2.參數分類
JVM啟動參數共分為三類:
1、標準參數(-),所有的JVM實現都必須實現這些參數的功能,而且向后兼容。例如: -verbose:gc(輸出每次GC的相關情況);-verbose:jni(輸出native方法調用的相關情況,一般用于診斷jni調用錯誤信息)。
2、非標準參數(-X),默認jvm實現這些參數的功能,但是并不保證所有jvm實現都滿足,且不保證向后兼容。例如:-Xms512m;-Xmx512m;-Xmn200m;-Xss128k;-Xloggc:file(與-verbose:gc功能類似,只是將每次GC事件的相關情況記錄到一個文件中,文件的位置最好在本地,以避免網絡的潛在問題。若與verbose命令同時出現在命令行中,則以-Xloggc為準)。
3、非Stable(穩態)參數(-XX),此類參數各個jvm實現會有所不同,將來可能會隨時取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。
非穩態選項使用說明:
-XX:+ 啟用option
-XX:- 不啟用option
-XX:= 設定option的值為數字類型,可跟單位,例如 32k, 1024m, 2g
-XX:= 設定option的值為字符串,例如-XX:HeapDumpPath=./dump.core
73.3.推薦的配置項
生產庫tomcat/bin/catalina.sh統一配置
JAVA_OPTS=" #堆內存各區域大小配置 -Xms2048m #初始堆大小,與Xmx配置一樣避免內存申請帶來的資源消耗 -Xmx2048m #堆最大容量 -Xss256k #每個線程的堆棧大小,不占用堆空間,jdk5之前默認為256k之后為1M #Xmn通常占整個堆大小的3/10,-XX:NewRatio=年輕代:年老代,-XX:NewSize/-XX:MaxNewSize,看值是否合適可以執行GC看老年代回收的空間是否比較多,可以調整年輕代大小和對象進入老年代年齡大小(-XX:InitialTenuringThreshold=7, -XX:MaxTenuringThreshold=15(7和15也是默認值))進行設置 -Xmn680m -XX:SurvivorRatio=8 #s0+s1:eden 配置成8也就是2:8 一個s0占1/10新生代大小,默認8 -XX:PermSize=256m #永久代即代碼和類結構存儲區初始大小,默認64m -XX:MaxPermSize=256m #jdk8廢除永久代新增元空間,類加載器不用時移除所用所有空間 -XX:MetaspaceSize=12M -XX:MaxMetaspaceSize=36M -XX:-UseAdaptiveSizePolicy #禁用jvm自動調整內存比例,jdk1.6、1.7下會導致每經過一次minor GC Survivor區會減少大概1M空間(減少部分累加到eden區域)直至降至1M導致一直進行垃圾回收CPU 100%運行#OOM(OutOfMemeoryError)配置 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/work/tomcat/jvmlogs/oomDump.dump -XX:OnOutOfMemoryError=/usr/local/tomcat/bin/restart.sh #當內存溢出發生時執行一個腳本 #GC日志配置 -XX:+PrintGCDetails -XX:+PrintGCDateStamps #輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800) -XX:+PrintHeapAtGC #在進行GC的前后打印出堆的信息 -XX:+PrintTenuringDistribution #打印年輕代存活年齡 例:- age 2: 2436856 bytes, 6782256 total,對于XX:MaxTenuringThreshold值設置有很大參考價值 -Xloggc:/usr/local/work/tomcat3/logs/jvmgc.log #GC日志文件路徑 #日志格式 #Jconsole遠程調試配置,調試期間開啟(生產庫請勿長期開啟) -Djava.rmi.server.hostname=112.124.121.127 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8899 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "73.4.參數混用問題
-Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3組參數都可以影響年輕代的大小,混合使用的情況下,優先級是什么?
如下:
高優先級:-XX:NewSize/-XX:MaxNewSize
中優先級:-Xmn(默認等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?)
低優先級:-XX:NewRatio
推薦使用-Xmn參數,原因是這個參數簡潔,相當于一次設定 NewSize/MaxNewSIze,而且兩者相等,適用于生產環境。-Xmn 配合 -Xms/-Xmx,即可將堆內存布局完成。
73.5.常用命令
jmap -heap pid
jps -v 查看當前運行的java進程類似ps -ef|grep java
jcmd PID VM.flags 查看JVM的啟動參數
jcmd pid VM.system_properties 顯示系統信息
jcmd pid GC.run 手動執行一次Full GC,功能類似直接調用java.lang.System.gc()
jcmd pid GC.heap_dump /usr/local/dump.hprof 導出HPROF格式的內存信息,保存到文件中。
jcmd pid Thread.print 這里和jstack -l pid的效果是一樣的。
jcmd PID GC.class_histogram 查看類及對象數量和大小統計信息,類似jmap -histo pid
總結
以上是生活随笔為你收集整理的73.JVM内存基础结构,参数分类,推荐的配置项,参数混用问题,常用工具,常用命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外地车在南京路边停车被贴单子,本地车不贴
- 下一篇: 75. CPU 100%运行实战案例分析