java eden space_JVM GC调优一则–增大Eden Space提高性能_润姐姐Samantha的博客-程序员秘密

技术标签: java eden space  

缘起

线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增。

思路

思路是Tomcat本身的代码应该是没有问题的,有问题的可能是应用代码升级,或者环境改变了,总之Tomcat的优先级排在最后。

先把应用的heap dump下来分析下:

jmap -dump:format=b,file=path pid

用IBM的Heap Analyser分析,发现dubbo rpc调用的RpcInvocation对象和taglibs的SimpleForEachIterator对象占用了很大部分内存。

a1b8b09c84a1ca70e2f625b0f5fb2e10.png

正常来说,这两种类型的对象都应该可以很快被回收掉,怎么会占用了那么大的内存空间?是不是有别的对象引用了它们,导致不能释放?

再仔细分析,发现RpcInvocation对象都是root refer的,也就是根对象,正常来说根对象应该可以很快就被回收掉的,为什么在内存中会有那么多对象?

再查看应用的JVM参数:

首先发现应用的新生代,即-Xmn256m 设置得太小了。对照上面RpcInvocation对象占用了226M,SimpleForEachIterator占用了267M内存。

显然在新生代里,没办法放下那么多的对象,这些对象必然是被放到老生代(old space)里去了。

既然RpcInvocation对象和SimpleForEachIterator对象应该都是可以很快被回收了,那么思路变成,触发一下线上的FullGC,看下对象有没有被回收。

在触发之前,先用jmap -histo pid统计下对象的数量:

34:        136762        4376384  com.alibaba.dubbo.rpc.RpcInvocation

129:         16345         392280  org.apache.taglibs.standard.tag.common.core.ForEachSupport$SimpleForEachIterator

用 jmap -histo:live  触发Full GC之后:

294:           625          20000  com.alibaba.dubbo.rpc.RpcInvocation

495:           292           7008  org.apache.taglibs.standard.tag.common.core.ForEachSupport$SimpleForEachIterator

果然数量大大的减少了。

所以结论比较明显了,新生代(Young generation)的空间太小,导致有一些本应该可以很快就被回收的对象被放到了老生代(Old generation)里,导致老生代上涨很快,频繁Full GC。

于是想办法增加新生代的大小,把JVM参数改为:

因为观察到PermSize实际上只用了不到200M,没有必要设置为512M,浪费内存,所以改为 -XX:PermSize=256m -XX:MaxPermSize=512m 。

另外,把新生代最大限制-Xmn256m 去掉。因为默认的NewRatio = 2,即除了PermSize,新生代大约占内存的1/3,即约(2048 – 256) /3 = 597M。和原来相比增大了一倍不止。

修改上线之后,观察发现Old Space增长缓慢,FullGC次数大大减少,时间在50ms下,Yong GC都在10ms下,达到了想要的效果。

简单的GC过程分析

首先来看一张GC的模型图,很形象:

77e0ea7678fcc5baa917aded95fb1c3d.png

简单来说,对于GC,我们了解到这些信息就足够了。

大部分新对象在Eden Space上分配,当Eden Space满了,则要用到Survivor Space来回收。YGC的算法是很快的。

多次YGC之后,还存活的对象就会被移到Old Generation(old space)上,当Old Generation满了的时候,就会FGC,FGC有通常比较慢。

Permanent Space只要你在开始时分配了足够大的空间,那它可以不用管。

我们可以得出一些结论:

合理减少对象进入老生代;

Old Space可能会一直增长,有时没有办法避免不让对象进入Old Space,当然也有一些程序是从来都不执行FGC的;

是不是尽全力防止对象进入老生代?显然不是,有些对象如果长久存在在新生代里,显然加重了YGC的负担,多次YGC之后仍然存活的对象显然应该放到Old Space里。

理想的GC/内存使用情况

总结下来,可以发现,理想的GC情况应该是这样的:

Old Space增长缓慢,FullGC次数少,FullGC的时间短(大部情况应该要在1秒内)。

总结:

尽量少加上一些默认参数。这点我很赞同RednaxelaFX的看法,配置了默认参数除了让后面调优的人蛋疼之外,没有太多的帮助。

GC调优就是一个取舍权衡的过程,有得必有失,最好可以在多个不同的实例里,配置不同的参数,然后进行比较。

有很多命令行工具或者图形工具可以使用,好的工具事半功倍。

参考:

http://www.alphaworks.ibm.com/tech/heapanalyzer‎    IBM Heap Analyser

http://hllvm.group.iteye.com/group/topic/27945    JVM调优的”标准参数”的各种陷阱,RednaxelaFX 出品,强列推荐

http://www.taobaotesting.com/blogs/2392      Java性能剖析1——JVM内存管理与垃圾回收

http://www.oschina.net/translate/using-headless-mode-in-java-se      在 Java SE 平台上使用 Headless 模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29113833/article/details/114116583

智能推荐

升级springBoot和springCloud版本后gateway网关跨域Filter无效_springcloudgateway配置corsfilter失效_肥仔哥哥1930的博客-程序员秘密

序 我是年前搭建的微服务版,springBoot版本2.2.2.RELEASE,springCloud版本Hoxton.SR1。

我的世界java下载慢怎么办_厉害了,用 Java 也能实现图片识别!_weixin_39634067的博客-程序员秘密

最近闲来无事研究了一下用 Java 如何模拟浏览器的行为,在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于 Java 如何进行图片识别验证码,由于根据网上查找的相关文章都不适合我的配置,所以特开此博客进行记录一下采坑的过程以及解决方法。做图像识别,可以使用TESSERACT-OCR来实现,但是该方式需要下载软件,在电脑上安装环境,移植性不高,使用 Tess4J 只需要下载...

执行aws cli报ImportError: cannot import name 'AliasedEventEmitter' 错误_玉羽凌风的博客-程序员秘密

解决方案:1. sudo aws installawscli2.如果1 不成功后,直接执行以下步骤:sudopython -m pip install --upgrade pipsudopip uninstall awsclisudopip install awscli

awk命令_awk -v_一别.的博客-程序员秘密

1、简介AWK 是一种处理文本文件的语言,是一个强大的文本分析工具(行编译器)。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。2、awk基础介绍2.1 awk两种语法// 语法awk [options] 'command' {file_name}2.2 常用参数参数 注释 -F fs 指定输入文件拆分隔符,fs是一个字符串或者是一个正

ubuntu Qt程序deb打包_qt打包deb_舍先生的博客-程序员秘密

再ubuntu下如何通过dpkg的方式打包qt应用陈鼓型

一文读懂十大数据存储加密技术_数据加密技术_炼石网络的博客-程序员秘密

数据作为新的生产要素,其蕴含的价值日益凸显,而安全问题却愈发突出。密码技术,是实现数据安全最经济、最有效、最可靠的手段,对数据进行加密,并结合有效的密钥保护手段,可在开放环境中实现对数据的强访问控制,从而让数据共享更安全、更有价值。随着《密码法》等“一法三规一条例”的落实,各行业对数据加密技术、产品和服务的重视程度不断提升。本文聚焦十种数据存储加密技术,希望能够帮助读者快速了解数据存储加密技术的全貌,并在用户需要通过“加解密技术”进行自身核心数据资产的安全保护时,在场景适用性判断、相关技术与产品选型等方面

随便推点

Android EditText简单自定义边框样式_lixuce1234的博客-程序员秘密

1.去掉全部边框 Android:background="@null"。2.自定义样式:shape中如果不通过Android:shape来指定形状时,默认是矩形,其中solid代表纯色,corners代表角,radius越大,圆角越大,stroke代表边框线。首先定义normal和focus两种状态下的style。xml:edittext_normal       

Emulator Error Message - ".NET Compact Framework v2.0 could not be found."_godcyx的博客-程序员秘密

When deploying to emulator I get the following error... ".NET Compact Framework v2.0 could not be found. Please install it and run this setup again."If I remove the reference to System.Data.SqlC

理解分布式自增ID算法——雪花算法 (snowflake,Java版)_雪花算法是自增的吗_穹劲天空的博客-程序员秘密

说到全局唯一ID,之前做的一个项目,有遇到类似的需求,会有多并发,但是,又需要类似于id的这么个存在。当时是直接采用的UUID(这个方案实施起来效率最高),当时为了赶进度,就匆匆忙忙的上线了。现在正好来总结一下。一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式、UUID、雪花算法。方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件...

h3c交换机重启_h3c交换机清空配置命令_小股量化的博客-程序员秘密

h3c交换机清空配置命令H3C CAS云计算管理平台融合了华三通信在网络安全领域的积累,通过对IEEE 802.1Qbg(EVB)标准的支持,为虚拟机在安全、可视、可监管的环境下运行奠定了基础。下面是小编收集的h3c交换机清空配置命令,希望大家认真阅读!一.用户配置:system-view[H3C]super password H3C 设置用户分级密码[H3C]undo super passwor...

程序猿的量化交易之路(20)--Cointrader之Assert实体(8)_weixin_30800807的博客-程序员秘密

转载需说明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top不论什么可交易的都能够称之为Assert,资产。其类代码例如以下:package org.cryptocoinpartners.schema;import javax.persistence.Basic;import javax.persistence...

推荐文章

热门文章

相关标签