本文将向您详细介绍从Java虚拟机(例如HotSpot或JRockit)迁移到IBM JVM时重要的Java堆空间调整注意事项。 该调整建议基于我为我的一个IT客户端执行的最新故障排除和调整任务。

IBM JVM概述

正如您可能从其他文章中看到的那样,IBM JVM在某些方面与HotSpot JVM不同,因为它没有PermGen内存空间。 从垃圾回收的角度来看,它确实为您提供了可以利用多物理核心计算机的高级算法; 与HotSpot JVM类似。

从故障诊断的角度来看,IBM为您提供了许多工具。 包括从其JVM实现中获得的开箱即用的Thread Dump和Heap Dump生成功能。

例如,IBM JVM线程转储特别强大,因为它为您提供了有关JVM的额外数据,例如活动的JVM环境变量,GC策略,每个活动的类加载器中的已加载类等。我们将在本部分中对此进行更详细的探讨。我们的线程转储培训计划的4 。

IBM VM –默认GC行为

现在回到我们的主要主题,了解IBM JVM垃圾收集器(版本1.5和1.6)的默认行为非常重要。 默认情况下,使用终身记忆例如,它不会创建一个单独的YoungGen(幼儿园)空间中创建了Java堆空间。 这意味着任何内存分配都将进入租用空间(短期和长期对象),该空间随后由默认收集器(通过Full GC)收集。

在下面找到详细的GC快照,其中显示了默认的GC内存故障,并带有解释:

<af type="tenured" id="5" timestamp="Mar 01 13:40:30 2012" intervalms="0.000"><minimum requested_bytes="48" /><time exclusiveaccessms="0.106" meanexclusiveaccessms="0.106" threads="0" lastthreadtid="0x000000011A846B00" /><tenured freebytes="20131840" totalbytes="2013265920" percent="0" ><soa freebytes="0" totalbytes="1993134080" percent="0" /><loa freebytes="20131840" totalbytes="20131840" percent="100" /></tenured><gc type="global" id="8" totalid="2492" intervalms="2017588.587"><finalization objectsqueued="199" /><timesms mark="808.286" sweep="9.341" compact="0.000" total="818.292" /><tenured freebytes="1362331024" totalbytes="2013265920" percent="67" ><soa freebytes="1344212368" totalbytes="1995147264" percent="67" /><loa freebytes="18118656" totalbytes="18118656" percent="100" /></tenured></gc><tenured freebytes="1362330976" totalbytes="2013265920" percent="67" ><soa freebytes="1344212320" totalbytes="1995147264" percent="67" /><loa freebytes="18118656" totalbytes="18118656" percent="100" /></tenured><time totalms="818.750" /></af>

好的,默认的IBM JVM GC策略是不同的……问题是什么?

此默认JVM策略的问题在于,所有Java对象都被复制到租用空间并通过全局集合(完整GC)进行收集。 对于许多Java EE应用程序,短期对象与长期对象的比率要高得多。 这意味着您的JVM将需要执行很多主要的收集工作,以清理短期对象。 结果:Full GC的频率增加,JVM暂停时间增加,CPU利用率增加和性能下降!

这正是我们在使用默认GC策略将JVM HotSpot 1.5(使用增量和并行GC)迁移到IBM JVM 1.6之后执行负载测试时观察到的结果。 根据上述说明,重度GC过程被确定为根本原因。

请解决!

好消息是,IBM JVM 从版本1.5开始引入了世代和并发GC收集器 。 该GC政策正是提供了我们想要的:

  • 它确实将Java Heap空间在苗圃空间和保育空间之间进行了划分
  • 托儿所(YoungGen)空间对象通过清除剂GC收集器单独收集
  • 通过全局GC收集器收集长期空间对象
  • GC收集器是并发的,并且可以利用任何多物理核计算机

结果:

  • 降低主要采集频率(全GC)
  • 减少了全GC消耗的时间和暂停时间
  • 增加JVM吞吐量
  • 提高应用程序的性能和容量

您可以通过在下面添加此JVM参数来启用它:

-Xgcpolicy:gencon

在启用此GC策略后,在下面的详细GC日志中可以找到什么:

<af type="nursery" id="15" timestamp="Mar 08 05:34:06 2012" intervalms="1289096.227"><minimum requested_bytes="40" /><time exclusiveaccessms="0.085" meanexclusiveaccessms="0.085" threads="0" lastthreadtid="0x0000000118113900" /><refs soft="18043" weak="204057" phantom="27" dynamicSoftReferenceThreshold="32" maxSoftReferenceThreshold="32" /><nursery freebytes="0" totalbytes="530716672" percent="0" /><tenured freebytes="1887422016" totalbytes="2013265920" percent="93" ><soa freebytes="1786758720" totalbytes="1912602624" percent="93" /><loa freebytes="100663296" totalbytes="100663296" percent="100" /></tenured><gc type="scavenger" id="15" totalid="15" intervalms="1289097.271"><flipped objectcount="1486449" bytes="129908000" /><tenured objectcount="1176" bytes="184144" /><finalization objectsqueued="3082" /><scavenger tiltratio="73" /><nursery freebytes="364304408" totalbytes="495208448" percent="73" tenureage="10" /><tenured freebytes="1886766656" totalbytes="2013265920" percent="93" ><soa freebytes="1786103360" totalbytes="1912602624" percent="93" /><loa freebytes="100663296" totalbytes="100663296" percent="100" /></tenured><time totalms="233.886" /></gc><nursery freebytes="364238872" totalbytes="495208448" percent="73" /><tenured freebytes="1886766656" totalbytes="2013265920" percent="93" ><soa freebytes="1786103360" totalbytes="1912602624" percent="93" /><loa freebytes="100663296" totalbytes="100663296" percent="100" /></tenured><refs soft="17992" weak="5344" phantom="27" dynamicSoftReferenceThreshold="32" maxSoftReferenceThreshold="32" /><time totalms="236.858" /></af>

请记住,您的应用程序仍可能无法从该GC策略中受益(长寿命对象等会占用更大的空间),因此,我对您的建议是始终进行尽职调查并执行适当的容量规划和负载测试您的应用程序,然后再执行任何主要的调整建议。

结论

我希望本文能帮助您了解默认的IBM JVM 1.5 / 1.6 GC策略以及Java EE应用程序如何从该GC策略gencon调整建议中受益。

参考: IBM JVM调优–来自我们JCG合作伙伴 Pierre-Hugues Charbonneau的gencon GC策略 ,位于Java EE支持模式和Java教程博客。

翻译自: https://www.javacodegeeks.com/2012/04/ibm-jvm-tuning-gencon-gc-policy.html

IBM JVM调整– gencon GC策略相关推荐

  1. jvm gc策略_IBM JVM调整– gencon GC策略

    jvm gc策略 本文将向您详细介绍从Java虚拟机(例如HotSpot或JRockit)迁移到IBM JVM时重要的Java堆空间调整注意事项. 此调整建议基于我为我的一个IT客户端执行的最新故障排 ...

  2. JVM系列二:GC策略内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  3. JVM学习之GC常用算法

    2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...

  4. IBM JDK(J9)垃圾回收(GC)策略

    在IBM JDK 1.5之后,采用了如下的垃圾回收GC策略: 针对吞吐量进行优化 -Xgcpolicy:optthruput(可选) 默认策略.对于吞吐量比短暂的 GC 停顿更重要的应用程序,通常使用 ...

  5. 浅谈JVM的GC策略

    1 前言 GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理.        说 ...

  6. 触发JVM进行Full GC的情况及应对策略

    堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...

  7. JVM为什么需要GC

    社区内有人发起了一个讨论,关于JVM是否一定需要GC?他们认为应用程序的回收目标是构建一个仅用来处理内存分配,而不执行任何真正的内存回收操作的 GC.即仅当可用的 Java 堆耗尽的时候,才进行顺序的 ...

  8. Jvm 系列(三):GC 算法 垃圾收集器

    这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...

  9. jvm系列(三):GC算法 垃圾收集器

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

最新文章

  1. class函数 python_python函数之classmethod()
  2. apache 配置rewrite模块,URL中隐藏index.php
  3. 在OpenPower720上安装SLES9(I)
  4. linux base64 文件大小,linux下使用base64进行加密和解密
  5. 云服务器 ECS CentOS 7配置默认防火墙 Firewall
  6. ubuntu-E:Encountered a section with no Package: header的解决办法
  7. Java创建Timestamp的几种方式
  8. 蛮力法 —— 求解迷宫问题 —— DFS和BFS
  9. Delphi 正则表达式起步
  10. jQuery 鼠标事件
  11. 4G通信简单验证(合宙Air720H)
  12. 工作两年简历写成这样,谁要你呀!
  13. CTF杂项小结--沙窝李的王
  14. php段子老板,程序员段子 那些关于程序员的段子
  15. eclipse IED的优化(gc.log)
  16. clickhouse集群容器化搭建
  17. 360浏览器如何开启翻译功能?
  18. HtmlUnit基础
  19. [Eigen中文文档] 切片和索引
  20. PycURL学习笔记

热门文章

  1. 自定义类加载器(ClassLoader + URLClassLoader)
  2. 不相交集的求并算法(按集合大小求并+按高度求并)
  3. GET与POST传递数据的最大长度能够达到多少
  4. JavaScript 变量的作用域和生命周期
  5. java jdk 序列化_JDK 11:Java序列化的终结开始了吗?
  6. 移动端apm关键指标_3个经常被忽视的APM关键功能
  7. spring bean依赖_Spring @Configuration并将bean依赖项作为方法参数注入
  8. java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法
  9. input发送a.jax_JAX-RS 2.0:自定义内容处理
  10. q7goodies事例_Java 8 Friday Goodies:精益并发