JVM 故障调优

JVM --- OOM 线上环境处理

 

定位

  没有日志可以定位

  接受所有系统, jvm启动参数

        转为一个文件,JVM 内存快照

  1 -XX:+HeapDumpOnOutOfMemoryError -xx:HeapDumpPath = /temp/202009.hpro

 

   GcRoot是垃圾回收器算法中判断一个对象是否可以回收的一种算法

  就是对象到达GcRoot的路径是否还有可达,即是否有可引用链,如果有,这表明对象还存在着引用,
如果没有,则表明该对象没有引用,在下一次垃圾回收时就会被回收

    GcRoot的种类

  1.虚拟机栈:栈帧中的本地变量表引用的对象

  2.native方法引用的对象

  3.方法区中的静态变量和常量引用的对象

 

 

基于JVM理解,利用MAT 工具

1、内存是否不通用 --> 压力测试,了解 jvm 原理

  结合业务场景 ---->  每个请求返回多少数据

2、可能是业务流程有问题(代码有问题)

可能 ---》 对象太多 ---》 GC 手段  ---》 垃圾回收 ---》 释放

OOM ---》 GC 无法释放更多内存

1、可以对象定位  

  一个类、多个地方使用 --》 登录/查询用户列表/导出用户数据

2、可疑代码段定位

  没有GC  有地方再用 ---》什么地方使用

       对象在哪里来 ---》 代码中的动态创建

  Java ----执行的最小单位 ----》 线程

  求解  哪段代码导致 OOM 

  2.1 、找到可疑线程

main ---主线程

Thread-0

   2.2、线程当时运行的情况

线程执行stack信息

 3、分析代码逻辑,排除问题

OOM  

  1、启动时候出现

  2、运行过程中,内存泄漏

  

 修改前

修改后

 在同一个线程中,创建对象没有被回收

原文地址:https://www.cnblogs.com/Jomini/p/13672842.html