记一次令人窒息的线上fullgc调优
今天第二篇采坑了... ...
现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节
情况是一台服务器一启动就开始full gc,短短1分钟可以有几十次的full gc.
主要几个配置参数为-Xmx2g -XX:NewRatio=3(CMS相关和其他的和这次无关不列了) 很简单的参数.
下意识dump了heap,结果并没什么特别明显的问题.
在想是不是内存不够,加到3g还是一样的问题.
那似乎只能看是不是业务代码有内存泄漏了.
用jmap -histo:live看了下也是很常见的一些类(而且上面还做过heap分析).
开始陷入沉思,突然发现了一个诡异的点...jmap -heap old区很小... ...多试了几次依旧是很小...
这不科学
用jstat -gcold和jstat -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调优的更多相关文章
- 记一次线上gc调优的过程
近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...
- 纪一次线上cms调优
过去也有对JAVA性能调优的分析,有过以下case: 1. JVM outOfMemory, 主要是使用jmap dump 出来 hprof,使用MAT进行分析 2. JVM outOfMemory, ...
- MySQL慢查询优化(线上案例调优)
文章说明 这篇文章主要是记录自己最近在真实工作中遇到的慢查询的案例,然后进行调优分析的过程,欢迎大家一起讨论调优经验.(以下出现的表名,列名都是化名,实际数据也进行过一点微调.) PS:最近做了一个面 ...
- 记录一次线上OOM调优经历
现状: k8s 的一个pod 有32G内存,每秒产生新对象的峰值在900Mb ---- 1900Mb(根据jstat计算Eden区获得) . 修改之前的参数 就一个命令行参数是-Xmx31g; 我修改 ...
- 记Booking.com iOS开发岗位线上笔试
今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为 ...
- 记一次log4j日志导致线上OOM问题案例
最近一个服务突然出现 OutOfMemoryError,两台服务因为这个原因挂掉了,一直在full gc.还因为这个问题我们小组吃了一个线上故障.很是纳闷,一直运行的好好的,怎么突然就不行了呢... ...
- 记一次ArrayList产生的线上OOM问题
前言:本以为(OutOfMemoryError)OOM问题会离我们很远,但在一次生产上线灰度的过程中就出现了Java.Lang.OutOfMemoryError:Java heap space异常,通 ...
- 记一次asp.net core 线上崩溃解决总结
1.首先要先准备好环境,安装lldb 工具 要安装3.9版本的,因为每个版本对应dnc版本不一样,3.9的支持2.2 版本,然后确定分析的机器里dnc 版本和线上的生产环境是否一致,自己安装比较费劲, ...
- 记一次 Kafka 集群线上扩容
前段时间收到某个 Kafka 集群的生产客户端反馈发送消息耗时很高,于是花了一段时间去排查这个问题,最后该集群进行扩容,由于某些主题的当前数据量实在太大,在对这些主题迁移过程中话费了很长一段时间,不过 ...
随机推荐
- SQLSERVER的递归
实际项目如遇到按照如地区这样树状结构的条件递归查询数据的场景中,可以使用. CREATE FUNCTION [dbo].[GetAllChildrenTypeById] ( ) ) RETURNS T ...
- react native 项目版本升级
首先说明一下rn项目的一种相当顺滑升级方法: 1.全局安装react-native-git-upgrade npm i -g react-native-git-upgrade 2. 在项目目录下执行命 ...
- js实现页面重新加载
https://blog.csdn.net/wangjian530/article/details/80596801
- 2018年多校第三场第一题 A. Ascending Rating hdu6319
比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating hdu6319 题 ...
- CodeForces 510C Fox And Names (拓扑排序)
<题目链接> 题目大意: 给你一些只由小写字母组成的字符串,现在按一定顺序给出这些字符串,问你怎样从重排字典序,使得这些字符串按字典序排序后的顺序如题目所给的顺序相同. 解题分析:本题想到 ...
- 启动nginx报错问题
为了解决生产环境的bug,模拟生产环境,我使用了nginx,在安装启动的过程中,出现了很多问题. 1.nginx下载地址 http://nginx.org/en/download.html 这是ngi ...
- 极速创建 IOS APP !涛舅舅苹果 IOS APP自助生成系统正式上线
经过大量的测试和开发工作,涛舅舅苹果 IOS APP自助生成系统正式上线! 本系统主要功能: 1.用最最简单的方式将H5网站打包生成一个苹果APP 2.只需要提供APP标题,H5网站首页url地址,一 ...
- 利用Github免费搭建个人主页(转)
搭建过程涉及: Github注册 Github搭建博客 域名选购 绑定域名 更多 一. Github注册 在地址栏输入地址:http://github.com/join填写相关信息, 按步骤完成即可 ...
- 关于VB里判断逻辑的说明
如上图,当进行连续判断的时候,即使第一个已经不符合条件了,后面的依然会计算.这点一定要记住,除非你所有的函数都有必要执行,否则会导致效率降低. 减代码不一定能提高效率,对于IIF和连续判断写法,貌似很 ...
- maven 禁止连接外网仓库
有些内网机器不能连外网的情况下,因为依赖的项目pom配置问题,mvn package时仍会尝试请求外网的repo(比如默认中央repo或oss). 此时配置 settings.xml 为自己内网rep ...