一、OOM问题
om意味着程序申请内存过大,虚拟机无法满足,为什么会没有内存了呢?原因不外乎有两点:
1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。
排查手段?
一般手段是:通过-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath在oom时把当前堆内存的快照转储到hprof文件中,也可以使用jmap实时生成hprof文件,用MAT打开hprof文件来进行辅助分析堆现场的情况,重点查看哪些类、对象占了大量的内存,以及PathToGCRoots来看引用链以确定大对象未被回收掉的原因。
确定是否内存泄露或溢出导致的:首先使用MAT打开刚刚导出的hprof文件,选择报告里的泄露嫌疑分析 Leak Suspects Report。可看到该对象所在线程的堆栈信息,可以定位到发生OOM的代码段。就可以比较准确地定位内存泄漏和内存溢出的位置
如果不存在泄漏:那么就是内存中的对象确实必须存活着,那么此时就需要通过虚拟机的堆参数( -Xmx和-Xms)来适当调大参数;从代码上检查是否存在某些对象存活时间过长、持有时间过长的情况,尝试减少运行时内存的消耗
可能导致OOM的原因
1、vim打开大文件
2、程序有死循环一直创建对象
3、堆大小设置不合适
4、扫表时候一次性查出太多的数据
5、扫表时候条件设置不当,永远扫出同样的数据,没有限制页数
二、CPU使用率飙升排查
1、用top命令查询资源占用情况,可看到内存和cpu的使用情况
标签:hprof,虚拟机,问题,排查,内存,泄露,溢出 From: https://www.cnblogs.com/MarkLeeBYR/p/17285575.html