JVM-内存溢出的原因、CPU占满的原因

1.内存溢出的原因

OOM的排查思路_oom排查_java排坑日记的博客-CSDN博客

每个进程的内存(限制,譬如2G)=最大堆容量+最大方法区容量+程序计数器+虚拟机栈和本地方法栈。多线程下每个线程栈越大,越容易OOM.

        1.堆内存溢出(OOM)

                1)大对象(从数据库里一次请求了大量的数据)

                2)同时引用的对象过多(大批量的请求、批量任务导致)

                3)内存泄漏(使用了file之类的资源没有关闭回收)

        解决方案:

                1.-xmx 调高jvm堆内存空间

                2.优化代码,查询过滤

                3.添加机器资源,流量降级

                4.内存泄漏:定位内存泄漏原因,优化代码

        2. 栈内存溢出(StackOverFlow)

                -Xss

                1.方法调用栈过长

                2.线程数过多

        3.MetaSpace OOM

                1.加载的类过多

                解决方案:

                -XX:MaxMetaSpaceSize 扩大元数据区大小

        4.直接内存溢出

                dump文件不会有明显异常

                1.主要为native方法导致 、NIO 

                解决方案:

                        配置参数调整内存大小

        排查手段:

           1. 重启

           2.heap dump获取内存快照,通过分析工具,进行定位

事先开启HeadDumpOnOutOfMemoryError,这样出现OOM的时候能自动留下Dump,留好第一现场。这是最推荐的方式。
JVM的启动参数中加入如下的一些参数:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/oom
第一个参数意思是在OOM的时候自动dump内存快照出来,第二个参数是说把内存快照存放在哪里

2.CPU占用过高

【大厂面试题】线上服务Cpu飙升如何定位到代码?_哔哩哔哩_bilibili

问题:

1. 多线程并发,数据密集型。

问题定位(死锁同理):

 top查看进程找到PID(command java),jps查看进程对应的Java程序,(ps -mp -o进程ID)查看进程下线程tid的情况,jstack+pid | grep tid查看执行栈信息

3.定位死锁

jps找到进程ID+jstack进程ID查看死锁栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值