过去也有对JAVA性能调优的分析,有过以下case:

1. JVM outOfMemory, 主要是使用jmap dump 出来 hprof,使用MAT进行分析

2. JVM outOfMemory, 使用jmap dump 出来hprof, 使用jhat 找出异常内存对象

3. JVM调优,程序运行1个月后崩溃

4. JVM调优,根据JFR 采样,分析性能消耗在哪里,如何优化高频的性能消耗。

等等其他(如 多线程竞争锁导致的性能下降等)。

这次的case 比较有意思,所以记录下来。

先描述本次调优的现象是这样的(无法截图):

1. 进程是一个监听MQ, 进行内存运算,存储到redis的应用

2. 在业务高峰期会有若干次CMS, 不连续,每个小时都有那么几次。

3. old 区根据监控,可以看到只使用了30~40M 空间,并且cms发生后old一直平稳

4. metaspace 缓慢增长到60M, ccs 到6M左右(metaspace 是jdk1.8才有)

排查过程如下:

1. 先回顾下cms 触发条件:

a) metaspace 空间满足一定条件

b)system.gc

c) 新生代promotion failure(具体条件也比较复杂,基本是要比较old 区的可用空间是否可以容纳promotion size)

d) Fullgc 降级

e) old 区满足大于 cms 50%, (不够精确,这个要参考一系列的计算公式)

f) CMSClassUnloadingEnabled 情况下,也可能触发 CMS

2. 排查思路

a)首先old区并没有满足50%, 说明不是因为老生代空间不足引起的,也应该不是新生代promotion 引起的

那么可能得原因:

1) metaspace 空间的问题

2) fullgc 降级

3)System.gc

4)其他未知原因

2.1 对于metaspace 的问题排查过程如下

a) 使用jinfo -flags pid | grep Metaspace

b) 使用jstat -gc pid  可以看到metaspace空间的变化

c) 因为 metaspace实际上是使用的directmemory,而不是堆上的空间,再评估过我们的实际cms 触发规律和metaspace 曲线并无重叠

因而怀疑,并无关联。

因此,写了一段代码来进行模拟

package gc;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException; import java.io.IOException; public class GcMetaspace { //one simple jvm using default parameters for jvm.
//use -Xmx64m -Xms64m -Xmn16m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC
public static void main(String[] args) throws IOException, CannotCompileException, NotFoundException { ClassPool classPool = new ClassPool(true);
classPool.insertClassPath(".");
for(int i=0;i< 23950;i++){
CtClass clazz = classPool.makeClass("cn.lykm.SubType"+i);
Class toClass= clazz.toClass();
System.out.println("processing is " + toClass.getName());
}
System.out.println("finish ");
System.in.read();
}
}

发现如果是metaspace 引起的gc,确实是cms,不过也会触发Fullgc, 而且根据应用来判断,也比较规律。

因此排除Metaspace 嫌疑

2.2 Fullgc 降级

gc.log中并无Fullgc 字样,也没有类似的gc cause分析。因此排除

2.3 System.gc

这个日志也没有相关内容,而且确实也容易关闭,使用 -XX:+DisableExplicitGC 即可

2.4 其他

首先启用 -XX:+UseCMSInitiatingOccupancyOnly 缩减cms 触发条件。再进行观测

纪一次线上cms调优的更多相关文章

  1. 记一次令人窒息的线上fullgc调优

    今天第二篇采坑了... ... 现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节 情况是一台服务器一启动就开始full gc,短短1分钟可以有几 ...

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

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

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

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

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

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

  5. linux上性能调优常用命令及简介

    1.综合命令:nmon.top:topas(aix) d :磁盘相关 c:cpu相关 m:内存相关 2.磁盘 2.1 测试顺序写性能dd if=/dev/zero of=/cdr/test.data ...

  6. Twitter 工程师谈 JVM 调优

    一. 调优需要关注的几个方面 内存调优 CPU 使用调优 锁竞争调优 I/O 调优 二. Twitter 最大的敌人:延迟 导致延迟的几个原因? 最大影响因素是 GC 其他的有:锁和线程调度.I/O. ...

  7. redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)

    对这段时间redis性能调优做一个记录. 1.单进程单线程 redis是单进程单线程实现的,如果你没有特殊的配置,redis内部默认是FIFO排队,即你对redis的访问都是要在redis进行排队,先 ...

  8. GC调优

    Gc调优的目标:1.降低停顿时间 2.提高吞吐量 3.避免full-gc 调优可以使用的手段:1.各个内存区的大小调整:堆,年轻代,老年代,方法区等等2.减少短暂对象的存活时间,提高长期对象的复用率( ...

  9. GC调优在Spark应用中的实践(转载)

    Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...

随机推荐

  1. 4GB以上超大文件上传和断点续传服务器的实现

    随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的 ...

  2. A*G/C011

    A*G/C011 A Airport Bus 不会zbl/kk B Colorful Creatures 枚举每个开始的点直接倍增 我好像sb了,可行的是一段前缀所以可以直接2分 C Squared ...

  3. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  4. Golang 接口

    1 接口是什么 Golang中没有像Python.Java拥有类和对象的概念,其封装对象或说明对象是通过接口来实现的.比如谁能够实现什么样的功能,便能够将其抽象化封装. 接口定义了一组方法(抽象方法集 ...

  5. R包 survival 生存分析

    https://cran.r-project.org/web/packages/survival/index.html

  6. vue中select设置默认选中

    vue中select设置默认选中 一.总结 一句话总结: 通过v-model来:select上v-model的值为option默认选中的那项的值(value) 二.select设置默认选中实例 < ...

  7. MyBatis(六):Mybatis Java API编程实现一对多、一对一

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  8. zookeeper生产最广泛使用java客户端curator介绍及其它客户端比较

    关于zookeeper的原理解析,可以参见zookeeper核心原理详解,本文所述大多数实践基于对zookeeper原理的首先理解. Curator是Netflix公司开源的一个Zookeeper客户 ...

  9. 小米手机root

    目录 概念 解锁流程 root流程 如何Root? 关于supersu 关于twrp 关于Magisk Manager ref: 申请开发板流程 线刷教程 小米手机root 概念 解锁: 使手机可以刷 ...

  10. spring与springMVC的父子容器关系

    背景和概述 在spring与springMVC中通过IOC可以管理bean对象,有两个配置文件可以配置ioc spring的配置文件applicationContext.xmlspringMVC的配置 ...