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
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

    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,打印到文件里。

 

posted @ 2020-03-19 16:37  软件匠工  阅读(223)  评论(0编辑  收藏  举报