当前位置: 首页 > news >正文

Java线上问题堆栈排查分析

最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。

一、数据抓取

在启动参数中添加参数,可参照以下设置。
参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志,dump下来,方便用工具分析溢出情况。

-Xloggc:/home/logs/ 
-XX:NumberOfGCLogFiles=8 
-XX:+PrintGCDateStamps 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:+UseGCLogFileRotation 
-XX:GCLogFileSize=600m 
-XX:HeapDumpPath=/home/logs/ 
-XX:+PrintGC

明确两个命令:jmap 和 dump
jmap 是 Java 的一个命令行工具,用于打印有关 Java 堆的信息,包括不同代的大小、总堆的大小以及不同对象使用的内存量。
dump命令是一个备份文件系统的工具。它可用于创建文件系统的镜像,以便在物理设备或远程存储中进行恢复。手动dump

在Linux系统手动抓取Java栈堆记录信息,命令如下图所示。

jamp -dump:format=b,file=/dump.hprof

或者可以写个bash脚本,可循环抓取。

#! /bin/bash
read -p 'input process id' process_id
for((i=1;i<=10;i++))
do
jamp -dump:format=b,file=/dump$i.hprof $process_id
sleep 10
done
二、记录设置参数过程

1)FullGC 瞬时次数
在未指定GC算法时,用监控软件发现出现 FullGC现象,瞬时值次数达到12次。
在这里插入图片描述

指定G1算法,即useG1,FullGC现象消失。
在这里插入图片描述

可在JVM参数中指定G1,参数如下所示。

-XX:+UseG1GC

2)调整栈大小
Jvm 默认栈大小为1m,可根据实际需要调整大小,本次调整栈大小为2m,可参考以下命令。

-Xss2m
三、JVM分析工具分析

对采集到的文件,进行JVM分析主要有两个工具 Java VisualVMEclipse Memory Analyzer

在cmd下输入jvisualvm命令,可以调用出 jvisualvm 界面。
在这里插入图片描述
在弹出页面 选择hprof文件即可。
在这里插入图片描述
打开界面如下所示,可以看到堆栈中主要占用情况,点击可查看详情。
在这里插入图片描述
方式一、mat 软件安装
下载地址:Eclipse Memory Analyzer官网,下载页面如下图所示。
在这里插入图片描述
根据实际需要选择对应的版本,这里选择的是Windows版本,进入下一步,选择 Download 等待下载即可。
在这里插入图片描述
若镜像下载不下来,可以尝试第三方下载方式,如 mat下载。
软件下载完毕,在编辑栏 file 导入hprof 文件即可,如下图所示。
在这里插入图片描述
在 总览页面Overview 下展示总体情况,可点击 支配树 dominator tree
在这里插入图片描述
浅堆(Shallow Heap) 是指一个对象所消耗的内存。Retained Heap的大小为回收它时候能回收的heap大小,包括回收它能直接/间接引用到的对象大小的总和(不包括被GC Root直接间接引用的),从下图看出,本次是log4j日志占的比重较大。
在这里插入图片描述

方式二、 Mat插件
在eclipse的编辑栏 -> help -> Install New Software,如下图所示。
在这里插入图片描述
在弹出的页面输入 http://download.eclipse.org/mat/1.8/update-site/,如下图所示。
在这里插入图片描述
点击 ok 后,远程搜索,显示结果,勾选 Memory Analyzer for Eclipse IDE 即可。
在这里插入图片描述
点击next 后,直接等待安装即可。
在这里插入图片描述
插件的方式也可查看内存占用情况。

http://www.lryc.cn/news/281181.html

相关文章:

  • C语言代码 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
  • 【RTOS】快速体验FreeRTOS所有常用API(4)队列
  • 【开题报告】基于SpringBoot的美食制作学习网站的设计设计与实现
  • Rosalind Java|Speeding Up Motif Finding
  • 打印的前后顺序
  • Android Retrofit使用详情
  • 安全加密算法
  • 软件测试|使用matplotlib绘制多种饼图
  • vue3-响应式基础之ref
  • 华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信
  • 代码随想录算法训练48 | 动态规划part09
  • 2024最新适用于 Windows 、Mac 的最佳屏幕录制软件
  • 【Docker】概述与安装
  • 衡水学院新人真题百练2022(1-20)修订版
  • 远程调用(OpenFeign)
  • 智能光栅光片显微成像技术的LabVIEW解决方案
  • 手撕乘积(**Multiplication** **Product**): 穷举和图示(2) 点积的几何意义
  • postman环境变量全局变量设置
  • Linux 内核线程
  • Golang学习之路一七fmt的使用
  • windows使用redis-安装和配置
  • Kafka系列(一)
  • Kotlin中的委托
  • VUE2/3:element ui table表格的显隐列(若依框架)
  • PTA-7-4 堆排序
  • uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)
  • git 删除 submodule 子模块的步骤
  • 一文彻底解析 Compose 的穿透刺客 -- CompositionLocal
  • iOS 位移枚举NS_OPTIONS(如何实现多个枚举值的同时传入判断)
  • 【Axure高保真原型】树控制内联框架