这篇文章将讨论一种技术,以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写, 在JVM中无法禁用垃圾收集 。 但是,有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。

如您所知,JVM中发生了两个不同的GC事件,称为次要和主要集合。 关于这些收集期间发生的事情,有很多可用的材料,因此,我将不着重于详细描述其机制。 我只想提醒一下,在Hotspot JVM中-在次要收集期间,会收集eden和幸存者空间,在主要收集中,保管空间也会被清理和(可能)压缩。

如果打开GC日志记录(例如-XX:+ PrintGCDetails ),则会立即注意到主要集合是您应关注的集合。 一次大型垃圾收集的时间通常比一个清洁的年轻空间大几倍。 在大型GC中,有两个方面需要更多时间才能完成。 首先,年轻空间中的幸存者被复制到老地方。 接下来,除了清除旧版本中未使用的引用外,大多数GC算法还压缩了旧空间,再次需要消耗宝贵的CPU周期。

在旧空间中放置许多对象也增加了从旧空间到年轻空间的引用更多的可能性。 当检查这些表以确定年轻空间中的对象是否适合使用GC时,这将导致更大的卡片表 ,跟踪引用并增加次要GC暂停的时间。

因此,如果我们无法关闭垃圾收集,是否可以确保这些冗长的大型GC的运行频率降低,并且从使用权空间到Young的引用计数保持较低水平?

答案是肯定的。 甚至有一些疯狂的配置已完全摆脱了主要的GC。 摆脱主要的GC事件确实是一项复杂的工作,但是减少这些长时间停顿的频率是每个部署都可以实现的目标。

我们正在考虑的策略是限制使用期限的对象数量。 例如,在典型的Web应用程序中,创建的大多数对象仅在HttpRequest期间才有用。 存在并且将始终具有更长的寿命的共享状态,但是关键在于以下事实:短暂生存的对象与长期生存的共享状态的比率非常高。

现在进行任何部署的棘手部分是了解为短期对象提供多少肘部空间,以便

  • 您可以保证短期对象不会被提升为终身空间
  • 您不会过度配置,从而增加了基础架构的成本

从概念上讲,做到这一点很容易。 您只需要测量在请求期间为短期对象分配的内存量,并将其与峰值加载时间相乘即可。 您将要得到的结果是您想要在eden或单个幸存者空间中容纳的内存量。 这将使GC真正有效地运行,而不会意外升级为终身保有权。 从概念层面进行放大会发现一些复杂的技术问题,我将在以后的文章中介绍这些问题。

那么从这里可以得出什么结论呢? 首先-为您的应用程序确定理想的GC配置是一项复杂的工作。 这既是坏消息,也是好消息。 不好的是–它需要您进行大量的实验。 考虑到这一点,我们很乐意解决棘手的问题,目前正在制定实验以进一步研究该领域。 有朝一日,在不久的将来, Plumbr能够为您完成此任务,从而使您免于无聊的管道工作,并使您可以专注于手头的实际问题。

翻译自: https://www.javacodegeeks.com/2014/10/reducing-the-frequency-of-major-gc-pauses.html

减少主要GC暂停的频率相关推荐

  1. gc频繁的暂停启动_减少主要GC暂停的频率

    gc频繁的暂停启动 这篇文章将讨论一种减少垃圾收集暂停的技术,它会延迟应用程序的延迟. 正如我几年前所写, 在JVM中无法禁用垃圾收集 . 但是,有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率 ...

  2. JVM初探——使用堆外内存减少Full GC

    问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是 ...

  3. 阿里三面必问JVM知识点- 使用堆外内存减少Full GC

    问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用户线程并发GC以降低STW时间, 但它也并非十分完美, 尤其是 ...

  4. JVM初探- 使用堆外内存减少Full GC

    JVM初探-使用堆外内存减少Full GC 标签 : JVM 问题: 大部分主流互联网企业线上Server JVM选用了CMS收集器(如Taobao.LinkedIn.Vdian), 虽然CMS可与用 ...

  5. jvmti_JVMTI标记如何影响GC暂停

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

  6. JVMTI标记如何影响GC暂停

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

  7. GC暂停时间过长——排查分析

    告警 本次GC日志分析 2022-11-17T17:58:50.518+0800: 1217960.132: [GC (Allocation Failure) 2022-11-17T17:58:50. ...

  8. GC 调优(实战篇) - GC参考手册

    说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间内分配的量; 同理, Promotion Rate 翻译为 提升速率; 您应该已经阅读了前面的章 ...

  9. 7. GC 调优(实战篇) - GC参考手册

    本章介绍导致GC性能问题的典型情况.相关示例都来源于生产环境, 为演示需要做了一定程度的精简. 说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间 ...

最新文章

  1. 产品思维-产品初期准备
  2. LV 旗下公司的识别算法: 4 秒鉴定假包,准确率达 99.1%
  3. Angular 4.x 自定义验证指令
  4. 网站集成QQ登录功能
  5. 若依单体项目定时任务模块使用教程
  6. 数据库startup报错_SQL Server数据库恢复过程内部–数据库STARTUP命令
  7. 标准模板库中的优先队列(priority_queue)
  8. 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符go时,第一个只出现一次的字符是g。当从该字符流中读出前六个字符“google时,,,(C++实现)
  9. 【目标定位】基于matlab去偏卡尔曼滤波目标定位仿真【含Matlab源码 140期】
  10. 网易轻舟服务网格数据面性能优化实践
  11. svnadmin的使用
  12. 数据结构试卷(节选)
  13. ubuntu14.04人脸相似度dlib模块和skimage模块安装
  14. XM7 FOR ANDROID,[转]2014年初Android平台主机模拟器大全
  15. 纯CSS3制作优惠券线性UI效果
  16. 【CVPR-2019】基于深度学习优化光照的暗光图像增强
  17. C++实现小写转大写
  18. 云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇(文末赠书)
  19. 摄影测量(二):航空摄影
  20. 萝卜开会直播NO.2 | 换一个十年,感受不一样的世界

热门文章

  1. Linux清理磁盘挂载点方法(亲测有效)
  2. php mysql 编码为utf-8_php连mysql用 utf-8编码乱码怎么办
  3. Eclipse导入他人的Maven工程报错
  4. HttpServletRequest中getAttribute()和getParameter()的区别
  5. 优先队列——二项队列(binominal queue)
  6. Ubuntu下MySQL、Redis以及MongoDB三个数据库的启动、重启以及停止命令
  7. java xmpp_Java XMPP负载测试工具
  8. zing jvm_Zing加快了JVM应用程序的预热
  9. spring框架介绍_Spring框架介绍
  10. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试