fullgc问题解决:Full GC (Metadata GC Threshold)
来源:互联网 发布:泡水喝 知乎 编辑:程序博客网 时间:2024/05/21 11:05
问题描述
在工作过程中,遇到一个问题: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:Metaspacesize
为21810376B
(大约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
- fullgc问题解决:Full GC (Metadata GC Threshold)
- hbase full gc问题解决
- Full GC
- Major GC vs Full GC
- minor gc和full gc
- Minor GC、Major GC和Full GC
- Minor GC、Major GC与Full GC
- Minor GC,Major GC,Full GC -- hotspot VM GC讲解
- Hbase avoid full gc
- 什么时候执行full gc
- 触发Full gc条件
- Full Gc触发条件
- JVM-FULL-GC
- 排查Full GC
- JVM&GC Full Coverage
- HBase Full GC宕机
- JVM&GC Full Coverage
- Full GC排查
- 加密的病历单
- uploadify文件上传实例
- MySQL-InnoDB表
- spring:IOC容器原理
- JS,Jquery获取各种屏幕的宽度和高度
- fullgc问题解决:Full GC (Metadata GC Threshold)
- springboot常用注解
- Makefile十七之后缀规则和隐含规则的搜索算法
- ArcGIS for Server自带的PublishingTools无法启动
- HDU 5976 Detachment
- linux c 一站式学习 函数先声明后使用
- 论文发表流程包括哪些
- IDEA的使用
- jsp+javabean+SQL开发模式,实现帐号密码登录验证