JVMTI标记如何影响GC暂停

这篇文章分析了为什么Plumbr Agents在某些情况下以及如何延长GC暂停的时间。 对基本问题进行故障诊断揭示了有关在GC暂停期间如何处理JVMTI标记的有趣见解。

发现问题

我们的一位客户抱怨说,附加了Plumbr代理后,应用程序的响应速度明显降低。 通过分析GC日志,我们发现GC时间异常。 这是不带Plumbr的JVM摘录的GC日志:

2015-01-30T17:19:08.965-0200: 182.816: [Full GC (Ergonomics) 
[PSYoungGen: 524800K->0K(611840K)] 
[ParOldGen: 1102620K->1103028K(1398272K)] 1627420K->1103028K(2010112K), 
[Metaspace: 2797K->2797K(1056768K)], 0.9563188 secs] 
[Times: user=7.32 sys=0.01, real=0.96 secs]

这是附加了Plumbr代理的一个:

2015-02-02T17:40:35.872-0200: 333.166: [Full GC (Ergonomics) 
[PSYoungGen: 524800K->0K(611840K)] 
[ParOldGen: 1194734K->1197253K(1398272K)] 1719534K->1197253K(2010112K), 
[Metaspace: 17710K->17710K(1064960K)], 1.9900624 secs] 
[Times: user=7.94 sys=0.01, real=1.99 secs]

异常隐藏在经过的时间中。 实时时间是经过的实际时间。 如果您手里拿着秒表,那么实时将等于该数字。 用户时间 (加上系统时间)是测量过程中消耗的总CPU时间。 如果多个内核上有多个线程,则该时间可能大于实时时间。 因此,对于并行GC,实时时间应大致等于(用户时间/线程数)。 在我的机器上,该比率应该接近7,而没有Plumbr Agent的情况下确实是如此。 但是使用Plumbr时,该比率大大下降。 绝对不行!

初步调查

有了这样的证据,以下是最可能的假设:

  1. Plumbr导致JVM在每个GC之后执行一些繁重的单线程操作
  2. Plumbr导致JVM使用更少的线程进行垃圾回收

但是,仅查看GC日志中的一行,就无法进行更狭窄的观察,因此我们继续进行可视化上述比率:

gc-pause-long

图表上的下降恰好发生在Plumbr发现内存泄漏的那一刻。 在根本原因分析过程中,GC可能会给GC带来一些额外负担,但永久影响GC暂停时间绝对不是我们为代理特意设计的功能。 这种行为有利于第一个假设,因为我们不太可能在运行时影响GC线程的数量。

创建隔离的测试用例花费了一段时间,但是在以下约束的帮助下,我们可以钉上它:

  1. 应用程序必须泄漏内存以供Plumbr检测
  2. 应用程序必须经常暂停以进行垃圾收集
  3. …以及作为突破时刻–应用程序必须具有较大的活动集,这意味着在Full GC中幸存的对象数量必须很大。

在编译了足够小的测试用例之后,可以放大根本原因检测范围。 合理的方法是打开和关闭Plumbr代理的各个功能,并查看问题将在哪种配置下重现。

通过这种简单的搜索,我们设法将问题定位到Plumbr Agent执行的单个操作。 关闭JVMTI标签后,问题消失了。 在分析gc根和引用链的路径时 ,我们标记堆上的每个对象。 显然,GC时间在某种程度上受我们生成的标签的影响。

寻找根本原因

不过,尚不清楚为什么GC暂停会延长。 垃圾会被Swift收集,并且大多数带标签的对象都应该符合GC的条件。 但是发现的是,存在大量活动集(这是内存泄漏的症状之一),其中保留了许多带标签的对象。

但是,即使对活动集中的所有对象都进行了标记,这也不应线性影响GC时间。 GC完成后,我们会收到有关所有已收集的标记对象的通知,但活动集不在这些对象之内。 这使人们想知道,HotSpot是否出于某种奇怪的原因在每个GC之后迭代所有标记的对象。

为了验证索赔,可以查看热点源代码。 经过一番挖掘之后,我们最终到达了JvmtiTagMap :: do_weak_oops ,它的确遍历了所有标签,并对所有标签进行了一些不太便宜的操作。 更糟的是,该操作是顺序执行的,并且不并行执行。 在找到每个垃圾回收之后调用此方法的调用链之后,解决了最后一个难题。 (为什么这样做的方式以及它与弱引用的关系完全超出了本文的范围)

在并行GC上运行并具有与串行运行相同的昂贵操作,一开始似乎是设计缺陷。 第二个想法,JVMTI的创建者可能从未期望有人标记所有的堆,因此从来没有费心去优化此操作或并行运行它。 毕竟,您永远无法预测人们将使用您设计的功能的所有方式,因此也许值得检查一下Hotspot中的GC后活动是否也应该有机会使用现代JVM倾向于使用的所有gazillion内核。可使用。

因此,为了解决这个问题,我们需要清理不再需要的标签。 修复它就像在我们的JVMTI回调之一中仅添加三行一样容易:

+  if(isGenerated(*tag_ptr)) {
+    *tag_ptr = 0;
+  }

而且瞧瞧,一旦分析完成,我们几乎和开始时一样出色。 如下面的屏幕快照所示,在发现内存泄漏期间仍然存在暂时的性能波动,并且在完成内存泄漏分析之后会略有恶化:

gc-pause-short

包起来

现在,补丁已推出,并且解决了Plumbr检测到泄漏后GC暂停时间受到影响的情况。 随意去获取更新的代理以解决性能问题。

作为一个总结,我建议您在使用广泛的标签时要格外小心,因为“便宜”的标签会堆积在角落的箱子上,从而为性能的大幅下降奠定了基石。 为确保您没有滥用标记,请翻转– XX:+ TraceJVMTIObjectTagging的诊断选项。 它将使您能够估计标签映射消耗多少本机内存以及堆遍历花费的时间。

翻译自: https://www.javacodegeeks.com/2015/02/jvmti-tagging-can-affect-gc-pauses.html

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

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

相关文章

使用Apache Hadoop计算PageRanks

目前,我正在接受Coursera的培训“ 挖掘海量数据集 ”。 我对MapReduce和Apache Hadoop感兴趣已有一段时间了,通过本课程,我希望对何时以及如何MapReduce可以帮助解决一些现实世界中的业务问题有更多的了解(我在这里介绍了另一种解…

分享一篇关于奇异值分解的文章[Eng]

原文地址:http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/ One day, a bunch of friends, who happened to be big Family Guy fans, decided to put together a site to rank and share their thoughts on the show. Soon thereafter they h…

为雅安祈福

四川是个多灾多难的省份,更是个多地震的省份,十年之内发生了两次大地震。我们能做的就是为雅安的人们祈福。 淘宝给互联网带头了: 天猫也跟着祈福了,因为他们都属于阿里巴巴,这里就不上图了。 百度作为国内互联网企业的…

在运行时打开GC日志记录

总是有下一个JVM表现不佳。 而且,您内心深知,如果您只有少数启动选项可以公开一些有关正在发生的事情的信息,那么您可能就有机会真正修复该死的东西。 但是不,您需要的标志( -XX: HeapDumpOnOutOfMemoryErr…

jpannel设置位置xy_实用的摄影技巧!10种常见摄影场景的单反相机设置技巧!

相机是爱拍一族必不可少的东西,对于摄影爱好者对于一些相机设置技巧可能也不是太了解,在摄影过程中,有很多的场景需要不同的设置,根据光线变化和周围环境,一般来说都会特定的摄影技巧,今天红视觉和大家一起…

Only digits (0-9) can be put inside [] in the path string: formData.XXX

使用uniapp开发时微信小程序中爆出的问题,问题在于form表单组件中绑定表单值,去除报错值则正常。 解决办法如下: 修改注释行内容, 转载连接

外包以小时计算金额的费用_2020年初级会计各大税种的计算公式,请收藏!

一、各种税的计算方式增值税1、一般纳税人应纳税额销项税额—进项税销项税额销售额税率组成计税价格成本(1成本利润率)组成计税价格成本(1成本利润率)(1-消费税税率)2、进口货物应纳税额组成计税价格税率组成计税价格关税完税价格关税(消费税)3、小规模纳税人应纳税额销售额征收…

VSCode设置ESLint语法检查

转载 "eslint.validate": ["javascript","javascriptreact","vue-html",{"language": "vue","autoFix": true}],"eslint.run": "onSave","eslint.autoFixOnSave": true…

次要GC,主要GC与完整GC

在使用Plumbr中的GC暂停检测功能时,我被迫通过大量有关该主题的文章,书籍和演示工作。 在整个旅程中,我多次对次要,主要和完全GC事件的使用(误用)感到困惑。 这导致了这篇博客文章,我希望我设法…

怎么改字段名称_精装房这么改!换门框,封阳台,效果出来比毛坯房还好

最近有朋友后台留言,称自己原本想一步到位购买精装房,但收房验收时才发现根本不合心意,空间利用率太低配色也老气,已经打算重新改装了。所谓精装房就是开发商将地板、门、厨房、卫生间、少量天花和部分柜子进行安装,业主只要添加些…

ZF2系列 – Zend Framework 2 MVC實作 (Part 3)

我之所以這麼喜歡Zend Framework的關係,其中一項就是它可以幫你很簡單的實現MVC的架構,所以今天的任務就是要建立一個以MVC為架構的基本網頁。 首先當然要先建立一個測試用的資料庫,因此我簡單的建立了一個名為Employee的資料表來進行展示&am…

方向盘左右能摇动_学车这么久了,你还不会打方向盘呢?

刚刚学车的朋友肯定有过这样的问题:教练说:往左打两圈,往右打一圈,往左打半圈……你乖乖听话照做,然后教练说:回正吧。是不是一下就蒙住了??我刚才打几圈来着?&#xff1…

Asp.Net基础 - 9.Web开发原则

目录: 9.1.Web开发的一些基本原则 9.2 原则一 9.2.1 C#代码是运行在服务器端的,JS代码是运行在浏览器客户端的 9.2.2 在服务器端“弹出消息窗口” 9.2.3 案例说明(客户端与服务端互不影响) 9.3 原则二 9.4 原则三 9.4.1 客户端…

重置手机_【轻松办税】ITS客户端申报密码重置不会操作?看过来,3分钟包你会!...

ITS扣缴客户端实名办税功能已经上线了,并且在2020年1月1日后将不再支持以CA方式进行登录,可是公司申报密码是很久前去大厅办理的,早就忘记了,这可咋好?别急,快来关注“上海税务”,包你3分钟学会…

Drools 6.2.0.Final发布

我们很高兴宣布最新,最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能,这些功能使项目更易于使用(和采用)。 新功能包括对工作台UI的大量改进,对社交活动和插件管理的支持以及规则的全新E…

对OIM Web(UI)层进行压力测试

Oracle IDM中的默认配置保留20个专用于服务前端(UI)请求的线程 。 从根本上讲,这意味着应用程序服务器具有20个线程池,可用于为通过Web控制台(/ identity或/ sysadmin)访问OIM的用户提供服务。 对于Weblog…

java 拼接html_程序员用1.5小时写出的Java代码,让同事瞠目结舌!直呼优秀

1.曾经不止一次在生产中见过类似这样的代码:这有很多变种,例如用 Integer.valueOf(1)、 (Integer)1 之类的,那些细节都不重要。重要的是:凭空用一个 Integer 对象作为锁对象。2.AbstractComponentBuilderTemplateFactory3.HelloWo…

本地项目antd 修改.less文件导致内存溢出

项目场景: antd 项目,修改less文件会导致内存溢出 问题描述 本地环境antd 项目,修改less文件会导致内存溢出;如下 FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory原因分析: 这…

序列化代理模式

在上一篇文章中 ,我谈到了一般的序列化。 这是更加集中的内容,并提供了一个细节: 序列化代理模式 。 这是处理序列化许多问题的一种好方法,通常是最好的方法。 如果开发人员只想了解有关该主题的一件事,我会告诉他。 …

函数分组学通MongoDB——第三天 细说高级操作

改章节个人在广东喝咖啡的时候突然想到的...明天就有想写几篇关于函数分组的文章,所以回家到后之就奋笔疾书的写出来发布了 明天跟大家分享一下mongodb中比拟好玩的识知,要主括包:聚合,标游。 一: 聚合 见常的聚合作操…