垃圾收集器的类型
从不同角度分析垃圾收集器,可以分为不同的类型:
1、按线程数分
串行收集器
串行收集器一次使用一个线程进行垃圾回收
并行收集器
并行收集器一次开启多个线程进行垃圾回收,在并行能力较强的CPU上,使用并行收集器可以缩短GC的停顿时间。
2、按工作模式分
并发式收集器
并发式收集器与应用程序交替进行,以尽可能的减少应用程序的停顿时间
独占式收集器
独占式收集器一旦运行,将停止应用程序的其他所有线程,知道垃圾回收过程完全结束。
3、按碎片处理方式
压缩式收集器
压缩式收集器会在回收完成后,对存活的对象进行压缩整理,消除回收后的碎片
非压缩式收集器
非压缩式收集器回收垃圾对象后,不进行内存压缩整理,会产生碎片
4、按工作内存区间
新生代收集器
新生代收集器只在新生代工作
老年代收集器
老年代收集器只在老年代工作
新生代串行收集器
单线程垃圾回收,独占式垃圾回收。串行收集器运行,所有应用程序线程停止,产生Stop the World。
新生代串行收集器采用复制算法,在单核CPU或者较小的应用内存等硬件平台不是特别优越的场合,性能表现可以超过并行收集器。
在Hot Spot虚拟机中,-XX:+UseSerialGC 参数可以指定使用新生代串行收集器和老年代串行收集器。
新生代串行收集器的GC标识为DefNew。
老年代串行收集器
使用标记-压缩算法,也是单线程、独占式的垃圾回收。老年代串行收集器在GC的标识为Tenured。
并行收集器
串行收集器的多线程化,回收策略、算法、参数和串行收集器一样。并行收集器也是独占式的,垃圾回收时,应用程序暂停工作。使用多线程进行垃圾收集
开启并行收集器参数:
-XX:+UseParNewGC: 新生代使用并行收集器,老年代使用串行收集器。
-XX:+UseConcMarkSweepGC: 新生代使用串行收集器,老年代使用CMS
-XX:+UseParallelGC: 新生代使用并行收集器,老年代使用串行收集器。
指定并行收集器线程数:
-XX:ParallelGCThreads: 一般等于CPU数.
并行收集器的GC标识为ParNew。
新生代并行收集器
多线程、独占式,采用复制算法,关注系统吞吐量。
参数启用:
-XX:+UseParallelGC 新生代使用并行收集器,老年代使用串行收集器。
-XX:+UseParallelOldGC 新生代和老年代都是用并行收集器。
其他参数:
-XX:MaxGCPauseMillis: 设置最大垃圾收集停顿时间。(大于0的整数)
-XX:GCTimeRatio: 设置吞吐量大小(0~100的整数)
-XX:+UseAdaptiveSizePolicy 自适应GC策略,新生代大小、eden和survivor的比例、老年代晋升年龄等自动调整。
新生代并行收集器的GC标识:PSYoungGen
老年代并行收集器
标记-压缩算法、多线程。
参数:
-XX:+UseParallelOldGC 新生代和老年代都是用并行收集器。关注系统吞吐量
老年代并行收集器的GC标识:ParOldGen
CMS收集器
并行收集器关注吞吐量,CMS(Concurrent Mark Sweep)收集器关注停顿时间,使用标记-清除算法。也是多线程并行的收集器。
工作步骤:
初始标记、并发标记、重新标记、并发清楚、并发重置
出事标记和重新标记是独占系统资源的,其他步骤是和应用程序线程并行的。
参数:
-XX:ParallelCMSThreads: 设置CMS线程数。
CPU资源紧张,CMS收集器的性能会很糟糕。当堆内存使用率达到某一阈值才进行垃圾收集,以确保应用程序依然有足够的空间运行。
-XX:CMSInitiatingOccupancyFraction: 默认68,即老年代空间使用率达到68%进行CMS回收。内存使用率增长过快使CMS过程出现内存不足、CMS失效,JVM将启用老年代串行收集器。
-XX:+UseCMSCompactAtFullCollection CMS后进行碎片整理
-XX:CMSFullGCsBeforeCompaction: 多少次CMS进行一次内存压缩。
参考:
《Java程序性能优化 让你的Java程序更快、更稳定》
相关推荐
垃圾收集器线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行。它有效地防止了内存渗漏体的出现,并极大可能地节省了宝贵的内存资源。但是,通过Java虚拟机来执行垃圾收集...
CoreCLR是.NET Core的运行时,包括垃圾收集器、JIT编译器、原始数据类型和低级类
可达性分析:这种类型的垃圾收集通常叫做跟踪性垃圾收集器。 原理很简单,就是将对象即及引用关系看着一个图。选定活动对象作为 GC Roots,然会跟踪引用链,如果一个对象和GC Roots之间不可达,也就是说不存在引用链...
coreclr:CoreCLR是.NET Core的运行时。 它包括垃圾收集器,JIT编译器,原始数据类型和低级类。
一个干净的垃圾收集器接口,用来改善垃圾收集器源代码之间的隔离效果,这样可以为HotSpot 虚拟机中的内部垃圾收集代码提供更好的模块化功能,也可以更容易向 HotSpot 添加新的垃圾收集器。 并行、完整的 G1 垃圾...
一个干净的垃圾收集器接口,用来改善垃圾收集器源代码之间的隔离效果,这样可以为HotSpot 虚拟机中的内部垃圾收集代码提供更好的模块化功能,也可以更容易向 HotSpot 添加新的垃圾收集器。 并行、完整的 G1 垃圾...
一个干净的垃圾收集器接口,用来改善垃圾收集器源代码之间的隔离效果,这样可以为HotSpot 虚拟机中的内部垃圾收集代码提供更好的模块化功能,也可以更容易向 HotSpot 添加新的垃圾收集器。 并行、完整的 G1 垃圾...
用于Rust的简单跟踪(标记和清除)垃圾收集器 可行,但仍在建设中。 说明了设计和动机,并给出了中的代码草图。 关于cgc的初始设计(它的实验并发分支)还有。 如何使用 要包含在您的项目中,请将以下内容添加到...
本文论述使用Hoare风格的程序验证框架形式验证渐进式标记-清扫垃圾收集机制及其写拦截器在汇编语言层次上的实现的研究工作.被验证的属性涵括了简单的类型安全到整个内存堆上的数据保持.本文所有的验证工作都实现在...
下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于 Java 和它的功能的常见问题,Java 的集合类,垃圾收集器,第二篇主要讨论异常处理,Java 小应用程序,Swing,JDBC,远程方法调用(RMI),...
1. 新的垃圾收集器:Java 17引入了新的垃圾收集器,称为ZGC和JDK 17中的其他一些优化。这些新的垃圾收集器提供了更好的内存管理和更高的吞吐量,从而提高了应用程序的性能。 2. 新的Java模块系统:Java 17引入了新...
micro-mitten是一种类似于Rust的基本编程语言,其目的是简化控制流结构和类型系统。 像Rust一样, micro-mitten提供了一种静态的内存管理方法。但是, micro-mitten的方法与Rust的方法明显不同。 micro-mitten依赖...
我们编译如下: antlr4 gc.g4 -访客javac * .java g ++ -shared -fPIC library.cpp -o library.so 运行编译器: java Compiler <input.c> output.ll 生成代码的优化: opt -S -std-compile-opts output.ll> ...
通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。 JEP 307: 向 G1 引入并行 Full GC JEP 310: 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展...
垃圾类型 分类收集 保洁员将不同类型的垃圾分类收集存放 回收处理 可回收物分别卖给回收公司 其他垃圾,掩埋,焚烧,生化处理 垃圾分类处理流程 智能垃圾分类系统建设方案全文共22页,当前为第3页。 软件及硬件系统 ...
通过使用C#语言来开发本系统。C#是一种简洁、类型安全的面向对象的语言,开发人员可以使用它来构建在 .NET ...类型安全,C#实施最严格的类型安全,以保护自己及垃圾收集器,在C#中,被传递的引用参数是类型安全的。
如果仅通过引用计数就可以释放所有值,则此库使用的收集器不会占用额外的内存。 这与某些其他实现不同,其他实现需要手动收集以释放收集器使用的额外内存。例子 use gcmodule :: {Cc, Trace};use std :: cell :: ...
00.尚硅谷_Java11_笔记、源码 01.尚硅谷_Java11_简介 02.尚硅谷_Java11_官方...尚硅谷_Java11_Epsilon垃圾收集器 14.尚硅谷_Java11_ZGC垃圾收集器 15.尚硅谷_Java11_FightRecorder1 16.尚硅谷_Java11_FightRecorder2
当对象没有任何引用指向它们时,它们将被视为垃圾,然后由Java的垃圾收集器自动删除。 强类型:Java是强类型的编程语言,这意味着每个变量都必须先声明其数据类型。 安全性:Java设计时的重点之一是安全性,因此它...
当对象没有任何引用指向它们时,它们将被视为垃圾,然后由Java的垃圾收集器自动删除。 强类型:Java是强类型的编程语言,这意味着每个变量都必须先声明其数据类型。 安全性:Java设计时的重点之一是安全性,因此它...