JVM常见问题排查的思路汇总

13 篇文章 0 订阅

参考文档:

一次JVM爆内存分析

一次JVM爆内存分析 - 持续疯长,往天那边去 - ITeye博客

部分内容提要:

1.应用没有死,但是响应非常慢,通过jstat查看到s0/s1 eden old区都100%了;确认JVM是内存爆了;系统GC时间非常高;


2.通过jmap和java options查看JVM内存分配和参数配置,看是否不合理;


3.通过thread dump结合top -H -p  pid查看CPU最高的线程是什么,看是否存在deadlock,如果是用户线程,基本可以定位到问题;而我的threaddump最吃CPU的都是GC线程,且无死锁,可以确认是程序问题;


4.通过jmap -histo:live pid这一步查看对象实例数和占用内存数;


就在这一步发现了一个业务对象实例占用非常高,达30多W;
然后就顺瓜摸藤找到原因了。

一次程序宕机的辛酸追寻之路

一次程序宕机的辛酸追寻之路 | IMXYLZ

内容提要:

系统服务宕机,没找到原因,服务器是主备架构的,主服务机器重启了,备机还不能正常提供服务。 通常遇到这种情况,Java程序的标准做法是:

  • jstat 查询内存使用率 -> 正常
  • jstack 查询线程栈状况 -> 大约正常,只有一个看起来像是错误的问题
  • jmap 查看内存状况 -> 正常
  • log4j日志文件 -> 基本正常(事实上不正常,只是未发现)
  • gc日志文件 -> 备机看到一堆内存分配失败
  • sql记录文件 -> 正常
  • jetty的日志文件 -> 大致正常

排查过程提要:

java日志提示的是OOM ,检查OOM出现时,查询当时的各种日志信息:GC日志、java日志(用户操作、定时器等)、Nginx日志(有谁在做什么操作)、SQL日志(慢查询的日志,及其原因)

内存溢出OOM故障定位实践  内存溢出OOM故障定位实践_加权不下平权的博客-CSDN博客

部分内容提要:

配置后台程序,启动参数,在内存溢出时,自动输出dump文件

VM options:

-Xmx10m(分配最大内存)

-XX:+HeapDumpOnOutOfMemoryError(程序内存溢出自动转存dump)

-XX:+HeapDumpOnCtrlBreak(手动退出时,转存dump,java1.6已经取消)

-XX:HeapDumpPath=D:\sso\dump(转成dump文件路径)
 

OOM问题定位 

https://www.cnblogs.com/ygj0930/p/6522987.html

内容提要:

一:堆内存溢出

    Java创建的对象一般都是分配在堆中,如果是由于过期对象没能回收(内存泄漏)或者对象过多导致放不下(内存溢出),一般报错:Exception in thread \"main\" java.lang.OutOfMemoryError: Java heap space

       解决这部分的异常,重点是通过内存映像分析工具分析堆的转储快照,确定异常是由于内存泄漏还是内存溢出导致的。

     如果是内存泄漏导致的,则进一步查看泄漏对象到GCRoots的引用链,观察泄漏对象是通过怎样的路径与GCRoots相关联并导致垃圾回收器无法回收的;

     如果是内存溢出导致的,则检测堆的大小参数(Xmx、Xms)看看能否再调大,检测是否有某些对象生命周期过长。

二:方法区溢出

    方法区主要存放类的信息、静态变量、常量池等,当常量池溢出或者不停地有类动态创建并加载时,方法区也能产生OOM。

    报错信息:Exception in thread \"main\" java.lang.OutOfMemoryError: PermGen space

      拓展:String.intern():如果字符串常量池已经包含一个等于此string对象的字符串,则返回该字符串;否则,将次string对象的内容加入到常量池中,并返回该对象的引用。

  三:栈溢出(虚拟机栈、本地方法栈)

   栈的异常有两种:

   一种是:JVM在执行方法时就会创建方法栈,方法的递归、调用等使得其他方法不停地入栈,其他方法执行完毕就会弹出栈帧。当一个方法栈的深度大于JVM所允许的深度时就会报StackOverFlow;一般,出现StackOverFlow时就要检查代码是否有无穷递归的情况出现了。 stack length:1007Exception in thread \"main\" java.lang.StackOverflowError

还有一种就是 : 栈空间扩展时没有足够的内存则报OutOfMemory。

四:本地直接内存溢出

   直接内存可以通过 -XX:MaxDirectMemorySize指定。如果本地直接内存溢出,我们可以发现堆转储快照中无明显异常指示,并且快照文件很小,而程序中又使用了NIO等技术,则可以检查是否直接内存溢出了。

Java中9种常见的CMS GC问题分析与解决

https://blog.csdn.net/weixin_42073629/article/details/114375808

cpu使用率低负载高,原因分析

https://blog.csdn.net/weixin_33918357/article/details/92038835

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值