Skip to main content

常用配置及命令

相关配置#

1. 常用配置#

  1. -XX:+PrintGCDetails -Xloggc:filepath 配置gc日志路径
  2. -Xmx1024m 最大堆大小
  3. -Xms100m 初始堆大小
  4. -XX:SurvivorRatio=x eden:survivor(x:2)
  5. -XX:NewRatio=x old:new(x:1)
  6. -XX:MaxTenuringThreshold=n 对象在新生代存活的最大次数
  7. -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 开启CMS GC (Yong 使用Parallel GC)
  8. -XX:+UseG1GC -XX:MaxGCPauseMillis=200 开启G1收集器 MaxGCPauseMillis表示最大停顿时间

2. 开启jmx远程控制#

-Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=port -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

常用命令#

列出正在运行的虚拟机进程#

jps -l or jcmd -l

打印线程信息#

jstack -l <pid>

jstack -l pic | grep threadId(16进制)#

"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f447c145800 nid=0x34d9 in Object.wait() [0x00007f4467bfa000]   java.lang.Thread.State: WAITING (on object monitor)        at java.lang.Object.wait(Native Method)        at java.lang.Object.wait(Object.java:502)        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)        - locked `<0x00000000e0014800>` (a java.lang.ref.Reference$Lock)        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
   Locked ownable synchronizers:        - None

jmap <pid>#

(1). jmap -heap 13522 查询堆栈相关信息#

using thread-local object allocation.Parallel GC with 4 thread(s)   # gc回收方式Heap Configuration:   #堆内存初始化配置   MinHeapFreeRatio         = 0  #对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率   MaxHeapFreeRatio         = 100 #对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率   MaxHeapSize              = 536870912 (512.0MB) #对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小   NewSize                  = 178782208 (170.5MB) #对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小   MaxNewSize               = 178782208 (170.5MB) #对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小   OldSize                  = 358088704 (341.5MB) #对应jvm启动参数   NewRatio                 = 2 #对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率   SurvivorRatio            = 8 #对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值   MetaspaceSize            = 21807104 (20.796875MB) #对应jvm1.8启动参数-XX:MetaspaceSize= 代替'永久代'Permsize [jvm内存模型中方法区]   CompressedClassSpaceSize = 1073741824 (1024.0MB) #对应jvm1.8启动参数XX:CompressedClassSpaceSize= 在出现java.lang.OutOfMemoryError: Compressed class space可以调整此参数,可能是jar包引用过多    MaxMetaspaceSize         = 17592186044415 MB  #对应jvm1.8启动参数-XX:MaxMetaspaceSize 代替'永久代'MaxPermSize   G1HeapRegionSize         = 0 (0.0MB)--补充说明1.8之前---    MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=value:设置JVM堆的‘永生代’的最大大小 [jvm内存模型中方法区]    PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=value:设置JVM堆的‘永生代’的初始大小Heap Usage: #堆内存使用情况PS Young GenerationEden Space:   capacity = 150470656 (143.5MB) #Eden区总容量   used     = 13895512 (13.251792907714844MB) #Eden区已使用   free     = 136575144 (130.24820709228516MB) #Eden区剩余容量   9.23469889039362% usedFrom Space:   capacity = 12058624 (11.5MB)   used     = 12026104 (11.468986511230469MB)   free     = 32520 (0.03101348876953125MB)   99.7303174889606% usedTo Space:   capacity = 15204352 (14.5MB)   used     = 0 (0.0MB)   free     = 15204352 (14.5MB)   0.0% usedPS Old Generation #当前的Old区内存分布   capacity = 358088704 (341.5MB)   used     = 83802000 (79.91981506347656MB)   free     = 274286704 (261.58018493652344MB)   23.402581277738378% used

jmap -histo:live pid#

查询类实例数及占用空间,因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小

num     #instances         #bytes  class name----------------------------------------------   1:        140936       16779352  [C   2:        133652        4276864  java.util.concurrent.ConcurrentHashMap$Node   3:         47335        4165480  java.lang.reflect.Method   4:        139438        3346512  java.lang.String   5:          5525        2103544  [B   6:         37702        1809696  org.aspectj.weaver.reflect.ShadowMatchImpl   7:         14966        1673104  java.lang.Class   8:         46905        1500960  java.lang.ref.WeakReference   9:         29361        1412784  [Ljava.lang.Object;  10:           456        1307712  [Ljava.util.concurrent.ConcurrentHashMap$Node;  11:         32353        1294120  java.util.LinkedHashMap$Entry  12:         37702        1206464  org.aspectj.weaver.patterns.ExposedState  13:          6767        1157016  [I  14:         14079        1061664  [Ljava.util.HashMap$Node;  15:         31194         998208  java.util.HashMap$Node  16:         17053         954968  java.util.LinkedHashMap  17:         19901         796040  java.lang.ref.SoftReference  18:         32667         784008  org.springframework.core.MethodClassKey  19:         28028         672672  java.util.ArrayList  20:         41449         663184  java.lang.Object  21:         11809         661304  java.beans.MethodDescriptor

打印jvm运行参数#

jinfo -flags <pid>

jstat -options <pid> 5000 10 每5秒查看一次option情况共10次#

输出说明#

E 表示Eden S0/S1 分别表示Survivor0,Survivor1 YGC 表示Young GC次数 YGCT 表示Young GC耗时/秒 FGC 表示Full GC次数 FGCT 表示Full GC Time /秒 GCT 表示GC Time 所有GC总耗时 /秒 O 表示老年代old P 1.8以前表示永久代 Permanent M 1.8表示方法区 Metaspace

(1)-class 监视类装载...#

jstat -class vmid 5000 10Loaded  Bytes  Unloaded  Bytes     Time     6182 11193.4        0     0.0       2.50  6182 11193.4        0     0.0       2.50

(2) -gc 监视java堆状况及GC等信息#

jstat -gc vmid 5000 10S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   10752.0 12288.0 10736.8  0.0   100864.0 85204.5   58368.0    11790.6   29440.0 27910.7 4096.0 3735.1      6    0.053   1      0.035    0.08810752.0 12288.0 10736.8  0.0   100864.0 85204.5   58368.0    11790.6   29440.0 27910.7 4096.0 3735.1      6    0.053   1      0.035    0.088S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间GCT:垃圾回收消耗总时间

(3) -gcutil与-gc基本相同,但输出主要关注以使用空间占总空间的百分比#

jstat -gcutil vmid 5000 10S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    99.86   0.00  84.47  20.20  94.81  91.19      6    0.053     1    0.035    0.088 99.86   0.00  84.47  20.20  94.81  91.19      6    0.053     1    0.035    0.088

(4) -gccause 与-gcutil功能一样,但会额外输出导致上一次GC产生的原因#

jstat -gccause vmid 5000 10 S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                  99.86   0.00  84.47  20.20  94.81  91.19      6    0.053     1    0.035    0.088 Allocation Failure   No GC                99.86   0.00  84.47  20.20  94.81  91.19      6    0.053     1    0.035    0.088 Allocation Failure   No GC 

(5) -compiler 输出JIT编译器编译过的方法、耗时等信息#

jstat -compiler vmid 5000 10Compiled Failed Invalid   Time   FailedType FailedMethod    3122      0       0     1.18          0                 3128      0       0     1.19          0  

(6) -printcompilation 输出已经被JIT编译的方法#

jstat -printcompilation vmid 5000 10Compiled  Size  Type Method    3129      5    1 org/apache/catalina/core/ContainerBase getBackgroundProcessorDelay    3129      5    1 org/apache/catalina/core/ContainerBase getBackgroundProcessorDelay

线程dump相关信息#

Thread Name:线程的名字Thread Priority:线程的优先级Thread ID:代表线程的IDThread Status:表示线程的状态[Thread.State]        NEW: 未启动状态       RUNNABLE:可运行线程的线程状态[正在执行、等待资源]       BLOCKED:处于受阻塞状态的某一线程正在等待监视器锁       WAITING:等待线程的线程状态       TIMED_WAITING:具有指定等待时间的某一等待线程的线程状态       TERMINATED:已终止线程的线程状态Thread CallStack:提供一个线程至关重要的堆栈信息。这也是我们可以看到线程获取的锁和是否在等待锁等信息。

常用线程名称#

  1. Attach Listenerjvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程
  2. Signal Dispatcherjvm启动就会创建:处理信号
  3. ThreadPoolTaskExecutor应用程序自定义线程池
  4. Java2D Disposer该线程会扫描已注册的这些对象是否要被回收了,如果是,则调用该对象对应的DisposerRecord实现类里面的dispose方法
  5. http-nio-8080-AcceptorNioEndpoint.Acceptor
  6. http-nio-8080-AsyncTimeoutAbstractProtocol$AsyncTimeout
  7. http-nio-8008-ClientPollerNioEndpoint.Poller
  8. http-nio-8008-execorg.apache.coyote.http11.Http11NioProtocol
  9. NioBlockingSelector.BlockPoller-1NioBlockingSelector.BlockPoller
  10. ContainerBackgroundProcessorContainerBase.ContainerBackgroundProcessor
  11. FinalizerFinalizer.FinalizerThread
  12. Reference HandlerReference.ReferenceHandler ReferenceHandler作为Reference的静态内部类,用于实现将pending队列里面的Reference实例依次添加到不同的ReferenceQueue中(取决于Reference里面的queue)
  13. GC task threadGC 线程
  14. VM Periodic该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。 该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控,还有我们经常需要去执行一些jstat 这类命令查看gc的情况
  15. VM Threadjvm里面的线程母体
  16. DestroyJavaVM执行main()的线程在main执行完后调用JNI中的jni_DestroyJavaVM()方法唤起DestroyJavaVM线程。 JVM在Jboss服务器启动之后,就会唤起DestroyJavaVM线程,处于等待状态,等待其它线程(java线程和native线程)退出时通知它卸载JVM。线程退出时,都会判断自己当前是否是整个JVM中最后一个非deamon线程,如果是,则通知DestroyJavaVM线程卸载JVM
  17. CompilerThread用来调用JITing,实时编译装卸class。通常,jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1

获取相关jvm信息方法#

1. 获取线程堆栈#

Thread.getAllStackTraces().entrySet().stream().forEach(it->{            System.out.println(String.format("threadname=%s,state=%s",it.getKey().getName(),it.getKey().getState()));            Arrays.stream(it.getValue()).forEach(m->{                System.out.println(String.format("className=%s,methodName=%s",m.getClassName(),m.getMethodName()));
            });            System.out.println("-------------------------------------");        });