优秀的编程知识分享平台

网站首页 > 技术文章 正文

性能测试之内存分析OOM(内存测试结果)

nanyue 2024-07-30 03:38:00 技术文章 7 ℃

内存分析工具

jmap jvm自带的分析工具 jmap 【options】pid

  • -dump:生成java堆栈的快照信息
  • -heap:显示java堆详细信息,使用哪种回收机制、参数配置、分代情况
  • -histo:显示堆中对象统计信息,包括类、实例数量
  • jamp -F -dump:format=b,file=文件名.bin 进程id ===执行时间比较长,需要等待结束

arthas

阿里巴巴开源的java诊断工具,实现jvm几乎所有的诊断功能

执行命令: java -jar arthas-boot.jar

内存泄露的抓包 headdump 监控大盘

内存分析实战

部署项目 模拟超时的代码

环境:jdk1.8

将jvm虚拟机改小

  • 1.Xms512m,最小内存
  • 2.Xmx1024m,最大内存
  • 3.XX:ReservedCodeCacheSize预留代码缓存的大小
  • 4.-XX:+UseConcMarkSweepGC,设置年老代为并发收集

将springboot服务生成jar,部署到服务器

mvn -Dmaven.test.skip -U clean package

nohup java -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=128m -server -Dserver.port=8087 -jar zctest.jar 'cztest' --spring.profiles.active=dev >>./test_info_8099.log 2>&1 &
  • nohup :不挂断地运行命令用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
  • java -jar: 执行jar包
  • -Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m 指定运行内存
  • -server -Dserver.port=8087 指定运行端口
  • --spring.profiles.active=dev 使用对应配置文件
  • >>./test_info_8099.log 生成日志
  • 2>&1 & 输入/输出重定向日志文件中
  • & 符号是把该命令以后台的job的形式运行
#给shell脚本赋值
chmod +x startboot.sh
#改名
mv cztest-0.0.1-SNAPSHOT.jar zctest.jar
#给boot、服务的jar 赋值
chmod +x zctes.tjar
#查看日志 
tail -500f test_info_8099.log

配置tomcat的堆栈: catalina.sh 文件增加JAVA OPTS=”-Xms256m -Xmx256m -Xmn128m

  • -Xms初始堆
  • -Xmx最大堆空间
  • -Xmn新生代大小

访问接口:

生成内存溢出堆栈文件

杀掉测试项目

启动服务的pid和内存信息

使用ps-ef|grep java 获取进程id jps也可以获取

通过jmap获取信息

jmap -dump:live,format=b,file=heap_zctest_202212051.hprof 35025


使用arthas诊断

安装 curl -O https://arthas.aliyun.com/arthas-boot.jar

使用 java -jar arthas-boot.jar

heapdump ,在出现内存溢出的错误是,执行这个命令,可以直接下载heapdump信息

使用dashboard 查看内存信息

heapdump 分析 直接下载heapdump信息

生成文件

使用MAT MemoryAnalyzer分析heap文件

histogram 可以看到具体耗时的类,图中为上面 模拟超时的代码所报的错

Histogram:列出内存中的对象,对象的个数及大小

  • class Name 类名,出问题的类
  • objects(类的对象数量、对象被创建的次数)
  • shallow(浅) heap 浅堆 对象内存消耗大小,不包括其他对象的引用
  • Retained(保留) head 被GC能回收的内存的总和

内存分析

使用命令在jar 命令后追加 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime 可以查看jvm的gc信息

jstat 使用 jstat jdk自带的gc工具

jstat -gcutil pid1000 10 分析gc 每间隔10000ms 显示一次gc信息,总共显示10次

  • S0:新生代susvivor0区
  • S1:新生代susvivor1区
  • E:新生代eden区
  • O:年老代
  • M:方法区回收比例 CCS:类空间回收比例
  • YGC:minor gc次数
  • YGCT: minor gc耗费的时间
  • FGC: full gc的次数
  • FGCT: full gc的耗时
  • GCT: gc总耗时
最近发表
标签列表