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
weblogic@localhost ~]$ 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] [间隔时间/毫秒] [查询次数]
[weblogic@localhost ~]$ 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
[weblogic@localhost ~]$ 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
[weblogic@localhost ~]$ jstat -class 29599
Loaded Bytes Unloaded Bytes Time
33005 64573.3 891 1398.0 65.39
[weblogic@localhost ~]$
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)