无锡 网站建设,亚马逊雨林的原始部落,上海最新事件,wordpress多媒体占用id文章目录1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器本文参考#xff1a;深入理解Java虚拟机#xff1a;JVM高级特性与最佳实践#xff08;第3版#xff…
文章目录1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器本文参考深入理解Java虚拟机JVM高级特性与最佳实践第3版 1. 垃圾收集器概述 图中所示七种垃圾收集器虽然算不上先进技术但是它们在实践中足够成熟基本上可以认为是现在未来两、三年内能够在生产环境上放心使用的所有垃圾收集器了。
这七种垃圾收集器是作用于不同分代的两个收集器之间若有连线则说明它们可以搭配使用。垃圾收集器的位置则表示了属于新生代还是老年代收集器。
垃圾收集器根据发展实践可以分为
串行吞吐量优先响应时间优先 2. Serial 收集器
Serial收集器是最基础、历史最悠久的收集器。它是用于新生代的垃圾收集器。
这个收集器是一个单线程工作的收集器“单线程”不仅仅代表了这个收集器只会使用一个处理器或一个收集线程去进行垃圾收集工作更重要的是Serial 收集器在进行垃圾收集的时候必须暂停其他所有工作直到收集工作完成。
也就是说在用户不可知、不可控的情况下把用户的正常工作的线程全部停掉这是一个不能接受的事情。 即使 Serial 收集器是最早出现的垃圾收集器但是如今HotSpot虚拟机运行在客户端模式下的默认新生代收集器依然是 Serial 收集器。
Serial 收集器的优点很简单那就是简单高效在内存资源受限的环境中它是所有收集器里额外内存消耗最小的对于单核处理器或核心数较小的处理器来说Serial 收集器没有线程交互的开销专心做垃圾收集因此保证了收集效率。 3. ParNew 收集器
ParNew 收集器实际上就是 Serail 收集器的多线程版本除了同时使用多线程进行垃圾回收之外其他的任何行为包括所有控制参数、收集算法等都与 Serail 收集器一样并无太多创新之处 并且除了Serial收集器外目前只有ParNew收集器可以与CMS收集器配合工作。
CMS是一款在强交互应用中几乎可称为具有时代意义的垃圾收集器它是真正意义上支持并发的垃圾收集器首次实现了让垃圾收集器线程在用户线程同时工作所以CMS的出现巩固了ParNew的地位。
ParNew 收集器在单核心处理器的环境绝对不必Serial收集器更好的效果甚至存在线程交互的开销。 ParNew收集器通过超线程技术实现的伪双核处理器环境中都不能百分之百超越Serial。
不过随着处理器核心数量的增加ParNew对于垃圾收集时的系统资源高效利用还是很有好处的它默认开启的收集线程数和处理器核心线程数相同。 4. Paraller Scavenge 收集器
Paraller Scavenge 收集器是基于标记-复制算法实现的收集器也是能够并行收集的多线程收集器。
该垃圾收集器常被称为“吞吐量优先收集器” 并行并行描述的是多条垃圾收集器线程之间的关系说明同一时间有多条这样的线程在协同工作通常默认此时用户线程是处于等待状态 并发并发描述的是垃圾收集器线程与用户线程之间的关系说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结所以程序仍然能响应服务请求但由于垃圾收集器线程占用了一部分系统资源此时应用程序的处理的吞吐量将受到一定影响。 Paraller Scavenge 收集器的特点是达到一个可控的吞吐量。 Parallel Scavenge 收集器提供了两个参数用于精确控制吞吐量分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis 参数以及直接设置吞吐量大小的-XX:GCTimeRatio 参数
-XX:MaxGCPauseMillis参数允许值是一个大于0的毫秒数收集器会尽力保证内存回收花费时间不超过用户的设定值**但是这个参数值不建议设置得更小一点因为垃圾收集停顿时间是牺牲吞吐量和新生代空间为代价的。**系统把新生代调的小一点垃圾收集速度肯定快一点但是随之而来的就是频繁的垃圾收集因此吞吐量也会下来。-XX:GCTimeRatio值应该是一个大于0小于100的正数也就是垃圾收集时间总时间的比率相当于吞吐量的倒数。比如设置为19那么就是允许的最大垃圾收集器占用的时间为5%即1/119默认为99允许的最大1%1/199为垃圾收集时间 5. Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本同样也是一个单线程收集器使用标记-整理算法 如果在服务端模式下它也可能有两种用途:一种是在JDK 5以及之前的版本中与 Parallel Scavenge 收集器搭配使用9另外一种就是作为 CMS 收集器发生失败时的后备预案在并发收集发生Concurrent Mode Failure 时使用。 6. Parller Old收集器
Parller Old收集器是Parller Scavenge收集器的老年代版本支持多线程并发收集基于标记-整理算法实现。 在Parller Old收集器没有出现之前Parller Scavenge收集器只能和Serial Old收集器搭配使用由于Serial Old收集器应用性能上的拖累并不能是的Parller Scavenge收集器未必能发挥出最好的吞吐量最大化的效果。这组合甚至不如ParNew加CMS的组合来得优秀。
直到 Paraller old 收集器出现后“吞吐量优先”收集器终于有了比较名副其实的搭配组合在注重吞吐量或者处理器资源较为稀缺的场合都可以优先考虑 Paraller Scavenge 加Paraller Old 收集器这个组合。 7. CMS 收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的 Java 应用集中在互联网网站或者基于浏览器的 B/S 系统的服务端上这类应用通常都会较为关注服务的响应速度希望系统停顿时间尽可能短以给用户带来良好的交互体验。
CMS收集器是基于标记-清除算法实现的。它的回收垃圾的步骤如下 初始标记 需要Stop The Word仅仅标记从GC Roots的直接关联对象速度很快 并发标记 从GC Roots的直接关联对象开始遍历整个对象图的过程过程耗时但不需要停顿用户线程可以与垃圾收集线程一起并发允许 重新标记 需要Stop The Word为的是修正并发标记期间因用户程序继续允许而导致标记产生变动的拿一些对象的标记记录。停顿时间比初始标记时间常但比并发标记时间短 并发清除 清除标记阶段判断已经死亡的对象由于不需要移动存活对象所以这个阶段也是可以和用户进程同时运行的 CMS的优点的优点有并发收集、低停顿。
不过CMS并没有达到完美它有以下几个缺点
CMS收集器对处理器资源非常敏感CMS无法处理浮动垃圾 由于并发标记和并发清除阶段用户线程是继续运行的程序在运行的时候自然会产生新的垃圾对象。 由于使用标记-清除算法实现所以会导致空间碎片比较多。 8. Garbage First 收集器
Garbage First 收集器也成为G1收集器它是垃圾收集器技术发展历史上的里程碑式的成果它开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式。
G1收集器面向堆内存任何部分来组成回收集 (Collection Set一般简称 CSet)进行回收衡量标准不再是它属于哪个分代而是哪块内存中存放的垃圾数量最多回收收益最大这就是 G1 收集器的 Mixed GC 模式。
G1开创的基于 Region 的堆内存布局是它能够实现这个目标的关键。虽然 G1 也仍是遵循分代收集理论设计的但其堆内存的布局与其他收集器有非常明显的差异G1 不再坚持固定大小以及固定数量的分代区域划分而是把连续的 Java 堆划分为多个大小相等的独立区域(Region)每一个Region 都可以根据需要扮演新生代的 Eden 空间、Survivor 空间或者老年代空间。收集器能够对扮演不同角色的 Region 采用不同的策略去处理这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
Region 是 G1收集器的单位回收的最小单位这样做可以有计划避免整个JAVA堆中进行全区域的垃圾收集。并且G1收集器会跟踪各个Region的价值大小也就是回收所获得的空间大小以及回收所需要的时间的经验值在后台形成一个优先队列再根据用户设定的允许的停顿时间优先处理那些回收价值大的Region这样保证了G1收集器在有限的时间内获取尽可能高的收集效率。 G1收集器的运作步骤
初始标记 仅仅只是标记一下GC Roots 能直接关联到的对象并且修改 TAMS 指针的值让下一阶段用户线程并发运行时能正确地在可用的 Region 中分配新对象。这个阶段需要停顿线程但耗时很短而且是借用进行Minor GC 的时候同步完成的所以G1 收集器在这个阶段实际并没有额外的停顿。 并发标记 从GC Root开始对堆中对象进行可达性分析递归扫描整个堆里的对象图找出要回收的对象这阶段耗时较长但可与用户程序并发执行。当对象图扫描完成以后还要重新处理 SATB 记录下的在并发时有引用变动的对象。 最终标记 对用户线程做另一个短暂的暂停用于处理并发阶段结束后仍遗留下来的最后那少量的 SATB 记录。 筛选回收 负责更新 Region 的统计数据对各个Region 的回收价值和成本进行排序根据用户所期望的停顿时间来制定回收计划可以自由选择任意多个 Region 构成回收集然后把决定回收的那一部分Region 的存活对象复制到空的 Region 中再清理掉整个旧 Region 的全部空间。这里的操作涉及存活对象的移动是必须暂停用户线程由多条收集器线程并行完成的。