常用配置及命令
#
相关配置#
1. 常用配置
-XX:+PrintGCDetails -Xloggc:filepath
配置gc日志路径-Xmx1024m
最大堆大小-Xms100m
初始堆大小-XX:SurvivorRatio=x
eden:survivor(x:2)-XX:NewRatio=x
old:new(x:1)-XX:MaxTenuringThreshold=n
对象在新生代存活的最大次数-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
开启CMS GC (Yong 使用Parallel GC)-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
<pid>
#
jmap #
(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>
<pid>
5000 10 每5秒查看一次option情况共10次#
jstat -options #
输出说明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:提供一个线程至关重要的堆栈信息。这也是我们可以看到线程获取的锁和是否在等待锁等信息。
#
常用线程名称
- Attach Listener
jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程
- Signal Dispatcher
jvm启动就会创建:处理信号
- ThreadPoolTaskExecutor
应用程序自定义线程池
- Java2D Disposer
该线程会扫描已注册的这些对象是否要被回收了,如果是,则调用该对象对应的DisposerRecord实现类里面的dispose方法
- http-nio-8080-Acceptor
NioEndpoint.Acceptor
- http-nio-8080-AsyncTimeout
AbstractProtocol$AsyncTimeout
- http-nio-8008-ClientPoller
NioEndpoint.Poller
- http-nio-8008-exec
org.apache.coyote.http11.Http11NioProtocol
- NioBlockingSelector.BlockPoller-1
NioBlockingSelector.BlockPoller
- ContainerBackgroundProcessor
ContainerBase.ContainerBackgroundProcessor
- Finalizer
Finalizer.FinalizerThread
- Reference Handler
Reference.ReferenceHandler ReferenceHandler作为Reference的静态内部类,用于实现将pending队列里面的Reference实例依次添加到不同的ReferenceQueue中(取决于Reference里面的queue)
- GC task thread
GC 线程
- VM Periodic
该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。 该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控,还有我们经常需要去执行一些jstat 这类命令查看gc的情况
- VM Thread
jvm里面的线程母体
- DestroyJavaVM
执行main()的线程在main执行完后调用JNI中的jni_DestroyJavaVM()方法唤起DestroyJavaVM线程。 JVM在Jboss服务器启动之后,就会唤起DestroyJavaVM线程,处于等待状态,等待其它线程(java线程和native线程)退出时通知它卸载JVM。线程退出时,都会判断自己当前是否是整个JVM中最后一个非deamon线程,如果是,则通知DestroyJavaVM线程卸载JVM
- 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("-------------------------------------"); });