java vm_Java VM –提防YoungGen空间

java vm

正如您从我们以前的面向性能的文章中可能已经看到的那样,运行良好的JVM是实现最佳应用程序性能和稳定性的最重要目标之一。 这样的健康评估通常仅关注主要收集的频率(避免)或检测内存泄漏的存在。 年轻一代空间或短寿命物体的大小和足迹如何? JVM_beware_YG

本文基于一个真实的故事和我们与一位IT客户的最新故障排除经验。 它将通过一个示例应用程序证明,过多的内存占用空间和次要收集的频率可能会引发性能问题,就像其老兄,旧一代或使用期限的空间一样严重。

JVM健康状况诊断

如果您不熟悉JVM调优领域,那么您很快就会意识到,没有适用于所有应用程序的通用解决方案。 无论您可以从各种来源从Web上找到高质量的材料,您都仍然需要进行尽职调查并正确了解要处理的应用程序类型,包括其对JVM GC暂停的敏感性(某些应用程序需要较低的JVM暂停时间<1%)。

Java性能分析(包括内存泄漏检测)以及性能和负载测试是为收集所有正确数据以及有关应用程序内存占用量和JVM运行时运行状况的事实而需要执行的额外工作的良好示例。

话虽这么说,“健康的” JVM是什么意思? 请尽您所能回答以下问题。

**如果回答“否”,请假设置信度为90%+,否则回答“我不知道”。

  • 您的Java堆或OldGen空间是否随着时间的流逝而泄漏(在进行重大收集之后)?
  • 您的应用程序当前是否受到大型和/或频繁的JVM GC暂停的影响?
  • JVM的总体暂停时间是否高于5%或高于已建立的理想基准?
  • 当前,您的应用程序响应时间是否经常受到JVM GC活动的定期影响,并且超出了应用程序的承受能力?
  • 在最近3个月中,您是否观察到java.lang.OutOfMemoryError错误的发生?
  • 您是否在最近3个月内观察到JVM崩溃的发生(带有核心转储和崩溃报告的JVM突然故障)?
  • 您是否认为您的JVM当前不稳定并且/或者需要过多的人工干预(定期重启等)?

如果您回答“是”或“我不知道”,这意味着您或您的生产性能调整团队可以在这里做一些工作,包括查看当前的JVM GC策略。

如果您对所有具有高置信度级别的用户回答“否”,则意味着您可能已经获得了可靠的应用程序和JVM稳定性,祝贺您。 我仍然建议您在主要版本和增量负载预测之间重新评估情况。

青年一代:真的停止世界吗?

正如我们从快速的JVM健康状况评估练习中看到的那样,要点之一是指JVM的总体暂停时间。 这实质上意味着JVM在“停止世界”事件中花费了多少时间。 在此期间,应用程序线程将被挂起并且不执行任何工作,从而增加了应用程序的响应时间。 该指标至关重要,因为较大的JVM暂停将触发不稳定且不可预测的响应时间。

HotSpot_Heap_Structure

我在过去几年中看到的一个普遍误解是,YoungGen或次要集合是完全透明的,并且不会影响应用程序的响应时间。 如果您的Java堆大小较小(YG空间<1 GB),并且处理的对象生存期或分配率适中,则此语句几乎是正确的。 在这种情况下,如果次要集合执行得非常快(<20 ms)并且执行得不太频繁(每30秒以上),则YoungGen空间贡献的JVM总体暂停时间将保持很小(<< 1%)。 但是,如果YG内存分配率提高(每个请求的占用空间增加,流量激增等),情况可能会很快改变。

我建议以下文章,以获取有关可用于HotSpot JVM的YoungGen空间和并发收集器的更多详细信息。

#Oracle HotSpot主要是并发收集器:CMS vs. G1

  • http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html

#Oracle HotSpot次要收藏全面介绍

  • http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
  • http://blog.griddynamics.com/2011/06/understanding-gc-pauses-in-jvm-hotspots_02.html

无论您使用的HotSpot GC策略如何,包括大多数并发的收集器(例如CMS或G1),YoungGen空间收集仍然是“世界停止”事件。 据我们所知, Azul Zing C4是唯一宣传为真正的连续并发压缩收集器的JVM收集器。 目前,我们还没有机会尝试使用该收集器。 我欢迎任何具有C4调优经验的人分享他们的观察结果,尤其是真实的事实数据,而不是像G1这样的大多数并发收集器。

现在,我们已经涵盖了一些理论,下面让我们深入研究示例应用程序,并针对各种YoungGen占用空间和分配比率来回顾性能测试结果。

样本应用规范

为了比较各种YG分配率之间的响应度和JVM暂停时间%,我们根据以下规范创建了一个示例应用程序:

  • 根据以下属性,已通过jvm URI创建并公开了JAX-RS(REST)Web服务。
@GET@Path("/jvm")@Produces(MediaType.APPLICATION_JSON)public Integer jvm() {}

每次对jvm的调用都执行以下逻辑:

1.分配短期对象的预定大小(适用于快速YG GC)。

此外,在类加载时会分配1 GB的长寿命对象(不适合GC)的初始内存占用空间,以便为CMS收集器创建一些噪音。

YG短期对象的内存分配和OldGen静态保留仅通过按照下面的代码片段创建原始字节值的静态数组即可实现。 根据使用MAT的JVM堆转储分析,可以观察到真正的内存占用量。

private final static int LONG_LIVED_OBJ_FOOTPRINT = (1024 * 1024 * 1024);
private final static int SHORT_LIVED_OBJ_FOOTPRINT = (100 * 1024 * 1024);// 1 GB static memory footprint
private final static byte byteArrayLongLivedObj[] = new byte[LONG_LIVED_OBJ_FOOTPRINT];// 100 MB memory allocation (waste) created per execution
public void generateShortLivedObj(String objId) {          byte byteArrayShortLivedObj[] = new byte[SHORT_LIVED_OBJ_FOOTPRINT];
}

OldGen_1GB_retention

最后,在下面找到环境规格和用于创建,执行和监视此YG比较性能测试的软件。

  • 作业系统:Windows 7 @ 64-bit
  • Java EE容器: WildFly 8 Beta1
  • JVM:Oracle HotSpot 1.7 @ 64位,Java堆大小为5 GB(YG空间:1152 MB XX:NewRatio = 3)。 GC收集器:CMS
  • IDE: JBoss Developer Studio 7.0.0.GA
  • JVM监视: JVisualVM
  • JVM内存泄漏分析器: Plumbr 3.0
  • JVM verbose:gc日志分析器: GCMV
  • 性能和负载测试: Apache JMeter 2.9

性能测试结果和观察

以下性能测试模拟了一个现实生活中的应用程序,该应用程序需要处理大量的JVM暂停时间以及在峰值负载下的严重降级。 在模拟每个请求的应用程序内存占用量的改善(减少)之后,执行了3次运行,其中1次作为基线运行,另外2次运行。

基准线

  • 10个并发线程
  • 每个JVM进程每次执行创建100 MB的短期对象

寿命短的对象的内存占用空间可能看起来很极端,但这确实是我们最初要解决的问题。

结果

  • 平均响应时间:140毫秒
  • 吞吐量:68请求/秒
  • JVM总体暂停时间: 25.8%
  • YG收集频率:每秒7个收集
  • GC速度:每分钟308909 MB

JVM_beware_YG1

按照JVisualVM,JVM看起来很健康(没有内存泄漏,稳定且OldGen低等)。 但是,当您在verbose:gc日志中进一步深入研究时,您会意识到JVM的总体暂停时间为25.8%,这都是由于YG收集频率过高所致。 这有力地证明了正确分析verbose:gc日志与仅关注JVM持久空间趋势的观点。

YG_Activity_1

JVM_beware_YG2

测试与调整#1

  • 10个并发线程
  • 每个JVM进程每次执行创建50 MB的短期对象

此运行模拟了应用程序占用空间和内存分配速率从每个分配的100 MB到50 MB的初始改善。 通过简单地减少每个请求的应用程序内存占用量,我们可以清楚地看到所有数字的改进,特别是吞吐量。

结果

  • 平均响应时间:119 ms -21
  • 吞吐量:79要求/秒+11
  • JVM整体暂停时间: 15.59%-10.21
  • YG收集频率:每秒3-4次收集-3
  • GC速度:每分钟164950 MB -143959

JVM_beware_YG4

JVM_beware_YG5

测试与调整#2

  • 10个并发线程
  • 每个JVM进程每次执行创建5 MB的短期对象

此运行模拟了将应用程序占用空间和内存分配率从100 MB大大降低到每个分配仅5 MB的情况。

结果

  • 平均响应时间:107毫秒-33
  • 吞吐量:90请求/秒+22
  • JVM总体暂停时间: 1.9%-23.9
  • YG收集频率:每2-3秒收集1次*大幅减少
  • GC速度:每分钟15841 MB -293068

JVM_beware_YG6

JVM_beware_YG7

如您所见,对应用程序占用空间和内存分配的最终改进确实将JVM暂停时间显着减少到了可接受的1.9%。 重要的是要注意,在这3个测试中,OldGen占用空间和CMS活动对JVM暂停时间没有任何实质性影响,性能问题是由于活动过多以及与YG相关的世界停止事件数量过多所致集合。

解决方案和建议

我们的问题案例表明,通过调整和减少每个应用程序请求的内存占用空间,可以减少与过多的YG收集活动相关的JVM暂停时间,从而降低分配率和YG GC频率。

但是,当短期内无法使用这种调整策略时,值得探索其他解决方案。 通过以下能力改进策略可以潜在地获得类似的结果:

  • 水平和垂直扩展:通过增加JVM进程数量来拆分流量,但以可用硬件为代价,从而降低了YG集合的分配率和频率。 从本质上讲,这意味着将硬件投入该问题。 我的建议始终是先微调您的应用程序内存占用量,然后并行探索其他扩展选项。
  • Java堆大小和YG比率调整:增大YG空间的大小肯定会有助于减少停止世界YG集合的频率。 现在请注意,不要“饿死” OldGen空间,否则您将直接解决问题,并产生更严重的后果,例如JVM抖动和OOM事件。

最后的话

我希望您喜欢这篇文章,并且现在更好地了解过多的JVM YG集合对性能的潜在影响。

我建议您阅读本文后做以下练习:

  • 选择您最繁忙的应用程序之一。
  • 查看verbose:gc日志,并通过GCMV确定JVM暂停时间。
  • 确定YG收集的频率和影响,并确定调整机会。

期待您的意见,并分享您的JVM调优经验。

参考: Java VM – Java EE支持模式博客上的JCG合作伙伴 Pierre Hugues Charbonneau 提防YoungGen空间 。

翻译自: https://www.javacodegeeks.com/2013/11/java-vm-beware-of-the-younggen-space.html

java vm

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

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

相关文章

Java生产监控的阴暗面

自动化的工作流程是在敏捷环境中交付高质量产品的新金标准。 不幸的是&#xff0c;不断变化会带来不断的风险。 输入“可观察性”&#xff0c;这是一种度量&#xff0c;可以从系统的外部输出中推断出系统的内部状态。 知道应用程序如何在生产中运行的能力。 在本节中&#xff…

adf4350配置_配置MySQL以进行ADF开发

adf4350配置大家好。 今天&#xff0c;我将向您展示如何为Oracle ADF开发配置MySQL数据库。 恕我直言&#xff0c;当您将ADF与其他数据库而不是Oracle DB一起使用时&#xff0c;您将无法使用Oracle ADF的全部功能&#xff0c;有时您会发现自己在寻找解决方法&#xff0c;以实现…

如何在Java中使用重复项查找整数数组中的K个缺失数字?

自从我讨论任何编码或算法面试问题以来已经有很长时间了&#xff0c;因此我想重新考虑一种最流行的基于数组的编码问题&#xff0c;即在给定数组中查找缺失的数字。 在进行编程工作面试之前&#xff0c;您可能已经听说过或看到过此问题&#xff0c;但是面试官通常会使用许多不同…

基于同步压缩小波变换(Synchrosqueezed wavelet transforms)的时频分析的MATLAB实现(不使用内置函数wsst)

引言 同步压缩小波变换(Synchrosqueezed wavelet transforms, SST)采用了经验模态分解的设计思路,结合小波变换和reallocation theory构建而成,有明确的数学定义和推导。 EMD算法是一种旨在将它们分解成构建块函数的技术,这些构建块函数是(合理地)少量分量的叠加,这些分量…

垃圾收集算法,垃圾收集器_您正在使用什么垃圾收集器?

垃圾收集算法,垃圾收集器我们的研究实验室正全速前进。 随着最近的资本注入 &#xff0c;我们只能保证我们不断创新的步伐只会加快。 我们进行的部分研究与GC优化有关。 在处理这个有趣的领域中的问题时&#xff0c;我们认为可以分享一些有关GC算法使用的见解。 为此&#xff…

与时俱进:在JAX-RS API中采用OpenAPI v3.0.0

看到时间流逝真是太恐怖了&#xff01; OpenAPI规范3.0.0是对Swagger规范的重大修改&#xff0c;大部分已于一年前发布&#xff0c;但是工具赶上了一段时间。 但是&#xff0c;随着Swagger Core 2.0.0的最新正式发布&#xff0c;事情肯定会加速。 为了证明这一点&#xff0c;著…

jclouds_jclouds的命令行界面

jclouds序幕 我使用和为jclouds贡献了一年多的时间。 到目前为止&#xff0c;我已经在很多领域广泛使用了它&#xff0c;尤其是在Fuse生态系统中 。 它的强大之处在于它缺少一件事&#xff0c;该工具可用于管理jclouds也提供访问权限的任何云提供商。 类似于EC2命令之类的工具&…

【数字信号处理】离散傅里叶级数(DFS)

周期信号的DFS 周期信号一定 不存在 离散傅里叶变换,通过引入冲激序列,可以进行表示,使得数学运算更加严谨;但一定存在傅里叶级数! 时域周期==>频域离散 时域离散==>频域周期 时域又离散又周期==>频域又周期又离散 联系序列的傅里叶变换DFT理解即可,只不过复指…

锁具行业电子工程师岗位职责_赏金猎人招募电子产品开发工程师产品结构工程师...

“赏金猎人”专栏6期来啦&#xff01;这个专栏&#xff0c;可以让产业需求被更广大的社区看见让社区更多有技能、有解决方案的小伙伴参与进来最终促进科技在传统产业中的应用落地专栏里面发布的猎人需求只要你觉得具备欢迎通过businesschaihuo.org跟我们取得联系今天要发布的是…

4代hiv检测50元_别瞧不起国货!这4个姥姥辈的护肤品,真心好用,还不到50元

在护肤这件事情上&#xff0c;其实最适合我们肤质的护肤品还是我们自己国家的生产的&#xff0c;但是国货这几年的确没有欧美的一些大牌&#xff0c;或者是日韩的护肤品更受到欢迎&#xff0c;国货被淹没的一个主要原&#xff0c;就是因为它的价格太过便宜了&#xff0c;可能老…

墙面有几种装修方法_新房装修除甲醛 用这几种方法就足够

新房装修后会散发出刺鼻的有害物质&#xff0c;其中甲醛是含量最高&#xff0c;危害最大的有害气体。那怎么才能有效的去除甲醛呢?下面小编就为大家带来新房装修除甲醛的四大方法&#xff0c;希望能给大家带来帮助。新房装修除甲醛方法一&#xff1a;开窗通风法将新房的窗户打…

Parallel Parking of Truck-Trailer Using Multistage Nonlinear MPC之MATLAB simulink编译转换C++代码(内附下载地址)

引言 这个例子展示了如何使用多级非线性模型预测控制(NLMPC)来并行停放卡车-挂车系统。 在本例的应用场景中,卡车-拖车系统(EGO车辆)在停车场行驶。当停车点被定位时,非线性预测控制规划器生成停车路径。然后,自行车使用另一个非线性MPC控制器,沿着规划的路径到达目标姿态…

攻防世界 适合做桌面_空间“狭小”的二人世界,适合情侣们做浪漫的事情

在最浪漫的11月与它邂逅&#xff0c;有着深秋的枫红、累累的苹果红、还有童话绘本中的苹果屋红&#xff0c;充满着热情活力的色彩&#xff0c;让人感到雀跃。眼瞧见银河的感动。那晚入住于福寿山农场的露营区&#xff0c;位在深山中的它空气轻透又鲜少光害&#xff0c;是观赏星…

使用混合多云每个人都应避免的3个陷阱(第1部分)

每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&#xff0c;仔细研…

jquery开关灯案例_全屋开关插座布局讲解,自己规划怕遗漏,手把手教你,很详细...

开关插座是装修内重要的一环&#xff0c;然而也最容易被忽视。装修完住进来后才发现插口不够用&#xff0c;插座被家具挡住&#xff0c;想改还得砸墙&#xff0c;没办法只能用拖线板。然而&#xff0c;满屋都是拖线板&#xff0c;乱糟糟的&#xff0c;看着就惹人烦&#xff0c;…

感量越大抑制频率约低_脉冲信号是什么?它与频率,占空比,正、负逻辑间是什么关系?...

在数字电子系统中&#xff0c;所有传送的信号均为开关量&#xff0c;即只有两种状态的电信号&#xff0c;这种电信号&#xff0c;我们称作做脉冲信号&#xff0c;这是所有数字电路中的基本电信号一个标准的脉冲信号如下图所示。我们把脉冲信号由低电压跳变至高电压的脉冲信号边…

【OFDM系列9】OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交

不经意间在知乎看到这样一个问题&#xff0c;在此记录一下我的看法 OFDM采用正交区分不同子载波的&#xff0c;但是子载波通过调相后携带了基带信号后&#xff0c;如何还能继续保证两者正交&#xff1f; 补充内容是&#xff1a;OFDM是指通过2组正交载波传递信息&#xff0c;但…

企业为什么要开通银企直联_企业为什么要做网站推广

随着现代社会的发展&#xff0c;如果企业不做网站推广&#xff0c;那么可以说是寸步难行&#xff0c;今天就来为大家说说企业为什么一 定要做网站推广的详情&#xff01;1 、网络品牌推广做网络营销的结果就是在互联网要有自己的品牌&#xff0c;并且可以再网络上得到无限性的延…

在Java错误产生之前对其进行处理的新方法

我们如何认识到解决预生产错误的旧方法还不够&#xff0c;以及我们如何能够改变这种情况 第一次尝试时就没有完美的代码&#xff0c;我们所有人都可以证明我们已经学到了很难的方法。 不管我们使用多少测试周期&#xff0c;代码审查或工具&#xff0c;总有至少一个偷偷摸摸的错…

curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页

做为嵌入式行业的从业者&#xff0c;最近经常听到PAAS&#xff0c;SAAS等和”云”相关的概念&#xff0c;被整的一头雾水。很多时候咱们的物联网硬件设备都会有一个云平台&#xff0c;用于设备管理或者UI应用展示等功能&#xff0c;这通常是由专门的前后端工程师配合美工一起完…