JVM8自适应导致内存居高不下

摘要:
伊甸园和两名幸存者的比例为199:1:1,是自适应规模政策的100倍以上。通过查询发现,JDK1.8的默认垃圾收集器为UseParallelGC,默认启用Adaptive SizePolicy。如果应用程序吞吐量小于预期,则内存大小将增加。理论上,增加内存可以降低GC的频率,以实现预期的吞吐量。如果应用程序实现了前两个目标,请尝试减少内存以减少内存消耗。Adaptive SizePolicy看起来很聪明,但有时也很顽皮,这会导致GC问题。解决方案1:关闭Adaptive SizePolicy策略并明确说明幸存者区域的比例。JVM添加参数-XX:-UseAdaptiveSizePolicy-XX:SurveRatio=8。方案2:使用CMS垃圾收集器。

YOUNG GC

    jvm年轻代分为eden区和survivor区,对象被创建后首先在eden区,如果一次young gc没有将其回收的话,会到survivor区。从survivor区到old generation需要了解下动态年龄判断

    动态年龄判断:

        1.对象超过15次没有被回收,可以通过MaxTenuringThreshold设置

        2.相同年龄的对象超过survivor区的50%,可以通过TargetSurvivorRatio设置

   对象超过15次没有被回收不太可能,那就是survivor区太小了?我们通过命令 jmap -heap 进程号来查看堆信息

 

    JVM8自适应导致内存居高不下第1张 

 启动程序时,只设置了初始堆内存和最大堆内存大小,其他都是默认参数。默认情况下,新生代和老年代的默认比例是1:2 ,eden区和两个survivor区的默认比例是8:1:1

 而上图中我们可以看到年轻代与老年代的比例约等于 1:3 。eden区和两个survivor区的比例为199:1:1,都100多倍了

AdaptiveSizePolicy

经过查询发现JDK1.8的默认垃圾回收器是UseParallelGC ,默认启动了AdaptiveSizePolicy。这个参数会让垃圾回收器根据每次垃圾回收的GC时间和吞吐量来动态调整eden区和survivor区的比例。

 AdaptiveSizePolicy有三个目标:

  • Pause goal : 应用达到预期的GC暂停时间。
  • Throughput goal : 应用达到预期的吞吐量,即应用正常运行时间/(正常运行时间+GC耗时)
  • Minimum footprint :近可能小的内存占用量

  AdaptiveSizePolicy为了达到三个预期目标,涉及以下操作:

  • 如果GC停顿时间超过了预期值,会减小内存大小。理论上,减小内存,可以减少垃圾标记等操作的耗时,以此达到预期停顿时间。
  • 如果应用吞吐量小于预期,会增加内存大小。理论上,增大内存,可以降低GC的频率,以此达到预期吞吐量。
  • 如果应用达到了前两个目标,则尝试减小内存,以减小内存消耗

AdaptiveSizePolicy 看上去很智能,但有时它也很调皮,会引发 GC 问题。

 我们上图中,eden区和两个survivor区的比例都100多倍了,其原因就是AdaptiveSizePolicy为了达到期望的目标而进行了调整。

上图中 Survior 区变小,老年代占比变高的原因分析如下

  1.在默认 SurvivorRatio = 8 的情况下,没有达到吞吐量的期望,AdaptiveSizePolicy 加大了 Eden 区的大小。From 和To 区被压缩到只有 2M。

  2.当 YGC 发生时候,由于 To 区太小,存活的对象直接进入到老年代。老年代占用量逐渐变大。

处理方案

方案一 :   关闭AdaptiveSizePolicy策略,同时显式申明survivor区的比例。JVM增加参数

-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8

 方案二 : 使用CMS垃圾回收器。CMS默认关闭AdaptiveSizePolicy。JVM配置参数

-XX:+UseConcMarkSweepGC

参考地址

堆内存居高不下,JDK8自适应作怪 https://www.jianshu.com/p/564017fe8a04

JVM GC 之 [AdaptiveSizePolicy] 实战 https://www.jianshu.com/p/7414fd6862c5

免责声明:文章转载自《JVM8自适应导致内存居高不下》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sass基础用法【转】tomcat 设置 session 过期时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

iOS-代码修改Info.plist文件

解决方案:1.首先,系统信息Plist文件是只读的,无法写入。目前,我无法亲自保存。官方属性可以被视为readOnly2。那么,如果我们想修改Info,我们该怎么办呢。Plist文件的代码?编辑也在互联网谷歌上做了一些工作,大多数方法是更改信息。plist文件存储在iOS沙盒文件中的一个相同文件中。现在有两个信息。手机中的plist文件。一个是系统信息。pl...

iOS开发(Swift):创建UINavigationView的三种方法

,表示window值我们会赋值。然后创建一个根视图控制器rootViewController,一个导航控制器navigationController。)-˃Bool{//Overridepointforcustomizationafterapplicationlaunch.window=UIWindowwindow.makeKeyAndVisible()ro...

使用jsPlumb插件实现动态连线功能

jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起来,适用于开发Web上的图表、建模工具等,其实jsPlumb可能主要是用来做流程图的,它在实现这方面的功能上非常强大,我在项目中只使用了它少部分功能,来实现项目中连线的效果。...

【转载】SecureCRT配色推荐和永久设置

2.配置文件夹和其他颜色选项==“全局选项==”终端==“外观==”ANSI颜色单击第二行中的第五个色块以修改文件夹颜色:对第二个色块执行相同的操作以修改压缩包和jar包的颜色:如果设置后文件夹和其他的颜色无效,您可以对第二行中设置背景色和字体颜色的颜色块执行相同的操作!...

win10 优化批处理

@ECHOoffECHO关闭自动修复bcdedit/setrecoveryenabledNOecho完成ECHO关闭WindowsDefenderregadd“HKEY_LOCAL_MACHINESOFTWARE策略MicrosoftWindowsDefender”/v“DisableAntiSpyware”/d1/tReG_ DWORD/fcho完成ECH...

DD-wrt+Wiwiz搭建私人免费(收费)WiFi认证页面+详细的操作教程

因此,请选择正确的DD-WRT版本将无线路由器连接到Internet。执行以下命令:#cd;wgethttp://dl.wiwiz.com/hsbuilder-util-latest-DD-WRT.tar.gz#cd/jffs ; tar zxf/tmp/root/hsbuilder-util-lalatest-DD-WRT.tar。gz#/jffs/usr...