ToB企服应用市场:ToB评测及商务社交产业平台

标题: JVM(OOM案例) [打印本页]

作者: 飞不高    时间: 昨天 22:56
标题: JVM(OOM案例)
调优从业务场景开始,没有业务场景的调优都是耍地痞
无监控,不调优
OOM案例1:堆溢出

在 JDK 9 及以上版本中,必要使用 -Xlog 参数来配置 GC 日志的输出格式。以下是修改后的启动参数:
  1. -XX:+PrintGCDetails -XX:MetaspaceSize=64m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap/heapdump.hprof -Xms200M -Xmx200M -Xlog:gc*,gc+age=trace,safepoint:file=log/gc-oomHeap.log:time,uptime,level,tags:filecount=10,filesize=100M
复制代码
参数说明:
  1. @RestController
  2. @RequestMapping("/api/user")
  3. public class SysUserController {
  4.     @Resource
  5.     private ISysUserService sysUserService;
  6.     /**
  7.      * JVM参数配置
  8.      *
  9.      * 参数配置: 初始-Xms30M -Xmx30M
  10.      * JDK1.8版本使用
  11.      * -XX:+PrintGCDetails -XX:MetaspaceSize=64m
  12.      * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap/heapdump.hprof
  13.      * -XX:+PrintGCDateStamps -Xms200M -Xmx200M -Xloggc:log/gc-oomHeap.log
  14.      */
  15.     @RequestMapping("/add")
  16.     public void add() {
  17.         List<SysUser> users = new ArrayList<>();
  18.         while (true) {
  19.             users.add(new SysUser());
  20.         }
  21.     }
  22. }
复制代码
访问add接口报错:java.lang.OutOfMemoryError: Java heap space,随后在heap文件夹中就会生成heapdump.hprof文件,在log文件夹中就会生成gc-oomHeap.log文件
使用GCeasy网站分析log文件
使用JDK自带的工具分析dump文件

点击赤色字体线程查找它的详细代码位置

使用MAT工具分析dump文件

OOM案例2:元空间溢出

jdk8
  1. -XX:+PrintGCDetails -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m
  2. -Xss512K -XX:+HeapDumpOnOutOfMemoryError
  3. -XX:HeapDumpPath=heap/heapdumpMeta.hprof -XX:SurvivorRatio=8
  4. -XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:+PrintGCDateStamps
  5. -Xms60M -Xmx60M -Xloggc:log/gc-oomMeta.log
复制代码
jdk11
  1. -XX:MetaspaceSize=60m
  2. -XX:MaxMetaspaceSize=60m
  3. -Xss512K
  4. -XX:+HeapDumpOnOutOfMemoryError
  5. -XX:HeapDumpPath=heap/heapdumpMeta.hprof
  6. -XX:SurvivorRatio=8
  7. -Xms60M
  8. -Xmx60M
  9. -Xlog:gc*,gc+age=trace,safepoint:file=log/gc-oomMeta.log:time,uptime,level,tags:filecount=10,filesize=100M
  10. -Xlog:class+load=info:file=log/class-load.log:time,uptime,level,tags:filecount=10,filesize=100M
  11. -Xlog:class+unload=info:file=log/class-unload.log:time,uptime,level,tags:filecount=10,filesize=100M
复制代码
参数说明:
-Xlog:gc*:替换 -XX:+PrintGCDetails 和 -XX:+PrintGCDateStamps,用于记录全部 GC 相关的日志。
gc+age=trace:打印对象年龄信息。
safepoint:打印安全点信息。
file=log/gc-oomMeta.log:指定 GC 日志文件路径。
time,uptime,level,tags:在日志中包罗时间戳、JVM 启动时间、日志级别和标签。
filecount=10,filesize=100M:日志文件轮转,最多保留 10 个文件,每个文件最大 100MB。
-Xlog:class+load:替换 -XX:+TraceClassLoading,用于记录类加载信息。
file=log/class-load.log:指定类加载日志文件路径。
-Xlog:class+unload:替换 -XX:+TraceClassUnloading,用于记录类卸载信息。
file=log/class-unload.log:指定类卸载日志文件路径。
其他参数:
-XX:MetaspaceSize=60m 和 -XX:MaxMetaspaceSize=60m:设置元空间巨细。
-Xss512K:设置线程栈巨细。
-XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=heap/heapdumpMeta.hprof:在 OOM 时生成堆转储文件。
-XX:SurvivorRatio=8:设置新生代中 Eden 区与 Survivor 区的比例。
-Xms60M 和 -Xmx60M:设置堆内存的初始巨细和最大巨细。
  1.     /**
  2.      * -XX:+PrintGCDetails -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m
  3.      * -Xss512K -XX:+HeapDumpOnOutOfMemoryError
  4.      * -XX:HeapDumpPath=heap/heapdumpMeta.hprof -XX:SurvivorRatio=8
  5.      * -XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:+PrintGCDateStamps
  6.      * -Xms60M -Xmx60M -Xloggc:log/gc-oomMeta.log
  7.      */
  8.     @RequestMapping("/metaSpaceOom")
  9.     public void metaSpaceOom() {
  10.         ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
  11.         while (true) {
  12.            Enhancer enhance = new Enhancer();
  13.             enhance.setSuperclass(SysUser.class);
  14.             enhance.setUseCache(false);
  15.             enhance.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
  16.                 System.out.println("我是加强类,输出print之前的加强方法");
  17.                 return methodProxy.invokeSuper(o, objects);
  18.             });
  19.             SysUser sysUser = (SysUser) enhance.create();
  20.         }
  21.     }
复制代码
jps命令
PS D:\Practice> jps
19024 Main
23360 Launcher
23536
10248 Jps
12312 Main
jstat 命令
PS D:\Practice> jstat -gc 12312  1000 10
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
0.0   4096.0  0.0   3841.8 30720.0  10240.0   26624.0    10898.0   38400.0 37090.8 5120.0 4571.6      6    0.024   0      0.000    0.024
这两个命令可以配合使用一下查看线程的JVM内存的使用变化
OOM案例3:GC overhead limit exceeded

java -Xmx10m -XX:+UseParallelGC -XX:+PrintGCDetails GCOverheadLimitExceededExample
  1. public class GCOverheadLimitExceededExample {
  2.     public static void main(String[] args) {
  3.         List<String> list = new ArrayList<>();
  4.         while (true) {
  5.             list.add(new String("GC Overhead Limit Exceeded"));
  6.         }
  7.     }
  8. }
复制代码
分析缘故原由
OOM案例4:线程溢出

java -Xss1m -Xmx100m ThreadOOMExample
  1. public class ThreadOOMExample {
  2.     public static void main(String[] args) {
  3.         while (true) {
  4.             new Thread(() -> {
  5.                 try {
  6.                     Thread.sleep(1000000);
  7.                 } catch (InterruptedException e) {
  8.                     e.printStackTrace();
  9.                 }
  10.             }).start();
  11.         }
  12.     }
  13. }
复制代码
分析缘故原由

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4