前言

最近遇到一个Jvm old过高的案例,现象是一个站点的jvm old区过高,分析原因是,原来的设计方案有问题,给前端返回的数据里面包含了大量的html代码,从存储中拿数据的过程、拼接数据的过程过于漫长了,造成了大量对象的生命周期过长,对象被 标记到了old中,造成了old区过高,监控系统进行了报警,详细原因就不做详细分析了,主要分享一下问题排查的过程。

收到了监控系统的报警,在服务器上查询jvm内存情况

jstat -gcutil pid 时间间隔,可以按时间间隔打印jvm的内存情况,例如:

jstat -gcutil 30922 1000

jvm进程30922的内存情况

大致说一下,S0,S1这些的含义:

S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

E: 年轻代中Eden(伊甸园)已使用的占当前容量百分比

O: old代已使用的占当前容量百分比

P: perm代已使用的占当前容量百分比

YGC: 从应用程序启动到采样时年轻代中gc次数

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)

FGC: 从应用程序启动到采样时old代(全gc)gc次数

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)

GCT: 从应用程序启动到采样时gc用的总时间(s)

从内存情况,来看,S0、伊甸园已经被打满,old已经被打满,排除了是大对象实例过多直接把old打满的情况,继续分析

查看应用启动的jvm参数

-Xms2g -Xmx2g -Xmn1g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 -XX:CMSInitiatingOccupancyFraction=80

说两个参数的含义吧

XX:SurvivorRatio=4,这个参数的意思是Survivor两个区与新生代的比例,设置为4的意思是两个区与新生代的比例为2:4,MaxTenuringThreshold=10, 这个参数的意思是对象标记多少次后记为old对象,放入到老年代中,设置为10就是新生代对象被标记10次还没有释放,就放到老年代中,从参数上看,造成old区过高报警的原因是有的对象在新生代中,被标记了10次都没有被释放,被放入到了老年代中,造成了老年代过大,FGC频率过高

经朋友指点,这一块的分析有问题,有问题的分析留着,再贴一下朋友的分析,对比一下

动态对象年龄判定:为了能更好地适应不同程度的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升到老年代,如果在Survivor空间中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄

朋友的指导

导出dump文件,使用jvisualvm.exe查看

导出dump文件的过程就不赘述了,简单贴一下命令

jmap -dump:format=b,file=serviceDump.dat pid

jvisualvm是一个jdk自带的内存分析工具,一般位置在jdk安装目录下:

C:\Program Files\Java\jdk1.8.0_141\bin\jvisualvm.exe

jvisualvm工具界面

在这选择已经导出的dump文件,查看内存中类的实例数、实例大小

查看类的实例数

发现是Char[],String,HashMap这三个的实例是jvm中最多的,实例数分别占31%、30.9%、30.2%,总共占了92.1%,实例的大小分别占35.8%、14.6%、22.4%,总共占了72.8%,主要是这三个类的实例占用过大的内存

查看Char[]的实例信息

点击去,查看Char[]的实例信息,从大到小的排列

有一些实例比别的实例大很多

查看最大的这些实例,发现这些实例里面的内容是

java old区_一次Jvm old过高的排查过程实战记录相关推荐

  1. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  2. jvm对于java的意义_谈谈对JVM的理解

    JVM可谓是学习JAVA基础中的基础了,但仍有不少同学对JVM概念还是比较模糊,甚至没有听说过,对java的理解也只是在基础语法 层面,本文就将对JVM进行初步介绍,因篇幅所限,只能介绍JVM基础,如 ...

  3. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

  4. java内存区_基于jvm java内存区域的介绍

    jvm虚拟机在运行时需要用到的内存区域.广泛一点就是堆和栈,其实不然,堆和栈只是相对比较笼统的说法,真正区分有如下几个 先上图一: 总的就是 java的内存模型 内存模型又分堆内存(heap)和方法区 ...

  5. java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章

    写在前面 本节常见面试题: 问题答案在文中都有提到 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断 ...

  6. java 内存跟踪_详解JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  7. java heap 内存_深入理解jvm之内存区域与内存溢出

    Java内存区域与内存溢出异常 运行时数据区域 程序计数器当前线程所执行的字节码的行号指示器 当前线程私有 不会出现OutOfMemoryError情况 java虚拟机栈线程私有,生命周期与线程相同 ...

  8. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

  9. 修改java启动参数_如何修改jvm启动参数

    用java命令查看. 用java -option进行修改参数. 还有tomcat,eclipse启动时通过配置文件加载的. 详细如下: 安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Ja ...

最新文章

  1. 使用友盟+的APM服务实现对移动端APP的性能监控
  2. 关于数据挖掘关联规则的Oracle实现
  3. react setState里的作用域
  4. springAOP之代理
  5. linux(ubuntu)下C++访问mysql数据库
  6. 6. 区别值类型和引用类型。
  7. windows启动linux系统,windows 10 启动linux系统
  8. cgi php是什么意思,cgi,fastcgi,php-cgi,php-fpm 是什么
  9. Xshell不能链接虚拟机(可ping通)--解决方案
  10. linux7关闭开机自启,redhat7 设置开机自启
  11. 简单的Map集合练习题
  12. android developer tools下载地址
  13. 适配iPhone XR/iPhone XS Max
  14. 【随机过程】课后作业 1-条件概率期望密度
  15. 肖博数学高考数学快速解题法及秒杀向量问题总结
  16. 关于送货单的格式要求?
  17. iOS 真机调试包(最新 16.1 真机调试包)
  18. 使用plugman开发cordova 高德地图定位插件
  19. 读书之后写笔记的软件哪个好
  20. 微信小程序 后台播放,多页面播放

热门文章

  1. Nginx支持WebSocket反向代理-学习小结
  2. Collections.sort()和Arrays.sort()排序算法选择
  3. day21 java的数字类
  4. php border-style,border-style
  5. java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
  6. oracle 分析函数_数据分析系列笔试题(6)
  7. 环回测试能够提供什么信息_VIAVI | 全面对比“真双向分析”与“环回测试”,结果一目了然!...
  8. 自定义php报错信息,自定义PHP的错误报告处理方式
  9. blade php代码,Laravel 5框架学习之Blade 简介
  10. orgmode导出html,含有python代码块的ORG-MODE导出为HTML时出错