java g1 收集调优_Java性能调优:充分利用垃圾收集器

java g1 收集调优

JVM背后发生了什么,垃圾回收如何影响Java性能?

性能调优世界是一个危险的地方,一个JVM标志失衡,事情很快就会变得繁琐。 因此 ,我们决定求助于Java性能调优专家, 单调 JVM探查器mjprof的创建者Haim Yadid 。 在这篇文章中,我们将分享他在实践中经受住考验的一些见解,并了解JVM内部在压力下的表现。

新帖:Java性能优化–如何最大程度地利用垃圾收集器http://t.co/NnzQpuWBHz pic.twitter.com/8zqMrUfSHl

— Takipi(@takipid) 2015年4月2日

了解您要面对的问题

JVM受到垃圾回收暂停的影响,该暂停的频率和持续时间各不相同。 在暂停过程中,一切都停止了,各种意外行为开始发挥作用。 当面对一个新的调优项目时,通常会发生以下两种情况之一:公司已经知道它存在垃圾回收问题,或者很快就会发现它有一个问题。 在此阶段,他们很可能会出现暂停,JVM卡住的不稳定行为以及性能普遍下降。 这些症状通常是通过响应时间慢,CPU和内存利用率高或系统在大多数情况下正常运行而具有异常行为(例如,极其缓慢的事务和断开连接)而可见的。

主要陷阱:忽略异常值

可以通过一种常见的错误来忽略这种行为,并且不会向任何人发出警报,这是一个常见的错误:测量平均交易时间,并忽略异常值。 这就是隐藏GC问题的地方:尽管大多数情况下系统可能表现正常,但有时其他系统的响应能力却会下降,并给许多用户带来不好的体验。 例如,一个通常需要100毫秒的事务会受到GC暂停的影响,并突然花费几秒钟甚至一分钟。 在电子商务站点中,如果系统的维护人员仅查看平均交易时间,则除用户以外的任何人都不会注意到这一点。 另一个很容易忽略的问题是,当系统吞吐量受到影响时(例如命中率达到20%),并且它无法发挥其潜力。 您可能永远不会知道出了什么问题,因为您没有查看正确的指标。 很多时候,原因是对GC开销的了解不足,并且只关注平均响应时间的一个指标,而忽略了第99个百分位数。

定义性能要求:频率和持续时间

这里的主要问题是:您认为应用程序中GC暂停频率和持续时间的可接受标准是什么? 例如,每天暂停15秒可能是可以接受的,而30分钟一次的频率对产品来说绝对是灾难。 这些要求来自每个系统的领域,在这些领域中,实时和高频交易系统将具有最严格的要求。

总体而言,看到15到17秒的停顿并不罕见。 某些系统甚至可能达到40-50秒的暂停,Haim也有机会在具有大量批处理工作的大堆的系统中看到5分钟的暂停。 因此,暂停持续时间在这里并不重要。

停止世界收集数据:GC日志的重要性

在基于HotSpot JVM的系统中,垃圾收集状态最丰富的数据源是GC日志。 如果您的JVM没有生成带有时间戳的GC日志,那么您就错过了用于分析和解决暂停问题的重要数据源。 这对于开发环境,登台,负载测试以及最重要的是在生产中都是如此。 您可以获取有关系统中所有GC事件的数据,无论这些事件是同时完成的还是导致世界停顿的:这些事件花费了多长时间,消耗了多少CPU以及释放了多少内存。 从这些数据中,您可以了解这些暂停的频率和持续时间,它们的开销,并继续采取行动来减少它们。

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:mygclogfilename.gc

GC日志数据收集的最低设置

从指标来看,5%通常是可接受的GC开销的上限,而一个应用程序与另一个应用程序之间可接受的暂停时间却大不相同。

这里值得提及的两个用于GC日志分析的工具是Github上可用的开源GC Viewer和jClarity的Censum 。

解决方案策略

获得所需信息后,就可以检查可能的原因和解决方案了。 您进行的每项更改都要求进行一次新测试,并进行一轮日志收集,以评估其有效性并确定它是否有助于我们前进并达到要求。 优选在生产中和在压力下。 我们可以通过4种主要方法来解决由GC暂停引起的问题:切换垃圾收集器,调整控制Java堆的标志,进行代码更改以及使用替代的JVM /收集器。 以下是对HotSpot领域中考虑的方法及其解决的问题类型的快速概述:

1.错误的垃圾收集器正在运行

粗略地说,JVM有4个垃圾收集器,您可以选择在启动期间使用哪个垃圾收集器。 要了解有关每种类型的更多信息,可以在此处查看比较。 GC问题的常见原因之一是针对您正在开发的应用程序类型使用了错误的收集器。 HotSpot的默认值是并行/吞吐量收集器,通常它不是您的应用程序的最佳选择。 选择合适的收集器的行为(通过JVM标志)是对系统优先级的声明,通常是要考虑的第一个问题。 通常,大多数并发的CMS和G1收集器将导致较少的暂停时间。 尽管出现暂停时,其持续时间可能会比Parallel收集器引起的持续时间长,因为它们的后备机制是单线程的(Ouch)。 另一方面,对于相同大小的堆,并行收集器将实现更高的吞吐量。 另一个准则与可预测性有关,如果可预测的性能是一个重要因素并且堆大小不大,那么并行收集器可能就是答案。 并且,如果平均响应时间/延迟是您的重中之重,那么CMS或G1最有可能是答案。

2.调优Java堆

选择了首选的GC算法之后,该进行一些调整了。 测量(通过GC日志)吞吐量和暂停时间分布,如果对此感到满意,就可以完成。 如果GC开销很高(并且吞吐量很低),通常增加堆大小将改善这种情况。 当要解决CMS或G1的长时间停顿时,情况就更加棘手。 造成碎片化的另一个原因是,JVM无法跟上对象从新一代迁移到旧一代的速度,然后需要暂停应用程序对其进行修复。 解决方案是提早启动GC或增加堆大小。

从经验来看,堆大小通常在1GB到8GB之间,因此,更大的大小变得更为罕见。 在精简过程中,通常会在调整过程中将堆大小增加到8GB以上。 较大的堆大小的一个可行原因是,当我们想要创建一个大的缓存时,但这也可以在堆外解决。

让我们来看另一个示例,以显示需要调整溢出率的位置。 假设应用程序需要100MB的空间来处理某些请求,而新一代的大小为50MB。 不应该出现在旧一代中的对象将很快到达那里。 需要调整新世代和幸存者空间以解决此问题,并确保寿命短的物体将在新世代中终止其寿命。 影响这里的主要因素是堆大小,新旧发电比,幸存空间大小和最大使用期限阈值–对象移动到旧发电需要多少GC周期。

我们需要考虑的另一个重要因素是应用程序的“实时设置”。 意味着长时间保留在内存中的对象的大小,例如,活动集的示例将是一个应用缓存,其中包含频繁的数据库查询结果集。 在调整JVM时,需要确保“ liveset”可以方便地容纳在旧版本中,并且除了消耗之外,该区域还具有足够的可用内存。 否则,将严重破坏JVM的行为,从而导致低吞吐量和频繁的暂停。

3.架构和代码更改

一些问题将迫使我们诉诸代码,甚至可能进行体系结构更改。 我们这里可以解决的麻烦原因之一就是碎片化。 CMS收集器的长时间停顿可能是由旧一代的碎片导致的。 每个GC周期都会释放旧一代的内存块,使其看起来像瑞士奶酪,直到片刻JVM 不能处理它为止 。 当JVM将来自新一代的对象移动到比这些“漏洞”更大的对象上,然后必须停止应用程序来解决问题时,就会发生这种情况。 状态随时间变化的应用程序必然会导致碎片化。 随着状态随着时间的推移而变化,“旧状态”对象将从旧版本中释放,而它们的替换状态在新一代中创建。 当它最终晋升为老一代时,它可能会不适用于正确的地方,这将导致碎片化。

对这类问题的体系结构解决方案可能是更新对象,将“状态”移到堆外机制或拆分过程,对延迟敏感的关键路径,其中有许多短期分配的对象到一个进程,大状态到另一个进程一。

4.备用JVM和垃圾收集器

如果暂停时间对您的应用程序至关重要,并且Hotspot JVM无法提供可接受的响应时间,则还有两个可能的选择。 第一个是具有不间断C4垃圾收集器的Azul Zing JVM 。 为了开始使用Zing,您将需要具有相对较大的计算机,并且堆大小必须从32GB开始。 另一个尚不成熟的选择,但是如果您喜欢边缘化,可能值得一试的是Shenandoah GC算法。 它使用一种称为布鲁克转发指针的技术,该技术可导致超低的暂停时间和合理的开销。

进一步阅读:领先的GC专家

为了更深入地了解Garbage Collection和JVM的内部,下面是一些在GC领域最有趣的人:

  • 查理·亨特 ( Charlie Hunt )是Oracle Java平台小组的成员,也是Java Performance一书的主要作者。
  • C4不间断垃圾收集器的创建者Azul Systems的首席技术官兼联合创始人Gil Tene 。
  • 性能调整和jClarity首席技术官兼联合创始人Kirk Pepperdine 。
  • Monica Beckwitt ,Java / JVM性能顾问。
  • Twitter的JVM / GC工程师Tony Printezis ,Oracle的前G1技术负责人。
  • Oracle的JVM开发人员Jon Masamitsu 。
  • Christine H. Flood和Roman Kennke ,Shenandoah GC算法的开发人员。

结论

垃圾回收是JVM中最引人入胜的主题之一,我们希望本文能帮助您更好地了解各个运动部件。 非常感谢Haim Yadid ,他同意与我们分享他的经验! 如果您有任何疑问或想要澄清,请在下面的评论部分中告诉我们。

翻译自: https://www.javacodegeeks.com/2015/04/java-performance-tuning-getting-the-most-out-of-your-garbage-collector.html

java g1 收集调优

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

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

相关文章

java的构造函数详解,Java构造函数与普通函数用法详解

函数也被称为方法!函数的作用及特点:1、用于定义功能,将功能封装。2、可以提高代码的复用性。函数注意事项:1、不能进行函数套用(不可以在函数内定义函数)。2、函数只有被调用才能被执行。3、基本数据类型(String、int、….)修饰的…

c语言中函数的声明和定义

点击上方蓝字关注我&#xff0c;了解更多咨询1、函数声明&#xff0c;无需实现该函数的功能。函数声明只是一个空壳&#xff0c;不会有特定的函数实现。2、函数定义&#xff0c;必须实现该函数的功能&#xff0c;要实现函数的实现。#include<stdio.h>实例//使用函数前&am…

bean注入属性_摆脱困境:将属性值注入配置Bean

bean注入属性Spring Framework对将从属性文件中找到的属性值注入到bean或Configuration类中提供了很好的支持。 但是&#xff0c;如果将单个属性值注入这些类中&#xff0c;则会遇到一些问题。 这篇博客文章指出了这些问题&#xff0c;并描述了我们如何解决它们。 让我们开始…

php 浏览器 打印控件,JavaScript_JavaScript 实现打印,打印预览,打印设置,WebBrowser是IE内置的浏览器控件 - phpStudy...

JavaScript 实现打印,打印预览,打印设置WebBrowser是IE内置的浏览器控件&#xff0c;无需用户下载.一、WebBrowser控件二、WebBrowder控件的方法 //打印WebBrowser1.ExecWB(6,1);//打印设置WebBrowser1.ExecWB(8,1);//打印预览WebBrowser1.ExecWB(7,1);关于这个组件还有其他的用…

c语言中常规函数和指针函数区别

点击上方蓝字关注我&#xff0c;了解更多咨询1、在函数名前面多了一个*号&#xff0c;而这个函数就是一个指针函数。2、其返回值是一个int类型的指针&#xff0c;是一个地址。实例#include<stdio.h>int* fun1(int* x) //传入指针 {int* tmp x; //指针tmp指向xret…

jvm崩溃的原因_JVM崩溃时:如何调查最严重错误的根本原因

jvm崩溃的原因当应用程序崩溃时&#xff0c;您可以学到什么&#xff1f; 我认为&#xff0c;“后见之明是20 /”是最喜欢的短语之一托马斯罗梅尔 &#xff0c;工程ZeroTurnaround的副总裁。 好吧&#xff0c;我实际上不确定在他的短语中占什么位置&#xff0c;但是我已经听过他…

golang web php,GitHub - kai-xx/goWeb: golang web 接口实现 -- 类似PHP的laravel

goWebgorose ormdotweb框架实现接口 -- 类似PHP的laravel项目结构说明因为 gorose orm 和 dotweb 框架 都是基于独立的组件, 所以我们可以对项目的目录做出自由的规划.在这里, 我们便规划一个遵循一般的mvc结构的项目目录.为了项目的易维护性和高可用性, 我们尽量采取成熟的架构…

jboss项目导入idea_JBoss BPM Suite快速指南–将外部数据模型导入BPM项目

jboss项目导入idea您正在从事一个大项目&#xff0c;在企业中开发规则&#xff0c;事件和流程以满足关键业务需求。 部分要求指出&#xff0c;某个业务部门将提供您的数据模型供您利用。 不会在JBoss BPM Suite数据建模器中设计此数据模型&#xff0c;但是在从业务中心仪表板…

mysql协议重传,MySQL · 源码分析 · 网络通信模块浅析

MySQL 网络通信浅析MySQL的网络通信协议主要包含以下几个层次&#xff0c;从最上层的MySQL数据包协议层到最底层的socket传输&#xff1a;| THD| Protocol| NET| VIO| SOCKET本文主要扫一下相关的代码&#xff0c;以下分析基于MySQL5.7。创建会话在MySQL5.7中对会话协议层的代码…

C语言代码优化11种实用方法

点击蓝字关注我1、选择合适的算法和数据结构选择一种合适的数据结构很重要&#xff0c;如果在一堆随机存放的数中使用了大量的插入和删除指令&#xff0c;那使用链表要快得多。数组与指针语句具有十分密切的关系&#xff0c;一般来说&#xff0c;指针比较灵活简洁&#xff0c;而…

spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序

spring boot注释1.简介 在以前的文章中&#xff0c;我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 &#xff0c;您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 &#xff0c;并仅使用Java config配置JMS项目…

obendclean php命令,ob_end_clean

用户评论:[#1]Sam Yong - hellclanner at live dot com [2011-05-04 22:14:35]Take note that if you change zlib output compression setting in between ob_start and ob_end_clean or ob_end_flush, you will get an error: ob_end_flush() failed to delete buffer zlib o…

C语言 | 简单工厂方法模式实现例子

点击蓝字关注我们1、简介简单工厂方法定义一个用于创建对象的类&#xff0c;该类接受一个参数&#xff0c;通过参数决定创建不同的对象。GOF并没有把简单工厂方法定义为23种设计模式之一&#xff0c;可以认为简单工厂方法是工厂方法的简化形式。为了体现简单工厂方法和工厂方法…

grpc 流式传输_编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中...

grpc 流式传输下载各种文件&#xff08;文本或二进制文件&#xff09;是每个企业应用程序的生死攸关的事情。 PDF文档&#xff0c;附件&#xff0c;媒体&#xff0c;可执行文件&#xff0c;CSV&#xff0c;超大文件等。几乎每个应用程序迟早都必须提供某种形式的下载。 下载是通…

matlab plot errorbar,如何为MATLAB errorbar plot的点和垂直线设置不同的图例?

这建立在Jens Boldsen’s answer之上,它添加了以下内容&#xff1a;>可以旋转表示图例中错误栏的线条使其垂直,或保持默认的水平方向;>该行的末尾用短线“关闭”.该方法非常通用,因为它支持&#xff1a;>任意颜色,线型和标记作为错误栏的参数.请注意,实际条形图始终绘…

C语言 / C++基础面试知识大集合

点击蓝字关注我们相对而言&#xff0c;C语言和C相关的面试题比较少见&#xff0c;没有Java方向写的人那么多&#xff0c;这是一篇 C 语言与 C面试知识点总结的文章&#xff0c;个人感觉非常难得&#xff0c;希望能对大家有所帮助。const作用修饰变量&#xff0c;说明该变量不可…

input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

input发送a.jax无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点&#xff0c;对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”&#xff0c;或者只是将它们转换为Unix时间戳值&#xff08;例如1435061152&#xff09…

php中is_int用法,php – is_int()和ctype_digit()之间有区别吗?

如果参数是整数类型&#xff0c;is_int()返回true&#xff0c;ctype_digit()采用字符串参数&#xff0c;如果字符串中的所有字符都是数字&#xff0c;则返回true。例&#xff1a;┌──────────┬───────────┬────────────────┐│ │ is_…

jooq sql_jOOQ星期二:Vlad Mihalcea深入了解SQL和Hibernate

jooq sql欢迎来到jOOQ Tuesdays系列。 在本系列文章中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及各种其他相关主题的人员。 我们很高兴在第三…

C语言灵魂拷问:++i 为比 i++效率高?

点击蓝字关注我们相信很多人遇到过这样的问题&#xff1a;printf("%d,%d",i,i);也纠结过这个问题&#xff0c;到底答案是什么。确没有一个参考的资料。唯一知道的是&#xff0c;几乎所有C语言教材都这么讲&#xff1a;i就是先使用i的值再使i自身加一&#xff0c;而i则…