垃圾收集算法,垃圾收集器

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

为此,我们对使用特定GC算法的频率进行了研究。 结果有些令人惊讶。 让我从数据的背景开始–我们可以访问来自84,936个会话的数据,这些会话代表2670种不同的环境用于研究。 13%的环境明确指定了GC算法。 其余的决定权交给了JVM。 因此,在使用显式GC算法的11,062会话中,我们能够区分出六种不同的GC算法:

在了解有关GC算法用法的详细信息之前,我们应该停一分钟,然后尝试理解为什么上面的饼图中缺少87%的运行。 我们认为,这是两个不同根本原因的征兆

  • 首先也是有充分理由的是– JVM在选择合理的默认值方面已经表现出色,以至于开发人员不再需要深入研究。 如果您的应用程序吞吐量和延迟足够,那么–为什么要打扰?
  • 缺少GC算法的第二个可能原因表明,应用程序性能并不是团队的首要任务。 正如我们去年的案例研究所表明的那样,仅需调整一项配置即可显着提高吞吐量和延迟。

因此,我们有将近83,000个使用默认GC选择运行的JVM。 但是默认值是什么? 答案既简单又复杂。 如果认为您正在客户端JVM上运行,则JVM所应用的默认值为串行GC(-XX:+ UseSerialGC)。 在服务器级计算机上,默认值为并行GC(-XX:+ UseParallelGC)。 可以基于以下决策表确定是在服务器还是客户端类计算机上运行:

建筑 CPU /内存 操作系统 默认
i586 任何 微软视窗 客户
AMD64 任何 任何 服务器
64位SPARC 任何 的Solaris 服务器
32位SPARC 2个以上内核和> 2GB RAM 的Solaris 服务器
32位SPARC 1核或<2GB RAM 的Solaris 客户
i568 2个以上内核和> 2GB RAM Linux或Solaris 服务器
i568 1核或<2GB RAM Linux或Solaris 客户

但是,让我们回到在配置中已明确指定GC算法的13%的人。 它以良好的旧串行模式开始,毫无疑问,它的用户群如此之小,以至于在上图中几乎看不到它。 实际上,只有31个环境确定这是最佳的GC算法,并且已明确指定了该算法。 考虑到当今大多数平台都在多核计算机上运行,​​您应该不会感到惊讶–当您拥有多个核时,几乎总是建议从串行模式切换。

GC 计数
序列号 31
平行 1,422
平行旧 1,193
ConcMarkSweep 6,655
CMSIncrementalMode 935
G1 826

其余配置可以分为三组-并行,并发和G1。 赢家是显而易见的-并发标记和扫描算法相结合构成了样本的三分之二以上。 但是,让我们更深入地研究结果。

Parallel和ParallelOld模式大致在同一邻域中,具有1,422和1,193个样本。 不足为奇–如果您确定并行模式适合您的年轻一代,那么对于老一代而言,相同的算法通常也表现良好。 并行模式中另一个有趣的方面是–从上面可以看出,并行模式是大多数常见平台上的默认模式,因此缺乏明确的规范并不意味着它不比其他模式流行。

对于CMS,我们的期望有所不同。 即–与具有6556种配置的传统CMS相比,增量模式仅在935次打开。 提醒您-在并发阶段,垃圾收集器线程正在使用一个或多个处理器。 增量模式用于通过定期停止并发阶段以使处理器退还给应用程序来减少长时间的并发阶段的影响。 这样可以缩短暂停时间,尤其是在处理器数量少的机器上。 目前尚不清楚环境是全部拥有海量核心,还是负责配置的人员都不知道增量模式的好处。

但是我们最大的惊喜与G1的采用率有关。 G1作为垃圾收集算法正在运行826个环境。 根据我们的经验,无论您是追求吞吐量还是等待时间,G1的表现都比CMS差。 也许我们可以访问的测试用例的选择不多,但是目前我们认为G1需要更多的时间来实际兑现其承诺。 因此,如果您是快乐的G1用户,也许可以与我们分享您的经验?

参考: 您正在使用什么垃圾收集器? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2013/11/what-garbage-collector-are-you-using.html

垃圾收集算法,垃圾收集器

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

  1. 垃圾收集算法,垃圾收集器_确定活动的热点垃圾收集器

    垃圾收集算法,垃圾收集器 StackOverflow问题查找正在运行哪种类型的垃圾收集 器,jvm的默认垃圾收集器 , 如何通过查看gc日志来查看正在运行的垃圾收集器? ,以及如何知道HotSpot ...

  2. 垃圾收集算法,垃圾收集器_为什么我不能关闭垃圾收集器?

    垃圾收集算法,垃圾收集器 让我们开始快速回顾一下我作为Java开发人员的职业生涯的早期. 我想消除正在进行的测试中的垃圾回收(GC)暂停. 瞧,当我发现无法完成时,我很生气. 那时,我把问题留在了&q ...

  3. epub 阅读器_全球与中国EPUB阅读器市场深度调研分析报告

    QYResearch预测:2020-2026全球与中国EPUB阅读器市场现状及未来发展趋势 [纸版价格]:RMB 18000 [电子版(PDF)价格]:RMB 18000 [报告篇幅]:103 [报告 ...

  4. 带倍速音频播放器_带有播放列表HTML5音频播放器

    带倍速音频播放器 HTML5 Audio player with playlist HTML5 audio player. Many of you faced with the task of cre ...

  5. mysql的事件探查器_用SQL Server事件探查器创建跟踪

    SQL Server事件探查器(Profiler)可以帮助数据库管理员跟踪SQL Server数据库所执行的特定事件,监视数据库的行为;并将这些有价值的信息保存到文件或表,以便以后用来分析解决数据库出 ...

  6. python编写装饰器_写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) 1 de ...

  7. 自定义音频播放器_创建自定义HTML5音频播放器

    自定义音频播放器 在本教程中,我将向您介绍HTML5音频,并向您展示如何创建自己的播放器. 如果您想走捷径,请查看Envato市场上可用的现成的HTML5音频播放器 . 它使您可以从各种来源创建播放列 ...

  8. 使用什么优化器_新的深度学习优化器Ranger:RAdam + LookAhead强强结合

    [导读]给大家介绍一个新的深度学习优化器,Ranger,同时具备RAdam和LookAhead的优点,一行代码提升你的模型能力. Ranger 优化器结合了两个非常新的发展(RAdam + Looka ...

  9. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

最新文章

  1. 【css】页面出现两个滚动条以及只有一半页面显示内容的解决方法
  2. 钉钉、支付宝合种树,2-4天领证,限量9个名额
  3. java和asp.net core_.NET Core和ASP.NET Core简介与区别
  4. 设计模式----原型模式(C++实现)
  5. 如何保险检查SD卡为扩容卡
  6. 前端之路--第三周学习
  7. 【洛谷P1606】白银莲花池【最短路】
  8. curl: (67) Access denied: 530的可能原因
  9. 【TCP拥塞控制算法(TCP congestion control algorithm)学习笔记】
  10. 什么是FBO (Frame Buffer Object)
  11. Oracle DB 序列
  12. iphone应用开发
  13. Spike探针-敏捷
  14. 程序员不要太过于看重编码技巧,相比而言思想更重要
  15. 字符串函数中的求长度、查找、分割和错误报告函数(strlen,strstr,strtok,strerror)
  16. 在vscode编辑器里使用leetcode插件刷题
  17. 通达信l2接口公式分享
  18. 酷柚易汛进销存商业版功能更新及修复部分问题
  19. 区块链的“不可能三角”
  20. 姓氏,先有姓还是先有氏呢?两者有什么区别?

热门文章

  1. codefoces 939E Maximize!好题
  2. 面试官让我讲下线程的TIMED_WAITING状态,我又笑了
  3. vue调用methods里的方法
  4. Java中的binarySearch方法
  5. 很简单很简单的DBHelper类
  6. java for遍历hashmap_Java 使用for和while循环遍历HashMap的方法及示例代码
  7. 2小时学习Spring Boot 2019版本 代码一样推送至github上面去
  8. thinking-in-java(20)注解
  9. java异常—— finally 子句+带资源的 try语句
  10. Spring boot(3):Spring boot中Redis 的使用