有过JVM调优经验吗【面试题】

news2024/11/17 17:32:47

写作目的

JVM其实比较偏理论的,日常工作中很少遇到。但是面试他问,所以需要自己mock一下场景进行准备这个问题的回复。
本次分析的场景的元空间太小导致频繁FGC的问题

源码&启动参数

gitee下载源码

启动-调优前

nohup java    -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=60m  -XX:+UseConcMarkSweepGC   -Xmx2g  -Xms2g  -XX:+PrintGCDetails    -jar  springboot-demo-0.0.1-SNAPSHOT.jar  &

启动-调优后

nohup java    -XX:MetaspaceSize=160m -XX:MaxMetaspaceSize=160m  -XX:+UseConcMarkSweepGC   -Xmx2g  -Xms2g  -XX:+PrintGCDetails    -jar  springboot-demo-0.0.1-SNAPSHOT.jar  &

复现步骤

  • 首先在服务器上使用 调优前 的脚本启动jar
  • 查看java的进程ID,然后查看进程的GC情况
    在这里插入图片描述
  • 在服务器上输入 curl localhost:8080/demo2 ,然后就会出现上图中的红框中的变化,即出现了FGC

回答面试题-通过生产案例说明进行调优

表象:为什么需要调优

我的生产环境是JDK8版本,垃圾收集器使用的是ParNew和CMS收集器。
当时是上线的一个大版本,其中包含了很多类,每一个类有很多属性。
灰度发布的时候发现新的机器出现了频繁的FGC报警。之前FGC是一星期都不会有一次,现在是5秒一次,这种是很反常的。对代码进行重新review后发现逻辑没问题,所以可以判断是需要调优的。

过程:使用了什么命令表现了什么数据

从理论上可以知道出现FGC是老年带或者元空间满导致的,首先要判断老年代还是元空间导致的FGC。
首先通过jstat -gc命令查看了GC的情况及各个带的情况。发现老年带和元空间都是没满,但是实际上元空间是满(不是到100%才GC,这有一个阈值,可百度)的。
在这里插入图片描述
我们初步定位到元空间导致FGC的原因。那我们就可以通过参数把元空间调大

-XX:MetaspaceSize=999m -XX:MaxMetaspaceSize=999m

然后重新发布后发现确实没FGC了,一切正常

分析:为什么会出现GC以及知识点

理论:讲道理

简单贴一下demo的代码。类多且属性多(mock的类TestModel 有700个属性),通过反射调用16次

 int size = 700;


    Class<?> clazzTestModel = Class.forName("com.example.gcdemo.gcc.TestModel");
    TestModel testModel = new TestModel();
    for (int i = 0; i < size; i++) {

      //jni调用转为本地调用
     int inflationThreshold = 16;

      for (int i1 = 0; i1 < inflationThreshold; i1++) {
        Method method = clazzTestModel.getMethod("setField" + i, String.class);
        method.invoke(testModel, String.valueOf(i));
      }
    }

看一下反射invoke到底是做的什么操作。直接跟进到下面的方法
在这里插入图片描述
反射的底层就是调用的NativeMethodAccessorImpl方法的invoke方法。如果调用次数超过15次,则会走if方法。
在这里插入图片描述
而这个generate方法就会生成一个Class文件(怎么能证明是Class文件:百度Class文件的结构,然后看这坨generate代码)。
一个方法反射15次就会生成一个Class文件,我很多类很多方法自然就会生成很多Class类,把元空间撑爆了。

实践:看元空间有啥

在这里插入图片描述
发现了下面的一堆,和理论一致
![在这里插入图片描述](https://img-blog.csdnimg.cn/53ac1b41574c4a00afbf026a8ae931c0.png在这里插入图片描述

继续秀:我还关注到了年轻代GC

我还关注了年轻代GC且加机器解决。重点表达不需要调整,能通过机器(钱)解决就是小问题。

当然也发现年轻代的GC也会频繁一些,原来是5秒一次年轻代GC,现在4秒左右,其实也合理。因为增加了一个业务线,流量变大,new的对象自然变多了。所以年轻代的GC不需要调整。
后面是通过加机器把这个年轻代的GC又变回的原来的样子。

命令整理

  • 查看java进程的gc情况
 jstat -gc pid9527 1000
  • 查看元空间的内容
 jcmd pid9537 GC.class_histogram
  • Arthas
    贼贼贼好用 https://arthas.aliyun.com/doc/

参考

面试官:如何进行 JVM 调优(附真实案例)【转载】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】SQL索引失效的几种场景及优化

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法&#xff0c;并且加快查询的速度&#xff0c; 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速度&#xff0c;…

C++之函数模板高级用法(一百五十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

两个好用到爆的Python模块,建议收藏!

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

基于单片机的智能鞋柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过DHT11温湿度采集&#xff1b;通过按键设置逻辑处理&#xff1b;通过LED紫外线消毒&#xff1b;通过继电器控制风扇进行换气除湿&#xff1b;通过继电器控制加热片进行加热&#xff1b;整个电路以5v供电; 电路图 PCB 源代码 #i…

nodejs 读取xlsx 文件转json 格式(包含表格时间类型)

需求概要&#xff1a;从xlsx 文件中读取内容转化成想要的json 格式&#xff0c;用于web 读取数据 newDoc.xlsx文档内容大概&#xff1a; 本内容主要是更新前端公告内容&#xff0c; const xlsx require(node-xlsx) const fs require(fs) const moment require(moment)//转换…

双非本大二上岸大厂——念念不忘,必有回响

⭐️前言⭐️ 博主就读于一所普通的学校&#xff08;双非本&#xff09;&#xff0c;在大二下学期3月份开始网上投递简历&#xff0c;历时近百余天&#xff0c;投递简历500&#xff0c;面试近40余场&#xff0c;最终在6月份学期末&#xff0c;斩获了两个大厂offer&#xff08;北…

最小栈——力扣155

方法&#xff1a;辅助栈 这些函数中只有求最小值函数需要借助辅助栈 代码如下&#xff1a; class MinStack {stack<int> x_stack;stack<int> min_stack; public:MinStack() {min_stack.push(INT_MAX);}void push(int val) {x_stack.push(val);min_stack.push(…

使用Java计算课程绩点、课程学分绩点、总绩点

1、定义实体类 实体类中包括属性表 名称释义xuefen该课程学分chengji该课程取得的成绩xuefenjidian该课程取得的学分绩点xuefen该课程取得的学分 其中有式子&#xff1a; j i d i a n ( c h e n g j i − 50 ) 10.0 jidian \frac{(chengji-50)}{10.0} jidian10.0(chengji−…

【Azure】解析 Microsoft Defender for Cloud:云安全的保护与管理

你在使用自己的电脑的时候&#xff0c;作为安全防护你可能直接装个杀毒软件&#xff0c;或者什么xx管家之类的&#xff0c;那么你是否有想过&#xff0c;如果我有一套云服务之后&#xff0c;我应该如何进行安全防护呢&#xff1f;本文带你了解在 Azure 云中的安全防护体系&…

同余最短路

同余最短路就是把每一个同余类当成一个结点&#xff0c;在同余类之间建边&#xff0c;然后跑最短路 答案统计的时候对每个同余类单独计算贡献 题意&#xff1a; 思路&#xff1a; 答案可以对模X的所有同余类计算贡献 设dis[i]为在模X意义下&#xff0c;Y和Z之后%X余数为i的…

数据库练习

数据库练习 建立三张表&#xff0c;以及表中的联系 由于学生表中存在外键&#xff0c;所以我们需要先创建课程表和班级表 课程表 mysql> create table course(-> course_id int primary key auto_increment comment 课程编号,-> course_name varchar(10) not null…

【C++初阶】C++入门——引用

文章目录 一、引用的概念二、共用同一块空间验证三、引用的特性3.1 引用在定义时必须初始化3.2 一个变量可以有多个引用3.3 引用不能改变 四、引用的使用场景4.1 做参数4.2 做返回值 五、传值、传引用效率比较六、常引用6.1 权限放大——不被允许6.2 权限平移6.3 权限缩小6.4 赋…

MYSQL索引为啥要用B+树储存数据呢

首先我们来分析一下需求 MYSQL索引需要怎样的数据结构 为了防止数据因为特(duan)殊(kai)情(dian)况(yuan)丢失,我们的数据肯定是要持久化的,也就是保存在硬件(磁盘)里面,而我们知道 磁盘相对于内存来讲 速度要慢了几万倍 甚至即使万倍 所以我们必须减少磁盘的I/O操作 再有呢…

电子时钟制作(瑞萨RA)(10)----电容触摸配置

概述 这篇文档将创建一个使用 e2 studio 集成 QE 的电容式触摸应用示例。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是芯片型号R7FA2E1A72DFL的开发板&#xff1a; 视频教程 https://www.bilibili.com/video/BV14h4y1E7py/ 电子时钟制作(10)----电容触摸配…

python接口自动化(二十三)--unittest断言——上(详解)

简介 在测试用例中&#xff0c;执行完测试用例后&#xff0c;最后一步是判断测试结果是 pass 还是 fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。用 unittest 组件测试用例的时候&#xff0c;断言的方法还是很多的…

MyBatis查询数据库(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 经过前⾯的学习咱们 Spring 系列的基本操作已经实现的差不多了&#xff0…

DEJA_VU3D - Cesium功能集 之 111-风场(局部)效果

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

LeetCode-每日一题【2095.删除链表的中间节点】

题目 给你一个链表的头节点 head 。删除 链表的 中间节点 &#xff0c;并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点&#xff08;下标从 0 开始&#xff09;&#xff0c;其中 ⌊x⌋ 表示小于或等于 x 的最大整数。 对于 n 1、…

event.stopPropagation()和event.preventDefault()之间的联系

目录 阻止事件冒泡&#xff0c;阻止默认事件&#xff0c;event.stopPropagation()和event.preventDefault()&#xff0c;return false的区别 今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法&#xff0c;不让事件向documen上…

数据集托管平台汇总比较

目录 引言数据集托管平台需要满足的条件&#xff1a;☆☆☆ Hugging Face Dataset☆☆ 魔搭平台☆ OpenDataLab总结 引言 最近考虑构建一些测试数据集评测基准&#xff0c;用于评测算法在数据集上的效果。不同于论文中用到的公开数据集&#xff0c;这里构建的数据集更有针对性…