怎么定位K8s容器中运行的JAVA程序OOM异常(一)

1 篇文章 0 订阅

一.前置环境

1. 运行在k8s集群上的Pod服务(Java程序)

2. MAT分析工具(Eclipse Memory Analyzer)

二.利用Jmap工具导出Heap Dump

1.执行命令进入pod容器

kubectl exec -itn {namespace} {pod} sh

2.利用jmap生成java程序的Dump文件

jps | grep {jar}
./jmap -dump:live,format=b,file=haep.hprof 8

3.利用k8s命令导出Dump文件到本地

kubectl cp -n {namespace} {pod}:/usr/lib/jvm/java-1.8-openjdk/bin/haep.hprof haep.hprof

4.导入MAT分析工具

三.利用MAT工具分析可疑内存泄漏

1.基本原则

     千万不要等到OOM发生才去采取行动,尽最大可能性保证上线后的服务不会发生OOM错误。

2.预先分析

      当我们完成业务开发后,需要对业务运行情况进行相应的测试,保证程序不会发生OOM错误,以下提供二种思路:

      (1)针对大对象的性质考虑

      (2)针对时间序列上的可疑增长考虑

       当我们将Dump文件导入MAT分析工具时,可以根据上诉两种思路判断可能导致OOM错误的原因。

  3. 针对大对象的性质考虑

  

当导入Dump文件时,会有一个饼图,可以看出当前进程的占用内存最多的对象,一般而言,我们可以集中分析Top-N 的对象,分析各个大对象内存占用是否合理,进而判断各个对象是否有可能造成内存溢出。

  4. 针对时间序列上的可疑增长考虑

     一次Dump操作很难判断出当前程序是否存在内存泄漏,是否会导致内存溢出。基于此,需要我们在系统运行后每隔一定时间T进行Dump操作。     

      假设存在时间tn上对应的Dump文件f(tn),通过对比不同时间序列上的对象实例数量,对稳定运行一段时间依旧不断增长对象的类进行专门分析,通过提前解决过滤内存溢出问题达到不发生OOM的期望。

     以上描述可操作于:

    1.点击其中一个Dump文件下

操作:Actions -> Histogram 

  2.选择按照class进行分组查看数据

操作:Group by class 

 

3. 和其余时间段Dump文件进行对比

操作:Compare to another heap dump

如上图,+0表示两个dump文件对象数量无增长。此处仅为举例,实例情况下对象一般都有增长和减少。基于此,应该重点分析数值变化比较大的对象

4.MAT工具提供了许多实用功能,笔者也在学习,本文不在介绍其余详细使用。

5.补充,若事先确实无法避免OOM,那么请加上相关JVM参数,当程序发生OOM时,JVM会自动dump下当前进程情况。事后拿到dump文件,便可以通过各种MAT进行分析啦。

-XX:+HeapDumpOnOutOfMemoryError

四.总结

    OOM真正解决的时期不应该是到了生产环境,而是应该提前发现并解决,甚至在编码前预先判断业务使用资源情况,编码时灵活运用设计模式等方法来避免。这是一个可以避免的错误类型

  

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JVM(Java虚拟机)OOM(Out of Memory)异常通常由以下几个原因引发: 1. 堆内存不足:堆内存是JVM用于分配对象实例的内存区域。如果应用程序创建了大量的对象,并且堆内存无法容纳这些对象,就会导致堆内存不足的OOM异常。 2. 方法区/永久代内存不足:方法区(在Java 8之前称为永久代)用于存储类的元数据、静态变量、常量池等信息。如果应用程序加载了大量的类或者使用了大量的字符串常量,就可能导致方法区/永久代内存不足的OOM异常。 3. 栈内存溢出:栈内存用于保存方法的调用栈和局部变量等信息。如果方法调用层级过深或者方法使用了大量的局部变量,就可能导致栈内存溢出的OOM异常。 4. 本地方法栈溢出:本地方法栈用于执行本地方法(Native Method)。如果本地方法执行时需要消耗大量的本地内存,而本地内存不足,就可能导致本地方法栈溢出的OOM异常。 5. 直接内存溢出:直接内存是JVM使用的一种特殊的堆外内存,它不受JVM堆内存大小限制。如果应用程序频繁地分配大量的直接内存,而没有及时释放,就可能导致直接内存溢出的OOM异常。 需要注意的是,不同的JVM实现可能在内存管理方面存在差异,因此具体的OOM异常可能会有所不同。此外,可以通过调整JVM的启动参数或优化代码来减少OOM异常的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值