下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

java开发_教你认识各种Java垃圾回收器的标准对比

作者:java开发     来源: www.kokojia.com点击数:1060发布时间: 2015-09-24 10:36:53

标签: java开发java基础java教程

大神带你学编程,欢迎选课

现在已经是2015年了,但对于大多数Java开发人员来说,有两件事情是仍然是个谜 - 垃圾收集和异性(养殖场被人嘲笑)。因为我不是特别理解java开发的后者,我想我会试着说说前杠,特别是与Java 8的来临,这个地区发生了许多变化显著和升级,最重要的是持久代(的PermGen)删除以及一些令人兴奋的新的优化(后面将继续引用这些)。
 
java开发_教你认识各种Java垃圾回收器的标准对比
 

说到垃圾收集,并且很多人都知道它的概念,但也有在日常的程序应用。尽管如此,还是有很多事情我们不明白,这是悲惨的。 JVM它最大的误解就是认为只有一个垃圾收集器,而且它有四个不同收藏家的事实,每个人都有自己的长度。 JVM不会自动选择一个,这件事情你必须要落在我的肩上,因为不同的收藏家会带来显著差异吞吐量和应用程序的暂停时间。
在常见的这四个收集算法是,它们代,它们将承载堆划分成几个区域,假设许多堆对象的生命周期的很短,它可以快速地进行恢复出来。演示片有很多内容,所以在这里我要直接谈论这些不同的算法,以及他们的长处和短处。

1.串行收集器
串行回收利用是一个最简单的,你会不会考虑它,因为它主要是针对单线程环境(例如32或Windows)和相对小堆。恢复时间将工作线程都将冻结的所有应用程序,就这一点使得它无法将使用由服务器应用程序。
如何使用它:你可以打开-XX:+ UseSeRIAlGC此JVM参数来使用它。

2.并行/吞吐量收集
接下来是并行收集器(并行收集器)。这是默认的JVM收集器。正如它的名字一样,它的最大优点是,它使用多线程扫描和压缩堆。它的缺点是,不管该未成年GC的执行或完全GC,将暂停应用程序线程。并行恢复是最适合这些应用程序可以容忍的停顿,它试图减少因收集的CPU开销。

3.CMS收藏家
并行收集后是一个收藏家的CMS(并发标记 - 清除)。这个算法使用java多线程(并发)扫描堆和标记(标记),可以回收不再使用(扫描)物体。 (这些对象老一代的线程的入口点或静态变量的访问)当初始标记时,根对象当这个算法并行运行:在这两种情况下,这种算法将进入“阻止世界”的模式。当一个应用程序更改堆的状态,使它不得不回头重新确认自己的标志都是正确的对象。
这样做的最大的问题是收藏家会遇到晋升失败,这是指竞争条件的出现和新的一代老一代的恢复。如果收集需要被提升到旧的目标的年轻一代,但此时的老一代没有多余的空间,它只能进行一次STW(停止World)的完整的GC - 而这种情况是CMS是可取的避免。为了确保这种情况不会发生,你要么是增加老一代的大小(或增加整个堆的大小),或者被分配到一些后台线程的恢复,使得对象分配的速度比赛。
该算法的另一缺点是相对于和平行集电极,CPU资源它使用会更多,它使用多个线程来执行扫描和恢复,以便让应用程序继续提供吞吐量更高的水平。对于大多数长期运行过程中,暂停的应用是很不利的他们来说,这时候要考虑使用CMS收集器。然而,这种算法不是默认启用的。你必须指定-XX:+ UseConcMarkSweepGC来启用它。假设你的筹码小于4G,并且要分配更多的CPU资源,避免了应用程序停顿,那么这就是你要选择一个收藏家的东西。但是,如果堆栈大于4G,您可能更愿意使用这最后--G1收集器。

4.G1收藏家
G1(第一垃圾)收集器最早是在JDK 7update 4,其目的是不是堆4GB,以更好地支持更多的介绍。 G1收集堆成多个区域,大小不等,从1MB到32MB,并使用多个后台线程进行扫描。 G1收集器将优先考虑那些最包含垃圾回收的扫描区域,这是它的名字(垃圾第一)的由来。这种恢复可以通过-XX:启用UseG1GC大关。
这种策略减少了后台线程扫描可能性无用对象堆前未完成已被耗尽,情况收集器将不得不暂停该应用程序,这将导致污水处理厂恢复。另一个好处是,它总是G1堆压缩,而CMS采集器只有在完整的GC将做到这一点。
在过去的几年里,一直是争论的满场桩,很多开发商从一台机器模特出身的单个JVM JVM单机多微的服务,基于组件的架构。这是由许多因素,包括组件分离步骤,简化了部署驱动时,重新加载应用程序的类,以避免产生存储器的开销(在这方面的Java 8已改善)。
然而,最重要的是这样做的,希望避免“阻止世界”在长期堆GC暂停(它需要一个大的回升,几秒钟即可完成)。这样的容器,如码头工人技术加速了这一进程,使您可以轻松地部署在同一台物理计算机上的多个应用程序。

Java的8 G1收藏家
Java的8更新引入了很大的优化G1收集20串重量(字符串重复数据删除)。因为字符串(包括其内部的char []数组)占据了大部分的堆空间的,这个新的优化旨在使G1集电极可以识别那些重复串堆和它们指向的相同的内部的字符[]数组中,为了避免相同的字符串的多个拷贝作为有效利用堆将变低。您可以使用-XX:+ UseStringDeduplication此JVM参数来试试这个功能。

Java的8和永久代
Java开发的8最大的变化是取消了永久的一代,这原本是用来类的元数据,居民字符串,静态变量分配空间。而以前需要开发针对那些应用程序将加载很多类的具体优化和调整堆的比例。这是真正的许多年,这是许多内存不足异常的根本原因,因此JVM接手这真的再好不过了。即便如此,也不会自行降低发展商申请去耦,以不同的JVM的可能性。学习更多相关资讯或视频教程欢迎进入课课家教育查询详情。

赞(10)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程