记录一次Metaspace扩容引发FGC的调优总结

时间:2022-09-07 08:00:53

开始之前

  在开始之前先记录一个我碰到的jvm调优的坑。那就是…

为啥我配置到idea64exe.vmoptions中的参数没有生效???

  由于之前一直是在mac上开发,本地开发时当需要优化jvm参数的时候直接去idea的安装目录里修改idea.vmoptions就可以了,换到windows以后想当然的也这么改,但是发现似乎我配置的参数并没有生效, what‘s the f***?探索了一番终于发现了问题所在。

  windows是基于用户登录的,idea会为每个用户在当前用户根目录下创建一份配置信息,所以在idea安装目录下修改idea.vmoptions是不生效的,如图:

记录一次Metaspace扩容引发FGC的调优总结

记录一次Metaspace扩容引发FGC的调优总结

  不知道管理员用户登录的话是不是就可以直接修改idea安装目录的ideaexe.vmoptions了,有一个很简单的方法判断你当前的idea项目使用的是哪里的配置信息。

记录一次Metaspace扩容引发FGC的调优总结

发现问题

  ok,现在终于可以优化我们的jvm参数了,下面是一套我经常用的参数,在我以前开发的时候基本都是用这套参数,我也就直接复制到了idea64exe.vmoptions。

-Xms1024m
-Xmx1024m
-Xmn512m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-XX:ReservedCodeCacheSize=512m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

  保存重启idea以后,开一个项目,嗯,没啥感觉,一切正常。开两个项目,嗯,怎么有点卡呢。又开了一个项目,噩梦开始了,idea开始爆卡,点一下卡2s的那种。

定位原因

  1. jps:查看idea platform的进程ID

  2. jstat -gcutil pid 3s:查看进程垃圾回收情况

记录一次Metaspace扩容引发FGC的调优总结

  从上图可以看出,刚开始YGC和FGC都很健康,但随着我打开的项目越来越多,FGC开始飙升,直接导致了页面明显的卡顿,我试着关掉了几个项目,只保留一个,FGC慢慢变小,分析上图可以看出,M的占比随着FGC略有下降,从93.7%下降到93.2%左右,推测可能是Metaspace扩容导致的FGC。

确认原因

  通过jstat -gc pid 3s:可以查看metaspace具体使用情况,下图可以看出metaspace发生了扩容。

记录一次Metaspace扩容引发FGC的调优总结

  更简单的是,通过命令jvisualvm,打开Java VisualVM查看mataspace具体使用大小。

记录一次Metaspace扩容引发FGC的调优总结

  果然,当我同时打开多个项目时,metaspace发生了扩容,并且最终mataspace的使用量达到了接近250M,几乎达到了上面我配置的参数-XX:MetaspaceSize=256m,于是我将上面配置中关于mataspace的参数删掉。

-Xms1024m
-Xmx1024m
-Xmn512m
-XX:ReservedCodeCacheSize=512m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

  再次jstat -gcutil pid 3s查看GC情况。

记录一次Metaspace扩容引发FGC的调优总结

  这次FGC情况大有改善,随着我开的项目越来越多,FGC也只是从6次涨到了8次。至此,问题基本就解决了,但如果只是这样的话,我写这篇笔记的意义就不大了,接下来的才是重点。

深入探究

  我尝试重新添加了mataspace的参数,如下:

-Xms1024m
-Xmx1024m
-Xmn512m
-XX:MetaspaceSize=384m
-XX:MaxMetaspaceSize=384m
-XX:ReservedCodeCacheSize=512m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

  再次jstat -gcutil pid 3s查看GC情况:

记录一次Metaspace扩容引发FGC的调优总结

  上图是我同时开了5个项目的GC情况,FGC只有1次,这才是让我觉得困惑的地方,也就是说当我设置了MetaspaceSize=384m和不设置的时候,是有区别的,在网上看了很多关于mataspace的文章,我发现自己一直以来都没有搞懂-XX:MetaspaceSize=256M的真正含义,这个配置的含义并不是初始化元数据区大小为256m,而仅仅表示的是触发FGC的阈值,至于配置和不配置的区别,也就很明显了,这个知识点在书上看到过但是没放在心上,在实际碰到问题的时候才恍然大悟。

  Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量,就会发生FGC;且之后每次Metaspace扩容都可能会发生FGC。

  我们知道Metapsace是在jdk8中引入的,之前叫permGen,就是我们所说的永久代。在jdk8以前,我们配置-XX:PermSize=256m,那就是说初始化一块256m的内存作为永久代。但是mataspace就不一样了,很明显,mataspace要比perm高级的多。

总结

  • 如果没有配置-XX:MetaspaceSize,那么触发FGC的阈值是21807104(约20.8m)。

  • 如果配置了-XX:MetaspaceSize,那么触发FGC的阈值就是配置的值。

  • 配置比不配置好,实际开发时,可以先开几个项目查看一下metaspace大概占用多少内存,这个跟项目大小和复杂度有关,再根据实际情况配置-XX:MetaspaceSize。

查看当前java进程,一般用来查找进程ID(PID)

  • jps:查看当前java进程及PID
  • jps -l:输出主类或者jar的完全路径名
  • jps -v:输出jvm参数

动态查看gc情况

  • jstat -gc pid 3s: 每隔3s打印当前pid进程的堆内存详细信息
  • jstat -gcutil pid 3s: 每隔3s打印当前pid进程的堆内存总体GC统计信息

可视化工具jvisualvm

  命令行直接输入jvisualvm可打开可视化工具,动态查看java进程内部详细信息

结合以上3种途径,可以查看java进程的详细使用情况和GC情况。

记录一次Metaspace扩容引发FGC的调优总结的更多相关文章

  1. Hbase记录-client访问zookeeper大量断开以及参数调优分析(转载)

    1.hbase client配置参数 超时时间.重试次数.重试时间间隔的配置也比较重要,因为默认的配置的值都较大,如果出现hbase集群或者RegionServer以及ZK关掉,则对应用程序是灾难性的 ...

  2. Oracle SQL调优记录

    目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太 ...

  3. jdk8 Metaspace 调优

    简介 jdk8的元空间的初始大小是21M,如果启动后GC过于频繁,请将该值设置得大一些. 更多Meatspace内容见<Metaspace 之一:Metaspace整体介绍(永久代被替换原因.元 ...

  4. 记录一次JVM调优【GC日志的分析】

    首先查看服务器版本默认信息: 修改tomcat/bin/catalina.sh,在最顶端加入JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -Xloggc ...

  5. JDK记录-JVM原理与调优(转载)

    转载自<https://www.cnblogs.com/andy-zhou/p/5327288.html> 一.什么是JVM JVM是Java Virtual Machine(Java虚拟 ...

  6. 我进行jvm内存调优的一些记录

    jvm内存调优的一些记录 java内存调优的方法和过程 可以使用 jmap -heap pid号 查看,例如pid是9300,执行的结果可能是这样的. root@ubuntu:~# jmap -hea ...

  7. &lbrack;转帖&rsqb;jdk8 Metaspace 调优

    jdk8 Metaspace 调优 https://blog.csdn.net/bolg_hero/article/details/78189621 转帖 简介 从JDK8开始,永久代(PermGen ...

  8. Kettle数据同步速度调优记录

    Msyql到Vertica 1.mysql中在openshop 数据库中选择其中一个300W左右数据的表 create table ip_records_tmp_01 AS SELECT * FROM ...

  9. gc 调优记录

    qps 10,0000 -Xms10240m -Xmx10240m -XX:NewRatio=5 -XX:SurvivorRatio=6 2017-12-19T15:10:14.539+0800: 1 ...

随机推荐

  1. 封装一个mysql类(ggshop)

    接口 abstract class db{ //连接服务器 public abstract function connect($n,$u,$p); //发送查询 protected abstract ...

  2. d20161012

    Milk-run 供应商信息维护 基本信息,电子围栏 外部订单导入[或者录入页面] 订单基本信息,载具信息,物料信息,备注(外协还是华为导入订单,订单内容是否内部投递一样,是否需要导入附加,导入后是否 ...

  3. MFC编程入门之二十五(常用控件:组合框控件ComboBox)

    上一节讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是组合框 ...

  4. Ubuntu及Windows ADB设备no permissions的解决方案

    不少人曾在Windows下及Ubuntu下都遇到过Android设备无法识别的情况,就是run as Android Application的时候,target显示"??????" ...

  5. C&num; winform解决解决窗体第一次设置为最大化后,点击最大化按钮窗体无法居中问题

    public frmMain() { InitializeComponent(); //解决窗体第一次设置为最大化后,点击最大化按钮窗体无法居中问题 int x = Convert.ToInt32(( ...

  6. SQL 语句中的union操作符

    前端时间,用到了union操作符,周末有时间总结下,w3c手册内容如下: SQL UNION操作符 UNION操作符用于合并两个或多个select语句的结果集. 注意:UNION内部select语句必 ...

  7. 手把手带你入门kubernetes部署

    实验环境准备 k8s-master   192.168.2.156 k8s-node节点   192.168.2.161 Ps:两台保证时间同步,firewalld防火墙关闭,selinxu关闭,系统 ...

  8. 使用 C&num; 代码实现拓扑排序

    0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. https://www.codeproject.com/Articles/869059/Topological-sorti ...

  9. js:函数与变量作用域的提升

    一.要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:      1.所有申明都会被提升到作用域的最顶上      2.同一个变量申明只进行一次,并且因此其他申明都会被忽略      3 ...

  10. &period;net core 入坑经验 - 3、MVC Core之jQuery不能使用了?

    在View中添加了一段jQuery代码用来控制一个按钮的点击事件.发现运行时提示$对象没有定义,经过在浏览器右键查看源文件发现,script代码在引用jquery代码的上方,执行时jquery还未引入 ...