full gc原因(解决问题的方法有哪些)

#问题描述在工作过程中,遇到一个问题:Tomcat在重启或者发布的时候,会有多次的fullGC。JDK版本是1.8首先排查JVM的问题,就要把GC日志打开-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintGCDateStamps-Xloggc:/home/logs/gc.log重启Tomcat…

大家好,又见面了,我是你们的朋友全栈君。

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

JDK版本是1.8

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

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/home/logs/gc.log

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

full 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

文章来源:https://blog.csdn.net/liubenlong007/article/details/78143285

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128696.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 协方差矩阵的计算及意义「建议收藏」

    协方差矩阵的计算及意义「建议收藏」声明:博文转自https://blog.csdn.net/mr_hhh/article/details/78490576一、首先看一个比较简洁明了的协方差计算介绍:1.协方差定义X、Y是两个随机变量,X、Y的协方差cov(X,Y)定义为:其中,2.协方差矩阵定义矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个obs…

  • mybatis中insert语句动态sql篇「建议收藏」

    mybatis中insert语句动态sql篇「建议收藏」在mybatis中如何把insert语句改成动态入参;原SQL语句如下:<!–插入user方法一–><insertid="addUser"parameterType="user">insertintosmbms_user(userCode,userName,userPassword,gender,addres

  • thinkphp多用户在线客服系统源码-thinkPHP内核 附使用教程

    thinkphp多用户在线客服系统源码-thinkPHP内核 附使用教程步骤1请使用宝塔面板安装上传源码并且解压到网站很目录设置运行目录为public测试环境为php5.6mysql5.5伪静态选择为thinkphp宝塔安全放通:2080,9090这两个端口步骤2上方操作完毕后创建个数据库进行安装网站安装http://你的域名.com/install.php步骤3启动命令制定目录cd/www/wwwroot/你的网站目录/cgwl_pusher启动指令phpstart.phpstart-d如果没有运作起来根目录有个php5.6.

  • 安装与卸载tensorflow-gpu

    安装与卸载tensorflow-gpu安装到Anaconda:安装:pipinstalltensorflow-gpu==1.2.1pipuninstall tensorflow-gpu==1.2.1安装与卸载keras同样:安装:pipinstallkeras==2.0.5pipuninstallkeras=2.0.5

  • stm32 nvic配置

    stm32 nvic配置STM32有43个channel的settable的中断源;AIRC(ApplicationInterruptandResetRegister)寄存器中有用于指定优先级的4bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下/*PreemptionPriorityGroup————————–

  • Android setContentView流程[通俗易懂]

    Android setContentView流程[通俗易懂]MainActivity继承Activity的流程MainActivity继承至Activityimportandroid.app.Activity;importandroid.os.Bundle;publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(saved

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号