《深入理解Java虚拟机》:垃圾收集器与内存分配策略( 二 )
文章插图
分代收集算法:基于新生代和老年代对象生命周期不同的特点 , 采用不同收集算法的一种算法 。
在新生代中 , 每次垃圾回收都有大批量的对象死去 , 只有少了存活 , 可以选用复制算法;而老年代对象存活率高、必须使用“标记-清除”或者“标记-整理”算法 。
垃圾收集器垃圾收集器是垃圾收集算法的具体实现 。 以下是所有收集器的总图 , 横线上半部分是支持新生代垃圾回收的收集器 , 横线下半部分是支持老年代垃圾回收的收集器 , 如果两个收集器之间有连线 , 说明它们可以搭配使用:
文章插图
Serial垃圾收集器(单线程、复制算法):单线程的含义是它只会使用一个CPU或者一条收集线程去完成垃圾回收工作 , 更重要的是在它进行垃圾收集时 , 必须暂停掉其他所有的工作线程(用户线程) 。
Serial垃圾收集器虽然在收集垃圾过程中需要暂停所有其他的工作线程 , 但是它简单高效 , 对于限定单个CPU环境来说 , 没有线程交互的开销 , 可以获得最高的单线程垃圾收集效率 , 因此Serial垃圾收集器依然是java虚拟机运行在Client模式下默认的新生代垃圾收集器 。
ParNew垃圾收集器(Serial+多线程):ParNew垃圾收集器其实是Serial收集器的多线程版本 , 也使用复制算法 , 除了使用多线程进行垃圾收集之外 , 其余的行为和Serial收集器完全一样 , ParNew垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程 。
ParNew收集器默认开启和CPU数目相同的线程数 , 可以通过-XX:ParallelGCThreads参数来限制垃圾收集器的线程数 。 ParNew虽然是除了多线程外和Serial收集器几乎完全一样 , 但是ParNew垃圾收集器是很多java虚拟机运行在Server模式下新生代的默认垃圾收集器 。
Parallel Scavenge收集器(多线程复制算法、高效):Parallel Scavenge收集器也是一个新生代垃圾收集器 , 同样使用复制算法 , 也是一个多线程的垃圾收集器 , 它重点关注的是程序达到一个可控制的吞吐量(Thoughput) , 高吞吐量可以最高效率地利用CPU时间 , 尽快地完成程序的运算任务 , 主要适用于在后台运算而不需要太多交互的任务 。 自适应调节策略也是ParallelScavenge收集器与ParNew收集器的一个重要区别 。
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
Serial Old收集器(单线程标记整理算法 ):Serial Old是Serial垃圾收集器年老代版本 , 它同样是个单线程的收集器 , 使用标记-整理算法 , 这个收集器也主要是运行在Client默认的java虚拟机默认的年老代垃圾收集器 。
在Server模式下 , 主要有两个用途:
- 在JDK1.5之前版本中与新生代的Parallel Scavenge收集器搭配使用 。
- 作为年老代中使用CMS收集器的后备垃圾收集方案 。
CMS收集器(多线程标记清除算法): Concurrent mark sweep(CMS)收集器是一种年老代垃圾收集器 , 其最主要目标是获取最短垃圾回收停顿时间 , 又称之为“响应时间优先垃圾收集器” , 和其他年老代使用标记-整理算法不同 , 它使用多线程的标记-清除算法 。最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验 。CMS工作机制相比其他的垃圾收集器来说更复杂 , 整个过程分为以下4个阶段:
推荐阅读
- Clearbot:一款能自动在水上追踪收集垃圾的机器人
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回
- 心灵上的垃圾也需要清理,这六条能不能帮到你,让你不再浮躁
- 华为手机如何清理垃圾?只需4步操作,就可彻底释放手机内存空间
- 华为手机怎么清理垃圾?学会这6个小妙招,彻底释放手机内存
- 《深入理解Java虚拟机》:Java内存区域
- 垃圾箱同款蓝色的iPhone12真机翻车了
- 为啥手机会收到许多垃圾短信、骚扰电话?八成是这3个问题所导致
- jvm系列五:垃圾回收机制之对象进入老年代时机
