Jinfo
檢視正在運作的Java程式的擴充參數
檢視JVM的參數
首先我們可以用TOP找到ID,一般也會用TOP簡單看下伺服器記憶體 CPU使用情況。

上面我們找到了PID 往下看,
輸入:jinfo -flags 29599
可以看到JVM參數:複制出來一下
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
-Xms2048m -Xmx2048m -XX:MaxPermSize=512m -Dweblogic.Name=appSrv1 -Djava.security.policy=/app/weblogic/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -Dweblogic.security.SSL.trustedCAKeyStore=/app/weblogic/wlserver_10.3/server/lib/
cacerts -da -Dplatform.home=/app/weblogic/wlserver_10.3 -Dwls.home=/app/weblogic/wlserver_10.3/server -Dweblogic.home=/app/weblogic/wlserver_10.3/server -Dweblogic.management.discover=false -Dweblogic.management.server=http://localhost.localdomain:7001 -Dwlw.iterativeDev=false -Dwlw.testConsole=false -Dwlw.logErrorsToConsole=false -Dweblogic.ext.dirs=/app/weblogic/patch_wls1036/profiles/default/sysext_manifest_classpath
堆棧設定
-Xss:每個線程的棧大小
-Xms:初始堆大小,預設實體記憶體的1/64
-Xmx:最大堆大小,預設實體記憶體的1/4
-Xmn:新生代大小
-XX:NewSize:設定新生代初始大小
-XX:NewRatio:預設2表示新生代占年老代的1/2,占整個堆記憶體的1/3。
-XX:SurvivorRatio:預設8表示一個survivor區占用1/8的Eden記憶體,即1/10的新生代記憶體。
-XX:MetaspaceSize:設定元空間大小
-XX:MaxMetaspaceSize:設定元空間最大允許大小,預設不受限制,JVM Metaspace會進行動态擴充。
檢視java系統屬性
等同于System.getProperties(),還是用上面的ID
[email protected] ~]$ jinfo -sysprops 29599
Attaching to process ID 29599, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
java.vendor = Sun Microsystems Inc.
org.xml.sax.parser = weblogic.xml.jaxp.RegistryParser
sun.java.launcher = SUN_STANDARD
com.sun.xml.ws.api.streaming.XMLStreamReaderFactory.woodstox = true
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.name = Linux
sun.boot.class.path = /app/java6_64/jdk1.6.0_45/jre/lib/resources.jar:/app/java6_64/jdk1.6.0_45/jre/lib/rt.jar:/app/java6_64/jdk1.6.0_45/jre/lib/sunrsasign.jar:/app/java6_64/jdk1.6.0_45/jre/lib/jsse.jar:/app/java6_64/jdk1.6.0_45/jre/lib/jce.jar:/app/java6_64/jdk
1.6.0_45/jre/lib/charsets.jar:/app/java6_64/jdk1.6.0_45/jre/lib/modules/jdk.boot.jar:/app/java6_64/jdk1.6.0_45/jre/classesjava.vm.specification.vendor = Sun Microsystems Inc.
上面是我部分複制的,大家看一下。可以自己去執行看下自己的伺服器資訊。
Jstat
jstat指令可以檢視堆記憶體各部分的使用量,以及加載類的數量。指令格式:
jstat [-指令選項] [vmid] [間隔時間/毫秒] [查詢次數]
[[email protected] ~]$ jstat -gcutil 29599
S0 S1 E O P YGC YGCT FGC FGCT GCT
72.56 0.00 75.63 14.24 99.83 1120 113.917 350 313.490 427.407
[[email protected] ~]$ jstat -gc 29599
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
74752.0 75136.0 54240.1 0.0 548736.0 444597.4 1398144.0 199079.6 231104.0 230718.3 1120 113.917 350 313.490 427.407
[[email protected] ~]$ jstat -class 29599
Loaded Bytes Unloaded Bytes Time
33005 64573.3 891 1398.0 65.39
[[email protected] ~]$
Jmap
可以用來檢視記憶體資訊,儲存到txt檔案中 再打開看看
- Num:序号
- Instances:執行個體數量
- Bytes:占用空間大小
- Class Name:類名
-heap 檢視堆資訊
可以在設定記憶體溢出的時候自動導出dump檔案(項目記憶體很大的時候,可能會導不出來)
1.-XX:+HeapDumpOnOutOfMemoryError
2.-XX:HeapDumpPath=輸出路徑
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\oomdump.dump
Jstack
jstack用于生成java虛拟機目前時刻的線程快照。
調優
JVM調優主要就是調整下面兩個名額
停頓時間:垃圾收集器做垃圾回收中斷應用執行的時間。-XX:MaxGCPauseMillis
吞吐量:垃圾收集的時間和總時間的占比:1/(1+n),吞吐量為1-1/(1+n)。-XX:GCTimeRatio=n
GC調優步驟
1.列印GC日志
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log
Tomcat可以直接加載JAVA_OPTS變量裡
2.分析日志得到關鍵性名額
3.分析GC原因,調優JVM參數
1.Parallel Scavenge收集器(預設)
分析parallel-gc.log
2.配置CMS收集器
-XX:+UseConcMarkSweepGC
分析gc-cms.log
3.配置G1收集器
-XX:+UseG1GC
分析gc-g1.log
young GC:[GC pause (G1 Evacuation Pause)(young)
initial-mark:[GC pause (Metadata GC Threshold)(young)(initial-mark) (參數:InitiatingHeapOccupancyPercent)
mixed GC:[GC pause (G1 Evacuation Pause)(Mixed) (參數:G1HeapWastePercent)
full GC:[Full GC (Allocation Failure)(無可用region)
(G1内部,前面提到的混合GC是非常重要的釋放記憶體機制,它避免了G1出現Region沒有可用的情況,否則就會觸發 FullGC事件。CMS、Parallel、Serial GC都需要通過Full GC去壓縮老年代并在這個過程中掃描整個老年代。G1的Full GC算法和Serial GC收集器完全一緻。當一個Full GC發生時,整個Java堆執行一個完整的壓縮,這樣確定了最大的空餘記憶體可用。G1的Full GC是一個單線程,它可能引起一個長時間的停頓時間,G1的設計目标是減少Full GC,滿足應用性能目标。)
檢視發生MixedGC的門檻值:jinfo -flag InitiatingHeapOccupancyPercent 程序ID
調優:
垃圾回收統計資訊
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
收集器設定
-XX:+UseSerialGC:設定串行收集器
-XX:+UseParallelGC:設定并行收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParalledlOldGC:設定并行老年代收集器
-XX:+UseConcMarkSweepGC:設定CMS并發收集器
-XX:+UseG1GC:設定G1收集器
-XX:ParallelGCThreads:設定用于垃圾回收的線程數
并行收集器設定
-XX:ParallelGCThreads:設定并行收集器收集時使用的CPU數。并行收集線程數。
-XX:MaxGCPauseMillis:設定并行收集最大暫停時間
-XX:GCTimeRatio:設定垃圾回收時間占程式運作時間的百分比。公式為1/(1+n)
CMS收集器設定
-XX:+UseConcMarkSweepGC:設定CMS并發收集器
-XX:+CMSIncrementalMode:設定為增量模式。适用于單CPU情況。
-XX:ParallelGCThreads:設定并發收集器新生代收集方式為并行收集時,使用的CPU數。并行收集線程數。
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次記憶體壓縮
-XX:+CMSClassUnloadingEnabled:允許對類中繼資料進行回收
-XX:UseCMSInitiatingOccupancyOnly:表示隻在到達閥值的時候,才進行CMS回收
-XX:+CMSIncrementalMode:設定為增量模式。适用于單CPU情況
-XX:ParallelCMSThreads:設定CMS的線程數量
-XX:CMSInitiatingOccupancyFraction:設定CMS收集器在老年代空間被使用多少後觸發
-XX:+UseCMSCompactAtFullCollection:設定CMS收集器在完成垃圾收集後是否要進行一次記憶體碎片的整理
G1收集器設定
-XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:指定GC工作的線程數量
-XX:G1HeapRegionSize:指定分區大小(1MB~32MB,且必須是2的幂),預設将整堆劃分為2048個分區
-XX:GCTimeRatio:吞吐量大小,0-100的整數(預設9),值為n則系統将花費不超過1/(1+n)的時間用于垃圾收集
-XX:MaxGCPauseMillis:目标暫停時間(預設200ms)
-XX:G1NewSizePercent:新生代記憶體初始空間(預設整堆5%)
-XX:G1MaxNewSizePercent:新生代記憶體最大空間
-XX:TargetSurvivorRatio:Survivor填充容量(預設50%)
-XX:MaxTenuringThreshold:最大任期門檻值(預設15)
-XX:InitiatingHeapOccupancyPercen:老年代占用空間超過整堆比IHOP門檻值(預設45%),超過則執行混合收集
-XX:G1HeapWastePercent:堆廢物百分比(預設5%)
-XX:G1MixedGCCountTarget:參數混合周期的最大總次數(預設8)