首页 > 编程语言 >JAVA应用OOM OutOfMemoryError排查方法分享

JAVA应用OOM OutOfMemoryError排查方法分享

时间:2023-11-10 16:55:40浏览次数:45  
标签:oom JAVA OOM 代码 应用程序 排查 内存 OutOfMemoryError 快照

JAVA应用OOM OutOfMemoryError排查方法分享

本地IDE场景

如果OOM能在本地IDE复现,那对于调试来说是再方便不过了.

  1. 添加jvm参数,帮助排查问题
# 限制内存不要给太大,使得有问题的代码容易暴露并调试。
# HeapDumpOnOutOfMemoryError的意义为发生oom的时候,导出一份堆内存的快照。根据快照可以还原oom发生时的内存场景,从而定位问题代码。
-Xmx200m -Xms10m -XX:NativeMemoryTracking=detail -XX:+HeapDumpOnOutOfMemoryError
  1. 启动应用程序.

  2. 启动visualvm,从visualvm中选择业务应用程序.

  3. 在visualvm中可以很方便地看到应用程序的一些状态,如JVM配置,监控台,GC情况

  1. 在监控台中观察内存变化,同时调用接口,如果调用某接口时内存变化很大,很可能就是有问题的接口

  1. 也可以在sample中,查看具体的对象信息,从而定位问题代码
    分析方法:
    一般看占用最大size的对象是哪个,然后逐层追查它的reference,然后排查是哪个地方的代码出现了问题.


    输出快照


  2. 如果还是找不到问题代码,使用终极方法,debug模式一步步排查.开启debug后,在代码打多个断点.由于进入断点时监控台会阻塞,但GC页面是不阻塞的,所以可以通过一步步走断点,同时观察GC情况,进一步缩小问题范围.

线上场景

线上场景容易复现,但不容易排查,可以参考以下思路。但还是尽可能想办法在本地复现,这样修复后也能方便地进行验证

  1. 添加jvm参数,帮助排查问题
# 限制内存不要给太大,使得有问题的代码容易暴露并调试。
# HeapDumpOnOutOfMemoryError的意义为发生oom的时候,导出一份堆内存的快照。根据快照可以还原oom发生时的内存场景,从而定位问题代码。
-Xmx200m -Xms10m -XX:NativeMemoryTracking=detail -XX:+HeapDumpOnOutOfMemoryError
  1. 启动应用程序,并调用接口想办法使其再次出现oom异常
  2. oom异常发生时,会在应用程序启动的工作目录(就是你执行java -jar时所在的目录)生成一份快照文件,格式如: java_pid26828.hprof
  3. 下载工具分析快照,如visualvm.
  4. 分析快照文件
  5. 分析可能存在问题的代码

标签:oom,JAVA,OOM,代码,应用程序,排查,内存,OutOfMemoryError,快照
From: https://www.cnblogs.com/xiaojiluben/p/17824487.html

相关文章

  • JavaScript--定时器案例
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • java的double、float类型的比较
    在java中,针对double、float类型的运算和比较都最好不要直接进行,可以依靠BigDecimal来进行一、比较大小转换成long再比较,(这是long是基本类型,而不是Long对象,对象比较不要用==)Double.doubleToLongBits(0.042421d)==Double.doubleToLongBits(0.2342401d)Double.doubleToL......
  • 深入学习JavaScript ES8函数式编程:特性与实践指南
    ......
  • 秦疆的Java课程:24 基础 数据类型扩展及面试题讲解
    1、整数扩展进制二进制数:0b开头八进制数:0开头十六进制数:0x开头publicclassDEMO1{publicstaticvoidmain(String[]args){//整数扩展:进制intA=10;intB=0b10;//二进制intC=010;//八进制intD......
  • 小程序性能优化之JavaScript代码优化
    大家好,今天我们来聊一聊小程序性能优化中的JavaScript代码优化。在编程过程中,我们都喜欢轻松愉快,不想戴着沉重的“全局疯狂”帽子。但有时候,过度使用全局变量会让我们的程序变得难以维护,就像在一片大森林里找寻一个小木屋。这时候,我们就需要考虑一下,是不是该减轻一下我们的“全局疯......
  • 有趣的Java之Spring Security
    说明SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架。SpringSecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。一般Web应用的需要进行认证和授权。用户认证......
  • java如何声明一个对象
    在Java中,声明一个对象有多种方式。以下是其中几种常用的方式:1.使用关键字`new`:使用这种方式声明一个对象,会调用类的构造函数创建对象的实例。ClassNameobj=newClassName();其中,`ClassName`是类的名称,`obj`是对象的引用。2.使用类的静态方法:某些类提供了静态方法来创建对......
  • JAVA生成16位唯一字符串
      importlombok.extern.slf4j.Slf4j;importjava.util.Random;importjava.util.UUID;publicclassRandomUtils{privatestaticlonggetRandom(longn){longmin=1,max=9;for(inti=1;i<n;i++){min*=1......
  • java写一个自动爬取统计局公开数据的程序
    在Java中,爬取网站内容的最常用的库是Jsoup。以下是一个简单的爬虫程序示例,它将爬取统计局网站上的公开采集内容:importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importjava.io.IOException;publ......
  • Java日志框架概览
     SLF4J提供统一的日志门面API,即图中紫色部分,实现中立的日志记录API桥接功能,蓝色部分,把各种日志框架API(绿色部分)桥接到SLF4JAPI。这样即便你的程序中使用各种日志API记录日志,最终都可桥接到SLF4J门面API。适配功能,红色部分,可实现SLF4JAPI和实际日志框架(灰色部分)绑定。SLF4J只是......