深入分析JVM:Java垃圾收集算法+常用垃圾收集器解析( 二 )
可以很明显看到 , 回收之后内存空间是不连续的 , 产生了大量的内存空间碎片 。 过多内存碎片最直接的就是可以导致以后在程序运行过程中需要分配较大对象时 , 无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作 。
标记-清除算法的缺点1、标记和清除两个过程都比较耗时 , 效率不高2、会产生大量不连续的内存碎片 。
为了解决这两个问题 , 所以就有了复制算法 。
复制(Copying)算法复制算法的思想就是把内存区域一分为二 , 两块内存保持一样的大小 , 每次只使用其中的一块 , 当其中一块内存使用完了之后 , 将仍然存活的对象复制到另一块内存区域 , 然后把已使用的一半内存全部一次性清理掉 。 如下图(绿色表示暂时不放对象的一半空间):
文章插图
回收之后:
文章插图
复制算法的缺点复制算法的缺点就是牺牲了一半的内存空间 , 有点过于浪费 。
复制算法在Java虚拟机的落地形式Java堆内存中做了好几次划分 , 最后是将Survivor区分成了2个区域S0和S1来进行复制算法 , 这种做法就是为了弥补原始复制算法直接将一半的空间作为空闲空间方式的弥补 。 想要详细了解Java堆内存划分及原因的可以点击这里 。
IBM公司的研究表明 , Young区(新生代)中98%的对象都是“朝生夕死”的 , 生命周期极短 , 所以说在一次GC之后能存活下来的对象很少 , 完全没必要划分一半的区间来进行复制算法 。 Hot Spot虚拟机中Eden区和Survivor区域的比例为:Eden:S0:S1=8:1:1 , 也就是说其实只有10%的空间被浪费掉 , 完全是可以接受的 。
标记-整理(Mark-Compact)算法我们想一下 , 假如Young区(新生代)的对象在一次GC之后 , 基本所有对象都存活下来了 , 那就需要复制大量的对象 , 效率也会变低 。 而堆中的old区(老年代)的特点就是对象生命周期极为顽强 , 因为默认要进行第16次垃圾回收的时候还能存活下来的对象才会放到老年代 , 所以对老年代中对象的回收一般不会选择标记-复制算法 。
标记-整理算法就是为了老年代而设计的一种算法 , 标记-整理算法和标记清除算法的区别就是在最后一步 , 标记-整理算法不会对对象进行清理 , 而是进行移动 , 将存活的对象全部向一端移动 , 然后清理掉端边界以外的对象 。 如下图所示:回收前:
文章插图
回收后:
文章插图
分代收集算法(Generational Collection)目前主流的商业虚拟机都是采用的分代收集算法 , 这种算法本质上就是上面介绍的算法的结合体 。 新生代采用标记-清除算法 , 老年代采用标记-清除或者标记-整理算法 。
垃圾收集器上面介绍了确定对象的算法以及回收对象的算法 , 然后具体要怎么落地却并没有一个规定 , 而垃圾收集器就是实现了对算法的落地 , 而因为落地形式不同 , 自然也产生了很多不同的收集器 。 下面是一张收集器的汇总图:
文章插图
上面一半表示新生代收集器 , 下面一半表示老年代收集器 , 横跨中间的表示都可以用 。
根据这个图形有了整体认知之后 , 我们再来一个个看看这些垃圾收集器的工作原理吧 。
Serial和Serial Old收集器Serial收集器是基本、发展历史悠久的收集器 , 在JDK1.3.1之前是虚拟机新生代收集的唯 一选择 。 Serial收集器是一种单线程收集器 , 而且是在进行垃圾收集的时候需要暂停所有其他线程 , 也就是说触发了GC的时候 , 用户线程是暂停的 , 如果GC时间过长 , 用户是可以明显感知到卡顿的 。 Serial Old是Serial的一个老年代版本 , 也是一种单线程收集器 。 可以用下面一个图形来表示一下Serial和Serial Old收集器的工作原理:
文章插图
优点:简单高效 , 拥有很高的单线程收集效率缺点:收集过程需要暂停所有线程算法:Serial采用复制算法 , Serial Old采用标记-整理算法适用范围:Serial用于新生代 , Serial Old用于老年代应用:Client模式下的默认的收集器
ParNew收集器ParNew收集器是Serial收集器的多线程版本 , 实现了并行执行 , 其余工作原理都和Serial一致 。 可以使用参数:-XX:+UseParNewGC来指定使用 。
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 程序员学英语第1天——JavaScript 程序测试的介绍1
- 三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经
- 《深入理解Java虚拟机》:对象创建、布局和访问全过程
- java面试题整理
- Kotlin集合vs Kotlin序列与Java流
- Java安全之Javassist动态编程
- 推荐Java工程师必看,12个Hadoop领域的上手项目
- 震惊!京东T4大佬面试整整三个月,才写了两份java面试笔记
- 整理:常见的Java开发框架有哪些,看过,就赶紧收藏吧
