今天第二篇采坑了... ...
现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节


情况是一台服务器一启动就开始full gc,短短1分钟可以有几十次的full gc.
主要几个配置参数为-Xmx2g -XX:NewRatio=3(CMS相关和其他的和这次无关不列了) 很简单的参数.
下意识dump了heap,结果并没什么特别明显的问题.
在想是不是内存不够,加到3g还是一样的问题.

那似乎只能看是不是业务代码有内存泄漏了.
jmap -histo:live看了下也是很常见的一些类(而且上面还做过heap分析).

开始陷入沉思,突然发现了一个诡异的点...jmap -heap old区很小... ...多试了几次依旧是很小...
这不科学

jstat -gcoldjstat -gcnew一看....old的容量只有400M 而young的只有100多M 差不多是设置的newRatio的值
使用jcmd pid VM.flags一看,发现-XX:MaxNewSize被设置成了100多M... ...就算是Xmx2g,实际使用才400多M,这点内存完全不能满足应用的正常使用.

之后添加了-Xms解决.(这点存疑 估计还修改了其他配置 见下面分析)

但其实还是有些问题遗留,默认的MaxNewSize为什么只有100多M...
简单的分析,MaxNewSize没有默认设置,那他的值来源于Xmx和NewRatio(Xmx / (newRatio + 1)),验证如下:
java -XX:NewRatio=3 -XX:+PrintFlagsFinal -version | grep New(不去连线上了..本地操作 windows下用findstr)

的确如此.

线上出问题的只有100多M,也就是Xmx参数可能被错误配置或者被覆盖了(模拟后面的Xmx覆盖了前面的)

最后的配置修改不是亲手做的一些项也无法确定了...


不过这次发现的问题也很明显
首先是监控,这台服务的gc日志没有被收集导致一开始没有历史记录(图1),有的话一眼就看出heap过小.
其次是思维定势了,遇到fgc想当然先去分析dump,浪费了时间.


总结一下这次使用的命令:
寻找java进程:
jps

查看gc情况(最后两个数字是间隔ms和打印次数):
jstat -gcutil|gcold|gcnew pid 1000 10

查看系统属性:
jcmd process_id VM.system_properties

JVM启动用的命令行:
jcmd process_id VM.command_line

显示调优标志:
jcmd process_id VM.flags [-all]

heap dump:
jmap -dump:format=b,file=test.bin pid

查看堆使用情况:
jmap -heap pid

查看存活对象:
jmap -histo:live pid

查看默认配置:
java -XX:+PrintFlagsFinal -version | grep HeapSize


参考资料:
https://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html
https://stackoverflow.com/questions/4667483/how-is-the-default-java-heap-size-determined
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html

记一次令人窒息的线上fullgc调优的更多相关文章

  1. 记一次线上gc调优的过程

           近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...

  2. 纪一次线上cms调优

    过去也有对JAVA性能调优的分析,有过以下case: 1. JVM outOfMemory, 主要是使用jmap dump 出来 hprof,使用MAT进行分析 2. JVM outOfMemory, ...

  3. MySQL慢查询优化(线上案例调优)

    文章说明 这篇文章主要是记录自己最近在真实工作中遇到的慢查询的案例,然后进行调优分析的过程,欢迎大家一起讨论调优经验.(以下出现的表名,列名都是化名,实际数据也进行过一点微调.) PS:最近做了一个面 ...

  4. 记录一次线上OOM调优经历

    现状: k8s 的一个pod 有32G内存,每秒产生新对象的峰值在900Mb ---- 1900Mb(根据jstat计算Eden区获得) . 修改之前的参数 就一个命令行参数是-Xmx31g; 我修改 ...

  5. 记Booking.com iOS开发岗位线上笔试

    今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为 ...

  6. 记一次log4j日志导致线上OOM问题案例

    最近一个服务突然出现 OutOfMemoryError,两台服务因为这个原因挂掉了,一直在full gc.还因为这个问题我们小组吃了一个线上故障.很是纳闷,一直运行的好好的,怎么突然就不行了呢... ...

  7. 记一次ArrayList产生的线上OOM问题

    前言:本以为(OutOfMemoryError)OOM问题会离我们很远,但在一次生产上线灰度的过程中就出现了Java.Lang.OutOfMemoryError:Java heap space异常,通 ...

  8. 记一次asp.net core 线上崩溃解决总结

    1.首先要先准备好环境,安装lldb 工具 要安装3.9版本的,因为每个版本对应dnc版本不一样,3.9的支持2.2 版本,然后确定分析的机器里dnc 版本和线上的生产环境是否一致,自己安装比较费劲, ...

  9. 记一次 Kafka 集群线上扩容

    前段时间收到某个 Kafka 集群的生产客户端反馈发送消息耗时很高,于是花了一段时间去排查这个问题,最后该集群进行扩容,由于某些主题的当前数据量实在太大,在对这些主题迁移过程中话费了很长一段时间,不过 ...

随机推荐

  1. 为什么MySQL数据库要用B+树存储索引?

    小史:树的话,无非就是前中后序遍历.二叉树.二叉搜索树.平衡二叉树,更高级一点的有红黑树.B 树.B+ 树,还有之前你教我的字典树. 红黑树 一听到红黑树,小史头都大了,开始抱怨了起来. 小史:红黑树 ...

  2. 《ServerSuperIO Designer IDE使用教程》- 6.增加与阿里云物联网(IOT)对接服务,实现数据交互。发布:v4.2.4 版本

    v4.2.4 更新内容:1.增加了对接阿里物联网平台的服务.下载地址:官方下载   6. 增加与阿里云物联网(IOT)对接服务,实现数据交互  6.1    概述 为了满足业务系统数据上云的要求,Se ...

  3. 948. Bag of Tokens

    https://leetcode.com/problems/bag-of-tokens/ 一开始觉得应该是个dp 题,把所有结果搜出来然后max 一下.实现以后发现组合太多了,非常慢,即使加上memo ...

  4. 小程序实现GBK编码数据转为Unicode/UTF8

    首先,不存在一种计算算法将GBK编码转换为Unicode编码,因为这两套编码本身毫无关系. 要想实现两者之间的互转,只能通过查表法实现. 在浏览器中实现编码转换,只需要简单两句: var x = ne ...

  5. Codeforces 279D The Minimum Number of Variables 状压dp

    The Minimum Number of Variables 我们定义dp[ i ][ mask ]表示是否存在 处理完前 i 个a, b中存者 a存在的状态是mask 的情况. 然后用sosdp处 ...

  6. UOJ#73. 【WC2015】未来程序 提交答案题

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ73.html 前言 纯属理性愉悦. 题解 Subtask1 发现就是求 $a \times b \mod c $ . 写个 ...

  7. Android进阶:三、这一次,我们用最详细的方式解析Android消息机制的源码

    决定再写一次有关Handler的源码 Handler源码解析 一.创建Handler对象 使用handler最简单的方式:直接new一个Handler的对象 Handler handler = new ...

  8. 第二项目AIaisell(易销宝)

    一.什么是报表 向上级报告情况的表格.简单的说:报表就是用表格.图表等格式来动态显示数据,可以用公式表示为:“报表 = 多样的格式 + 动态的数据” 表格:详细数据 图表: 直观 二.表格数据展示 2 ...

  9. 指针*p,p,&p等辨别

    #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main ...

  10. python3_list

    name = ['like','new','book',['fa','fdsa'],'new','book','why']#这是个列表 print(name)#把列表打印出来 查 print(name ...