JVM系统优化实践(18):GC生产环境案例(一)

文章讨论了Java应用中常见的内存溢出问题(OOM),指出OOM可能发生在Metaspace、栈帧和堆内存区域。Metaspace的溢出可能由于未设置大小或框架动态生成类过多引起,而栈帧的溢出则与递归调用和频繁的方法调用有关。解决OOM需要理解其发生的原因并调整相关参数,如设置MetaspaceSize。
摘要由CSDN通过智能技术生成

生产环境中,最常见的一种案例就是OOM,也叫「内存溢出」,它表示JVM已经无法支撑业务系统的运行。而很多工程师都没有类似处理线上系统故障的经验,尤其是这种突发的故障。那么:

1、为什么会OOM?(Why)

2、发生什么样的OOM?(What)

3、那个系统发生的OOM?(Who/Where)

4、什么时候发生的OOM?(When)

5、怎么排查和解决OOM?(How)

我们知道,启动一个Java系统,就是启动一个JVM进程。由这个JVM进程来决定如何执行Java代码,一个JVM进程只有一个执行入口:它总是从main方法开始的。

JVM启动后默认的main线程就是专门用于执行main方法的主线程。

1、Metaspace用于存放系统使用到的各种类信息和JDK自身的一些信息(可能发生OOM的地方);

2、每个线程都有自己的栈帧,用于存放各种局部变量(也可能发生OOM的地方);

3、另外,代码创建的各种对象,都会存放到堆内存里(也可能发生OOM的地方)。

所以,总结起来,OOM可能发生的地方包括:

1、Metaspace区

2、栈帧

3、堆内存

可以通过参数来设置Metaspace区的大小,防止产生OOM:

-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M

Metaspace区大小相对固定,很少出现大的浮动。Metaspace区满了也会触发Full GC,一旦Metaspace无法回收空间且还在不停加载更多数据,就会发生OOM。

Metaspace发生OOM的常见原因有:

1、新手工程师未设置Metaspace区的大小,而是直接使用的默认值;

2、使用的框架用到了cglib之类的技术通过反射动态生成很多附加类,导致Metaspace区被占满。

而栈帧发生OOM的常见原因有:

1、方法发生递归调用时,导致频繁入栈出栈;

2、即便是同一个方法,每一次调用都会产生一个入栈操作,调用完成后又会产生出栈操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值