天天看点

JDK JVM 性能调优监控工具 GC调优

Jinfo

查看正在运行的Java程序的扩展参数

查看JVM的参数

首先我们可以用TOP找到ID,一般也会用TOP简单看下服务器内存 CPU使用情况。

JDK JVM 性能调优监控工具 GC调优

上面我们找到了PID 往下看,

输入:jinfo -flags 29599

JDK JVM 性能调优监控工具 GC调优

可以看到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] [间隔时间/毫秒] [查询次数]

JDK JVM 性能调优监控工具 GC调优
[[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文件中 再打开看看

JDK JVM 性能调优监控工具 GC调优
  • Num:序号
  • Instances:实例数量
  • Bytes:占用空间大小
  • Class Name:类名

-heap  查看堆信息

JDK JVM 性能调优监控工具 GC调优

可以在设置内存溢出的时候自动导出dump文件(项目内存很大的时候,可能会导不出来)

1.-XX:+HeapDumpOnOutOfMemoryError

2.-XX:HeapDumpPath=输出路径

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\oomdump.dump

Jstack

jstack用于生成java虚拟机当前时刻的线程快照。

JDK JVM 性能调优监控工具 GC调优

调优

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)