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, 注:如果忘记jcmd有哪些可用的选项,可用jcmd <pid> help查看。

4. Java 线程栈默认大小多少? https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp1024112

Platform
Default
Windows IA32
64 KB
Linux IA32
128 KB
Windows x86_64
128 KB
Linux x86_64
256 KB
Windows IA64
320 KB
Linux IA64
1024 KB (1 MB)
Solaris Sparc
512 KB

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

 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>

原文地址:https://www.cnblogs.com/lzmrex/p/12525207.html