PCGen的垃圾收集分析

介绍

我决定结合我的两个软件爱好,并在PCGen上进行一些分析, PCGen是一种流行的基于Java的开放源代码角色生成器,用于角色扮演游戏。 我用Censum ,我们( jClarity的)新的垃圾收集日志分析工具来进行分析。

本文假定您对JVM上的垃圾回收(GC)有所了解。 如果您不熟悉GC,那么建议您加入我们的jClarity朋友计划 。 我们正在建立有关GC的知识库,以便与整个Java社区自由共享,我们非常希望您能对此进行验证!

项目

我正在使用的两个项目是PCGen(我正在对其进行分析的项目)和Censum(GC分析工具)。

PCGen

PCGen是针对d20角色扮演系统(例如《星球大战》和《龙与地下城》)的流行角色生成器和维护程序。 这是一个长期运行的项目(> 10年),由一个大型(约750,000 LOC)Java Swing桌面工具组成,该工具具有大量专有格式的数据文件。 免责声明:我是PCGen的主席。

PCGen是一个数据密集型工具。 为了驱动其规则引擎并满足响应式UI的要求(具有大量详细信息),许多此类数据已预先加载并保存在内存中。 用户过去曾报告以下问题。

  1. 在处理多个字符和/或高级字符时,经常会出现暂停。
  2. 创建高级别角色或创建的角色超过2个时,PCGen就会死亡。 更多精通技术的用户报告说,他们在pcgen日志文件中看到OutOfMemoryError。

为了减轻PCGen(6.0)最新版本中的这种不良性能,已经做了一些工作,因此我决定使用Censum来确定这些更改是否改善了性能。

森森

Censum是jClarity的新垃圾收集分析工具。 重点是使用功能强大的分析来处理原始日志数据,并为繁忙的开发人员(例如PCGen!的贡献者)快速提供简单的英语答案。 免责声明:我是jClarity的CTO。

Censum是一项对开放源代码项目免费的新产品,当然,如果您要购买副本,今天就可以获得免费的评估许可证 (单击Try Censum )!

TLDR –结论

我们有好消息,一些信息和坏消息。

好消息

积极的消息是,PCGen开头的默认堆设置(-Xms256m -Xmx512m)现在足够大小,足以保持PCGen的运行。 即使创建了第5个复杂字符,也没有OutOfMemoryError。

Censum显示,一旦运行了完整的GC(通常在创建了每个新字符之后),便会恢复很大一部分堆,并且每个字符占用大约25-50 MB的堆空间。 我们可以粗略地推断出,起始点(已加载数据)约为125MB,PCGen可以随时轻松地保持大约10-15个字符打开而不会崩溃。 对于一个总经理来说,这可能还不足以让他的哥布林部落开始运转,但是对于大多数常规聚会而言,这当然足够了!

坏消息

负面消息稍多的是Censum报告,PCGen的暂停时间相对较高,很可能是由于过早晋升而引起的。 提早升级过多会导致我们想要的存储速度更快地进入旧一代。 这可能会产生连锁反应,导致收集更多旧的基因组以及完整的GC,自然导致更长的停顿时间。 有关高暂停时间,过早升级以及PCGen可以做什么的更多详细信息,请参见完整的分析部分。

从这里到哪里?

PCGen可以遵循Censum的“权宜之计”建议,以改变年轻一代空间的大小。 通过使用-XX:NewSize标志并将其设置为〜256M,可以缓解高暂停时间的问题。

但是,PCGen的长期解决方案是继续减少其数据结构(特别是玩家角色的表示)的影响。 实际上,这是PCGen今天正在进行的项目!

技术设置

PCGen通常从具有默认堆设置-Xms256m和-Xmx512m的Shell脚本运行。 对该脚本进行了更改,以提供产生可分析的GC日志所需的最少标志集。 添加到java命令的标志是:

-verbose:gc -Xloggc:pcgen_gc.log -XX:+ PrintGCDetails -XX:+ PrintTenuringDistribution

  • -verbose:gc和-Xloggc:pcgen_gc.log生成基本日志,该日志输出到名为pcgen_gc.log的文件。
  • -XX:+ PrintGCDetails提供Censum执行分析所需的GC分配信息的绝对最小集。
  • 最后,-XX:+ PrintTenuringDistribution提供有关对象何时从年轻的世代空间(伊甸园,幸存者1和幸存者2)移动到旧世代空间(使用期限)的有用信息。

所有这些选项对正在运行的JVM几乎没有影响。 您应该始终在生产中启用这些功能!

PCGen在运行Mac OS 10.7.5的MBP上与Oracle Java 7u10一起运行,具有8GB RAM,256MB SSD驱动器和超线程双核2.8Ghz i7处理器。

PCGen活动

PCGen首先加载基本游戏模式和系统文件+基本UI来加载数据源。 下一步是让用户选择要加载的数据源(角色扮演游戏规则集)。 装有“怪兽”套装的流行SRD 3.5 (地牢和巨龙3.5e)已加载。

一个角色( Karianna )被逐级创建到第20个巫师中,该巫师具有满载的咒语,设备和熟悉的猫(在PCGen中实际上是第2个角色)。 此后添加了几个更复杂的角色,包括大龙蓝龙(大量数据!)。

分析

我将介绍最初的数据加载用例,然后介绍常规用法(创建字符)。

资料载入

我很好奇初始数据加载对内存的影响。 尽管使用具有PCGen的SSD驱动器可以缩短加载时间,但毫无疑问,这是项目目标! 这是Censum在GC之后在堆分配方面显示的内容。

如您所见,数据的初始加载在数据加载结束时导致了许多年轻的世代集合和一个旧的(永久的)GC事件。 堆使用率最高可攀升至约325MB,但在收集垃圾后,堆使用率又降至约100MB。 加载大约15本厚规则书的数据还不错!

但是,PCGen的数据加载有点像Web /应用程序服务器(例如Tomcat)的启动期。 就您的GC分析而言,通常最好将其排除在一次性启动之外,而不是分析正在运行的应用程序。

创建角色

创建Karianna并将她提升到20级需要填写13个主选项卡的详细信息〜20个子选项卡和大量数据! 还创建了另外4个字符,它们具有相似的复杂性,其中一些友好(猫很熟悉),而有些则不友好(大龙蓝龙)。

该过程的一些屏幕截图如下:

技能专长

设备

嵌入式字符表

Censum的分析

打开日志文件后,Censum立刻将我带到了“分析摘要”屏幕,该屏幕使我一目了然地了解了PCGen的垃圾回收的进行情况。

好消息

我立即知道:

  1. 我有正确的标志来收集足够的GC数据以进行分析以使其正常工作
  2. 我的GC吞吐量很好(PCGen花费时间在运行,而不是在进行垃圾收集)
  3. 没有讨厌
    System.gc()调用(通常不是很好的做法)。

信息新闻

内存利用率 (内存泄漏是其中的一个子集)和内存池大小是信息性的,因为日志尚未收集24小时的数据(建议的最小值是查看应用程序一个完整工作日的周期)。

坏消息

PCGen似乎具有高的暂停时间以及过早的升级问题。 让我们进一步深入探讨!

高暂停时间

高暂停时间是由于GC收集器必须暂停应用程序线程才能以安全的方式清理对象引用所致。 收集器必须扫描和清理的对象引用越多,暂停时间就越长! 最长的停顿通常是由完整的GC集合引起的,其中清理了整个Java堆(例如,年轻一代和老一代的空间都变得很满)。

作为一个用户,我注意到停顿了两次,还不足以真正打扰我,但我知道我的硬件非常好,而且这些停顿时间对于其他用户而言可能会更糟。

正如Censum指出的那样,暂停所花费的时间的0.15%并不是主要的问题,而是所关心的0.666秒的暂停时间。 但是,我记得最长的暂停时间可能来自PCGen中的初始数据加载。 为了与此相关,Censum提供了一张暂停时间图。

数据加载是最严重的违法行为,但是肯定的是,由于GC已满,因此对于每个创建的角色,每个角色创建点周围都有½秒的良好暂停。 在使用PCGen的情况下,再说一秒钟对我来说并不令人讨厌,但是正如Censum所示,完整的GC需要时间,因此PCGen应该减少完整的GC的数量。

在这种情况下,我们知道由于Censum给我们的另一个警告–提早升级,我们可能会得到比我们想要的更多的完整GC。

提早促销

提早提倡本质上是指应该在年轻一代空间中收集的对象在年龄增长之前就被提升到老一代空间中。 这个“年龄”被称为任职期限,它基于1980年代进行的软件研究和JVM的运行时启发式算法的结合。 由于以下原因,可能会提早升职:

  1. 创造新物体的速度淹没了年轻一代的空间
  2. 正在创建的对象太大,无法容纳年轻的一代空间。 例如大的连续内存块。

这具有对旧的发电空间施加压力的效果。 它的填充速度更快,因此会收集更多的旧基因组并最终出现完整的GC,从而导致更频繁的暂停时间。

当我去看看应该提升对象多长时间以及它们被提升多早时,我立即得到了答案。 “任期摘要”屏幕向我们显示了“任期阈值”设置为15(对象可以在年轻一代中存活约15个集合,然后自然提升为老一代)。 另请注意,过早地提升了100%的对象!

然后,我去看看何时提升对象。 Censum告诉我,大多数人几乎是在年轻一代就开始晋升的(Tenuring Threshold为1)。 该值向我表明,到达的对象对于当前的年轻一代而言太大。 但是,我仔细检查并确保对象分配不是很高,Censum告诉我,对象分配的峰值约为2.5GB / s,这仅是大约? 我的MBP的功能,所以我们可以了。

PCGen采取的步骤

PCGen团队的下一步将是查看jmap中的直方图之类的内容,以查看正在创建哪些大对象。 快速检查jmap输出意味着我知道我们有String(字符串),char和byte的大型(多MB)连续数组。

此时PCGen的一个选项是调整年轻一代空间的大小,以便使用
-XX:NewRatio或-XX:NewSize标志。 设置这两个值之一的大小将取决于从jmap用法中发现的结果。 在这种情况下,需要将-XX:NewSize设置为〜256M,以减少暂停次数。

但是,通常这不是一个很好的长期解决方案。 PCGen项目最好减少这些大的连续内存分配的使用。 由汤姆·帕克(Tom Parker)和詹姆斯·登普西(James Dempsey)领导,这正是PCGen团队正在做的事情,将庞大的内存结构从整体式的PlayerCharacter类中提取到了更灵活的较小方面。

摘要

令人惊奇的是,PCGen志愿者为6.0版本付出的辛勤工作为最终用户带来了实实在在的红利!

几年前,我追踪了PCGen用户在加载第25级Kobold Shaman时报告的30秒以上的暂停。 我花了几天的时间才发现这是一个GC /内存问题,因为我只有原始的GC日志文件(它们是多线程的,不确定的野兽)。 展望未来,我肯定会使用像Censum这样的工具来更快地解决这些问题,这意味着我可以继续为PCGen添加新功能!

如果您想解决棘手的GC问题,请不要忘记查看PCGen来满足d20角色扮演游戏的需求和Censum !

参考:来自我们的JCG合作伙伴 Martijn Verburg 的PCGen垃圾收集分析,网址为Are We There Yet博客。

翻译自: https://www.javacodegeeks.com/2013/01/garbage-collection-analysis-of-pcgen.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件 application.p…

3dobject用什么打开_第一次用开塞露是什么感觉?网友:像打开了新世界的大门

第一次用开塞露是什么感觉?网友:像打开了新世界的大门我妈说我小时候便秘去医院,医生给开了支开塞露,然后在医院的公厕里使用的,我妈的描述是:“要不是我手挪走的快点,就直接喷我手了”。。。。。。。。。。。。。。。…

Java 7中对String.substring的更改

众所周知,在您生成相同源字符串的许多子字符串的情况下,Java会优化子字符串操作。 它通过使用(value, offset, count)存储信息的方式来做到这一点。 请参阅以下示例: 在上图中,您会看到字符串“ Hello”和“ World!”…

原生js创建模态框

1.效果图如下&#xff1a; 2.代码如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

CSS节选——选择器

CSS&#xff0c;cascading style sheet&#xff0c;层叠样式表&#xff0c;请留意层叠概念。 css3为了区分伪类和伪元素&#xff0c;伪元素采用双冒号写法。 常见伪类——:hover,:link,:active,:target,:not(),:focus。 常见伪元素——::first-letter,::first-line,::before…

vue.js基础知识篇(7):表单校验详解

目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vuerequire("vue"); var VueValidatorrequire("vue-validator"); Vue.use(VueValidator); 2.直接使用script标签引入vue.js 要下载vue-validator&#xff0c…

SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别

原文链接&#xff1a;https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL数据库中数据处理时&#xff0c;有时候需要建立临时表&#xff0c;将查询后的结果集放到临时表中&#xff0c;然后在针对这个数据进行操作。 创建“临时表”&#xff08;逻辑上的临时表&…

zbb20170626 myeclipse 2017 ci 构建 spring hibernate struts jar

转载于:https://www.cnblogs.com/super-admin/p/7081209.html

Java线程:保留的内存分析

本文将为您提供一个教程&#xff0c;使您可以确定活动应用程序Java线程保留Java堆空间的数量和位置。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究&#xff0c;以使您更好地理解分析过程。 我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用问题通常不是由真正…

软件测试白皮书-等价类

设有一个档案管理系统&#xff0c;要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月&#xff0c;并规定日期由6位数字字符组成&#xff0c;前4位表示年&#xff0c;后2位表示月。现用等价类划分法设计测试用例&#xff0c;来测试程序的"日期检查功能&qu…

深入css布局 (1) — 盒模型 元素分类

深入css布局&#xff08;1&#xff09;—— 盒模型 & 元素分类 “ 在css知识体系中&#xff0c;除了css选择器&#xff0c;样式属性等基础知识外&#xff0c;css布局相关的知识才是css比较核心和重要的点。今天我们来深入学习一下css布局相关的知识。” 首先来列下大纲 盒模…

批改网禁止粘贴怎么破_教育部对家长批改作业表态了,明令禁止!你怎么看?...

互联网的发展&#xff0c;的确方便了现代人生活。视频电话、出去买东西你都不用带钱带卡&#xff0c;手机一扫就可以完成支付。很多中小学的家长都会建一个家长群&#xff0c;方便老师和家长的沟通。这个群可以说是家长和学校的桥梁和纽带&#xff0c;家长们为了支持老师的工作…

MapReduce算法–顺序反转

这篇文章是介绍MapReduce算法的系列文章的另一部分&#xff0c;该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation &#xff0c; Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算…

液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...

一、项目背景近年来随着智能开采技术的不断发展&#xff0c;装备和新工艺不断更新换代,在智能开采中&#xff0c;对采煤机位置的精准定位是能否实现智能开采的关键&#xff0c;只有准确无误地获取煤机的准确位置&#xff0c;才能实现工作面的智能化开采&#xff0c;进而提高生产…

您是否能及时编译?

还记得上次被C开发人员嘲笑的时候吗&#xff1f; Java如此繁琐&#xff0c;以至于他们甚至都不会考虑使用这种语言&#xff1f; 在许多方面&#xff0c;这一概念仍然成立。 但是对于典型的用法&#xff08;在大型企业的骨干中&#xff09;&#xff0c;Java性能绝对可以与许多竞…

2d物理引擎01

我一直想做一个游戏&#xff0c;但一直感觉自己水平不够 想了想觉得不去做的话就永远做不出来 所以有了这个博文 01 我需要一个东西来显示&#xff0c;很显然h5中canvas是很好的选择 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

Liferay Model Hints

这篇文章主要介绍如何通过model hint 来修改liferay builder service生成数据库表中默认字段的长度。 1.什么是Model Hints? 它是对liferay builder service生成的model类的基本提示. 2. 它在什么地方被定义的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

浏览器书签备份管理

1、火狐浏览器备份导出HTML文件&#xff1a; CtrlJ 书签 - 导入/导出 2、谷歌浏览器&#xff1a; 设置中 导入书签 转载于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

选择您的收藏库

这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#xff0c;当是内置…

里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?

F4键在Word里面表示重复上一个操作&#xff0c;但对于这个快捷键&#xff0c;你真的会操作吗&#xff1f;本期与大家分享这个神奇的F4键&#xff0c;助你高效工作。1、批量复制文本在一般情况下&#xff0c;我们是用CtrlC复制内容&#xff0c;CtrlV粘贴内容&#xff0c;但遇到特…