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占用过高

问题:

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

问题定位(死锁同理):

top查看进程,jps查看进程对应的Java程序,(top -Hp 进程)查看进程下线程的情况,jstack+线程ID查看执行栈信息

相关推荐
CS创新实验室11 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
wuminyu14 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
DongQiShanRen1 天前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
乌暮1 天前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试
Sayai1 天前
Java 进程 Unable to create new native thread 排查实战:Linux 线程数五层限制与 JVM -Xss 调优
java·linux·运维·jvm·性能优化
wuminyu1 天前
Continuation::freeze与thaw的x86_64汇编Stack Chunk拆解源码分析
java·linux·c语言·汇编·jvm·c++
金銀銅鐵1 天前
[Java] 借助GUI展示class文件的内容(v1.0版本)
jvm·后端·ai编程
kunicoding2 天前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全
云老大-阿里云国际站代理商2 天前
华为云国际站渠道代理商:CSS查询很慢但CPU不高?磁盘I/O、JVM与分片问题怎么排查
css·jvm·华为云
呆呆虫122 天前
SerpBase 省 credit 实战:缓存 + 去重,把重复请求砍掉一半
jvm·缓存