JVM常见问题
1. java进程有多少个线程? top -Hp <pid>, jstack <pid>线程栈详细信息
2. Java进程占用了多少物理内存? top -p <pid> 查看RSS(常驻内存) virtual memmory
3. 查看Java进程各个区内存占用情况?加上启动参数:-XX:NativeMemoryTracking=detail, 用jcmd <pid> VM.native_memory,
注1:如果忘记jcmd有哪些可用的选项,可用jcmd <pid> help查看。
注2:查看具体命令的选项,可用jcmd <pid> help VM.native_memory
在进程退出时,打印内存信息,加上以下命令:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
文档: https://docs.oracle.com/en/java/javase/12/vm/native-memory-tracking.html#GUID-710CAEA1-7C6D-4D80-AB0C-B0958E329407
4. Java 线程栈默认大小多少? https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp1024112
Platform
| |
---|---|
5. 堆内存默认应该占用多少物理内存?
这个问题要分JAVA的运行模式,client还是Server,32位JVM还是64位的。产线一般都是64位+server,那么堆的大小不受限制,如果物理内存多于128G,那么heap最多可以达到32G。
参考:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
https://www.cnblogs.com/lzmrex/p/12102454.html
6. Java堆默认各个区的比例?https://www.cnblogs.com/lzmrex/p/12336894.html
7. JVM 日志参数:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:<日志文件路径> 如:/opt/logs/sms/gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=<保留文件数>10
-XX:GCLogFileSize=<文件大小> 如:100M
8. OOM 怎么办? 查看日志,分析OOM的原因,是堆暴了?永久代暴了?还是无法创建线程了?加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/service.hprof
OOM了JAVA进程会不会退出?答:如果所有的非守护线程都OOM了,Java进程退出。OOM的线程抛出OOM异常,且异常无法try catch住。
如何在JAVA进程OOM时,自动重启JAVA进程?答:-XX:OnOutOfMemoryError=kill -9 %p --add-opens
9. jstat 工具:
9.1 查看jvm加载了多少类, 大小多少?jstat -class <pid>
9.2 各个代的容量,占用量,gc次数,gc时间,jstat -gc <pid>
9.3 各个代的容量,新生代最小,最大容量 等等, jstat -gccapacity <pid>
9.4 gc的原因,jstat -gccause <pid>
9.5 meta space的容量 jstat -gcmetacapacity <pid>
9.6 新生代的容量,对象在新生代存活的次数,TT对象在新生代存活的次数,MTT最大次数,DSS期望的幸存区大小
9.7 参看各个代的大小比例 jstat -gcutil <pid>, E 89.82是指Eden占用量占总量的百分比。
参考:https://blog.csdn.net/u012998254/article/details/81045414
10. 查看jvm启动参数:jinfo pid
11. 在线dump内存:jmap -dump:format=b,file=dump.hprof <process-id>
12.打印线程栈信息:https://www.baeldung.com/java-thread-dump
12.1: jstack <pid>
12.2: kill -3 Command (Linux/Unix) 默认答应到控制台。加上这些参数:-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=~/jvm.log,打印到文件里。