7-8垃圾箱分布_您认为有关垃圾收集的7件事-完全错了

7-8垃圾箱分布

关于Java Garbage Collection的最大误解是什么?它的真实情况如何?

小时候,我的父母曾经告诉我,如果我学习不好,我将成为垃圾收集者。 他们几乎不知道,垃圾回收实际上是很棒的。 也许这就是为什么即使在Java世界中,许多开发人员也会误解GC算法:它们如何工作,GC如何影响其应用程序以及您可以对此做些什么。 这就是为什么我们求助 Java性能调优专家Haim Yadid并将Java性能调优指南放到Takipi博客上的原因。

新帖:关于垃圾回收的7件事您以为您知道-完全错了http://t.co/3QJLJuKCRq pic.twitter.com/aqQEF0zTkK

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

由于对性能调优指南的兴趣,在此后续文章中,我们决定收集一些有关垃圾回收的流行观点,并向您展示为什么它们是完全错误的。 以下是前7名:

1.只有一个垃圾收集器

不,并且4也不是正确的答案。 HotSpot JVM总共有4个垃圾收集器: 串行,并行/吞吐量。 CMS,并在块G1上新建一个孩子 。 但是,还有更多,还有非标准的垃圾收集器,还有更多冒险的实现,例如Shenandoah或其他JVM使用的收集器(例如C4, Azul的不间断收集器)。 HotSpot的默认值是并行/吞吐量收集器,通常它不是您的应用程序的最佳选择。 例如,CMS和G1收集器将导致较少的GC暂停。 但是,当出现暂停时,其持续时间很可能会比Parallel收集器引起的持续时间更长。 另一方面,对于相同大小的堆,并行收集器通常可实现更高的吞吐量。

总结:根据您的要求选择合适的垃圾收集器:可接受的GC暂停频率和持续时间。

2.并行=并发

垃圾回收周期可以是STW(紧急停止)并导致GC暂停,也可以并发执行而无需停止应用程序。 当我们更进一步时,GC算法本身可以是串行(单线程)或并行(多线程)的。 这就是为什么当我们提到并发GC时,它不一定意味着它是并行完成的;反之,当我们提到串行GC时,它并不一定意味着它会引起暂停。 在垃圾回收世界中,Concurrent和Parallel是两个绝对不同的术语,其中Concurrent是指GC周期,而Parallel是指GC算法本身。

总结:垃圾回收是一个两步游戏,调用GC周期的方式及其进行业务的方式是两件不同的事情。

3. G1解决了所有问题

G1收集器是Java 7中引入的,并且经过了许多更改和修改,是JVM垃圾收集器的最新成员。 主要优势在于,它解决了CMS收集器常见的碎片问题:GC循环释放旧一代的内存块,并使它看起来像瑞士奶酪,直到一会儿JVM无法处理并不得不停止并停止运行。处理碎片。 但这还不是故事的结局,在某些情况下其他收藏家的表现可能优于G1。 这完全取决于您的要求。

要点:没有所有GC问题的奇迹解决方案,需要进行实验以帮助您为JVM选择正确的收集器。

4.平均交易时间是最重要的指标

如果仅监视服务器中的平均交易时间,那么您会错过异常值。 人们对系统用户的破坏性知之甚少。 例如,通常需要100毫秒以下的事务可能会受到GC暂停的影响,并且需要一分钟才能完成。 如果您只查看平均交易时间,那么除了用户以外的任何人都不会注意到。 现在考虑1%或更多用户的这种情况,您会发现仅查看平均值就可以轻松忽略它。 有关与延迟相关的更多问题以及解决方法,请点击此处查看Gil Tene的博客。

要点:密切注意异常值,了解系统在第99个百分位数( 不是1% )上的表现。

5.降低新的对象分配率将改善GC行为

我们可以将系统中的对象大致分为三类:长期存在的对象,通常对它们我们无能为力,导致最大问题的中期存在的对象,以及通常被释放并导致长期生存的短期对象分配Swift,因此它们在下一个GC周期中消失了。 中度对象是那些注重其分配率可以带来积极结果的对象。 集中精力于短期和长期的对象通常不会被证明是有效的,控制中期对象通常是一项艰巨的任务。

要点:并不是唯一的对象分配速率会限制您的服务器,而是造成所有麻烦的对象类型。

6.调整可以解决所有问题

如果您的应用程序需要保持经常更改的大型状态,那么调整JVM的堆并不会带来太多好处。 GC长时间停顿是不可避免的。 可以在体系结构更改方面提出解决方案,以确保具有关键过程/瓶颈影响响应时间的流程不会包含大状态。 大型状态和响应能力不能很好地结合在一起:将其分解为不同的流程将是解决之道。

总结:并非所有问题都可以通过调整JVM标志来解决,有时您只需要回到绘图板上即可。

7. GC日志会导致大量开销

这是完全不正确的,尤其是默认的日志设置。 数据非常有价值,并且Java 7引入了挂钩来控制它们的大小,并确保它们不会耗尽您的所有硬盘驱动器。 如果您不收集GC日志数据,那么您将失去了解JVM垃圾收集在生产中的行为的唯一途径。 可接受的GC开销通常有5%的上限,要知道系统中的收费GC暂停产生了什么样的费用并将其最小化,付出的代价是很小的。

总结:竭尽所能,在生产中从系统中获取最多的数据。 那里是一个完全不同的世界。

结论

我们希望这些内容能帮助您更好地了解Java中垃圾回收的真正工作方式。 您是否在应用程序中认识到其中一些问题? 您是否遇到其他更常见的垃圾回收错误? 在下面的评论部分让我们知道。

翻译自: https://www.javacodegeeks.com/2015/04/7-things-you-thought-you-knew-about-garbage-collection-and-are-totally-wrong.html

7-8垃圾箱分布

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

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

相关文章

c语言中abort函数的使用

点击上方蓝字关注我&#xff0c;了解更多咨询1、abort函数的作用是异常终止一个进程&#xff0c;意味着abort后面的代码将不再执行。2、当调用abort函数时&#xff0c;会导致程序异常终止&#xff0c;而不会进行一些常规的清除工作。实例#include <stdio.h> #include <…

php 异常值检测,PHP中的错误处理、异常处理机制分析

例&#xff1a;$a fopen(test.txt,r);//这里并没有对文件进行判断就打开了&#xff0c;如果文件不存在就会报错?>那么正确的写法应该如下&#xff1a;if(file_exists(test.txt)){$ffopen(test.txt,r);//使用完后关闭fclose($f);}?>一、PHP错误处理的三种方式A、简单的…

c语言中如何防止数组下标越界

点击上方蓝字关注我&#xff0c;了解更多咨询1、若数组长度和下标访问值出现错误&#xff0c;则会导致数组下标越界。数组下标从0开始&#xff0c;访问值为-1。2、在使用循环遍历数组元素时&#xff0c;注意防范off-by-one的错误。对于作为函数参数传入的数组下标&#xff0c;要…

java oauth2.0_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

java oauth2.0将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要…

c语言中数组访问越界如何理解

点击上方蓝字关注我&#xff0c;了解更多咨询1、可以通过数组下标直接访问数组中的元素。2、如果一个数组被定义为n个元素&#xff0c;那么访问n个元素是合法的。如果访问n个元素以外&#xff0c;则是非法的&#xff0c;称为访问越界。实例int a[5] {0}; //等价 int a[5] {0,…

php全部公开课,PHP公开课|这篇PHP的each()函数教学数,只为了帮你的PHP会学的更好...

【摘要】PHP作为一种超文本预处理器&#xff0c;已经成为了我们常用的网站编程语言&#xff0c;并且结合了C语言&#xff0c;Java等我们常见的编程语言&#xff0c;所以&#xff0c;有很多web开发领域的新人都看中了他的使用广泛性&#xff0c;有很多人都想了解php的内容&#…

ogm session_带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序

ogm session欢迎回到我们的教程系列“带有Hibernate OGM的NoSQL”&#xff01; 感谢Gunnar Morling&#xff08; gunnarmorling &#xff09;创建了本教程。 在这一部分中&#xff0c;您将学习如何在WildFly服务器上运行的Java EE应用程序中使用Hibernate OGM。 使用本教程前面…

java的define,关于预处理器:Java中的#define

我开始用Java编程&#xff0c;我想知道是否相当于C EDCOX1(0)的存在。对谷歌的快速搜索表明它没有&#xff0c;但有人能告诉我是否存在类似的东西吗&#xff1f;在Java中&#xff1f;我正在努力使我的代码更可读。例如&#xff0c;我希望能够编写myArray[PROTEINS]&#xff0c;…

c语言中函数是怎么理解?

点击上方蓝字关注我&#xff0c;了解更多咨询1、C语言中的函数是一个可以重复使用的代码&#xff0c;用于独立完成某个功能。2、它可以接收用户传输的参数&#xff0c;也可以不接收&#xff0c;将代码段封装成函数的过程称为函数定义。如果有返回值&#xff0c;使用return语句返…

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

java g1 收集调优JVM背后发生了什么&#xff0c;垃圾回收如何影响Java性能&#xff1f; 性能调优世界是一个危险的地方&#xff0c;一个JVM标志失衡&#xff0c;事情很快就会变得繁琐。 因此 &#xff0c;我们决定求助于Java性能调优专家&#xff0c; 单调 JVM探查器mjprof的创…

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

函数也被称为方法&#xff01;函数的作用及特点&#xff1a;1、用于定义功能&#xff0c;将功能封装。2、可以提高代码的复用性。函数注意事项&#xff1a;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;而…