jvm
jvm日志捕获
被动捕捉异常日志:nohup -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=路径地址/heapdump.hprof -jar XXX.jar &
主动捕捉异常日志:jmap -dump:format=b,file=路径/heapdump.hprof 查到的PID
内存溢出问题分析
- 演示栈内存溢出 报错信息:java.lang.StackOverflowError
* 可以通过设置 JVM 参数来设置栈内存,如:-Xss256k
- 演示堆内存溢出 java.lang.OutOfMemoryError: Java heap space
* 可以通过配置JVM参数:-Xmx8m 来设置最大堆内存
- 元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
* 设置元空间大小:-XX:MaxMetaspaceSize=8m
- * 永久代内存溢出 java.lang.OutOfMemoryError: PermGen space
* 设置永久代内存大小:-XX:MaxPermSize=8m
当使用 jdk1.8 及之后的版本时,内存溢出报错提示:java.lang.OutOfMemoryError: Metaspace。当使用 jdk1.8 之前的版本时,内存溢出报错提示:java.lang.OutOfMemoryError: PermGen space
(默认的元空间内存大小为操作系统的内存大小,可能没那么容易产生内存溢出,可以通过设置 jvm 参数限制元空间内存大小来演示内存溢出现象)
常用参数配置
堆设置:
- -Xms:初始堆空间大小。示例 -Xmx64m
- -Xmx:最大堆空间大小。示例 -Xmx64m
- -Xmn:新生代大小。示例 -Xmx32m
- -XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
- -XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如值为3,表示Eden : Survivor=3 : 2,一个Survivor区占整个新生代的1/5
- -XX:MaxTenuringThreshold:晋升阈值,设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
- -XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
- -XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
垃圾回收统计信息:
- -XX:+PrintGC:
- -verbose:gc:输出虚拟机GC详情
- -XX:+PrintGCDetails:打印GC详情
- -XX:+PrintGCDetails -verbose:gc:GC详情
- -XX:+PrintGCTimeStamps
- -Xloggc:filename
- -XX:+ScavengeBeforeFullGC:FullGC 前进行 MinorGC
- -Xss:设置每个线程可使用的内存大小,即栈的大小。示例 -Xss512k
- -XX:+HeapDumpOnOutOfMemoryError:当抛出oom时进行heapdump
- -XX:+HeapDumpPath:指定 heapdump 文件的路径和目录
最常见的几个参数如下:
- -Xms20m :设置jvm初始化堆大小为20m,一般与-Xmx相同避免垃圾回收完成后jvm重新分。
- -Xmx20m:设置jvm最大可用内存大小为20m。
- -Xmn10m:设置新生代大小为20m。
- -Xss128k:设置每个线程的栈大小为128k。
jvm学习参考:https://www.cnblogs.com/wenxuehai/p/16577890.html#autoid-h2-5-2-0
JAVA内存分析相关工具参考:https://www.cnblogs.com/wenxuehai/p/16600216.html
觉得写的还可以的朋友,请点点赞,非常感谢!