#问题描述
在工作过程中,遇到一个问题:Tomcat在重启或者发布的时候,会有多次的full GC。

笔者使用的版本说明:
Tomcat7.0.25
JDK8

首先排查JVM的问题,就要把GC日志打开

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

重启Tomcat服务器,发现gc日志如下:

原因描述

通过GC日志可以看到,old区离最大配置还很远,Metaspace区并没有真正释放空间,所以怀疑是Metaspace区不够用了。

以前只认为,Metaspace区是保存在本地内存中,是没有上限的,经查阅资料才发现,原来JDK8中,XX:MaxMetaspaceSize确实是没有上限的,最大容量与机器的内存有关;但是XX:MetaspaceSize是有一个默认值的:21M。问题就出在这里。

最终解决方案

既然问题找到了,那么就设置一个XX:MetaspaceSize的JVM启动参数:-XX:MetaspaceSize=128M.

Metaspace配置说明

从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制:

-XX:MetaspaceSize=N
这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:Metaspacesize21810376B(大约20.8M)。

-XX:MaxMetaspaceSize=N
这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。

-XX:MinMetaspaceFreeRatio=N
当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。

-XX:MaxMetasaceFreeRatio=N
当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%。

-XX:MaxMetaspaceExpansion=N
Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。

-XX:MinMetaspaceExpansion=N
Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

参考资料

第一次FullGC优化实战
JVM之永久区Permanent区参数设置分析
Metaspace

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览138049 人正在系统学习中

[转帖]fullgc问题解决:Full GC (Metadata GC Threshold)的更多相关文章

  1. Metadata GC Threshold导致的full gc分析

    gc log 两次full gc 均是Metadata GC导致, OpenJDK -Bit Server VM ( :: by (Red Hat -) Memory: 4k page, physic ...

  2. GC和GC Tuning

    GC和GC Tuning GC的基础知识 什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上简单 ...

  3. GC之七--gc日志分析工具

    性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析. Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc ...

  4. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  5. 【转】深入理解Major GC, Full GC, CMS

    声明:本文转自http://blog.csdn.net/iter_zc/article/details/41825395,转载务必声明. 很多人都分不清Major GC, Full GC的概念,事实上 ...

  6. 深入理解Major GC, Full GC, CMS

    很多人都分不清Major GC, Full GC的概念,事实上我查了下资料,也没有查到非常精确的Major GC和Full GC的概念定义.分不清这两个概念可能就会对这个问题疑惑:Full GC会引起 ...

  7. Java GC机制中Minor GC/Full GC

    Minor GC Young GC Full GC Major GC https://blog.csdn.net/chenleixing/article/details/46706039 内存划分为 ...

  8. GC之八--GC 触发Full GC执行的情况及应对策略

    目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...

  9. 【JVM第八篇--垃圾回收】GC和GC算法

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 1.垃圾 1.1.什么是垃圾 垃圾(Garbage)在Java语言中是指在运行程序中 ...

  10. minor gc和Major GC,Full GC的触发条件

    Minor GC Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC.因为新生代中大多数 ...

随机推荐

  1. 合宙esp32 c3 micro python 固件配置(基于thonny)

    首先,本文档是已经配置过其他esp32后发现合宙的配置需要修改一些地方. 为了让新手们减少掉坑成本,故做了一个图文指导. 准备工作: 1.thonny安装(不讲,自己去查教程) 2.esp32c3 m ...

  2. hystrix的熔断降级

    hystrix的熔断降级 结合Feign使用 1.A服务通过B服务的唯-标识,从Nacos获取到可调用列表. 2.使用feigh中的Http发起远程请求. 3.超过默认配置的时限,抛出异常,结束该线程 ...

  3. 3种依赖管理工具实现requirements.txt文件生成

    1.pip 实现方式   要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt   这个命令会将当前环境中 ...

  4. 第十二部分_强悍的sed

    一.文件编辑器知多少 Windows系统​ ​ UltraEdit等 Linux系统 ​ vim vi gedit nano emacs 二.强悍的sed介绍 1. sed用来做啥? sed是Stre ...

  5. 华为云举办AI经典论文复现活动,打造领先AI开发者学习社区

    摘要:百余篇经典论文算法上线华为云AI Gallery,学AI就用ModelArts 2020年8月28日,华为云AI院长峰会在杭州千岛湖举行,来自中国科学院.中国工程院的多位院士,以及清华大学.北京 ...

  6. 云小课 | 华为云KYON之ELB混合负载均衡

    摘要:本文介绍在华为云KYON(Keep Your Own Network)企业级云网络解决方案中,弹性负载均衡服务提供混合负载均衡功能,支持使用公有云的负载均衡绑定华为云上和IDC,实现云上云下业务 ...

  7. 【CVPR2022】用于域适应语义分割的域无关先验

    摘要:本文给大家分享一篇我们在CVPR 2022 上发表的paper:Domain-Agnostic Prior for Transfer Semantic Segmentation.文章提出了一种图 ...

  8. 综合指南|如何为平台工程选择关键 KPI

    平台工程是一种新兴的技术方法,可以加速应用程序的交付和产生商业价值的速度.通过提供具有自动化基础设施操作的自助服务能力,改善开发者的体验与生产力,同时降低操作的复杂性.在企业采用了平台工程之后,需要对 ...

  9. 字节跳动基于火山引擎DataLeap的一站式数据治理架构实践

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在7月22日举行的 ArchSummit 全球架构师峰会(深圳站)上,来自火山引擎DataLeap的技术专家为大家 ...

  10. Solon2 常用注解之 @Component 与 @Bean 的区别

    @Component 与 @Bean 设计的目的是一样的,都是注册 Bean 到容器里. 1.@Component 注解 及它的子类型 @Configuration,@Controller,@Remo ...