Java垃圾回收机制详解与堆分代

一:引用类型

         首先先简单的说一下Java的四大引用类型 分别为强引用 弱引用 软引用、虚引用

  1. 强引用:当JVM执行垃圾回收机制时 如果扫到该对象后判断为强引用 就不会被垃圾回收机制所回收  即使后期内存不足JVM宁愿抛出OutOfMemoryException也不会清除强引用对象

  2. 软引用:软引用大多数可以作为缓存使用 当GC扫到软引用对象后 会先判断内存是否充足 如果充足即不回收 如果紧张的话就回收该对象 由此可以判断 当程序抛出OutOfMemoryException时是注定没有软引用的存在的
  3. 弱引用:其实弱引用与软引用类似 都是被当做缓存来用 只不过当GC扫到软引用时该对象会立刻被回收 它存在的周期至多只有一次回收机制执行的时间
  4. 虚引用:虚引用是最弱的引用 可以用来做为对象是否存活的监控

二:几种常用的垃圾回收机制

  1.  标记-清除算法:该方法共两个阶段 首先先扫过所有对象 标记经过判断后不回收的对象 其次遍历整个堆 把未标记的对象进行清楚 当方法最大的弊端是会暂停程序的运行且会留下大量非整块的空间 当单个对象需要用到较大内存空间时即使内存足够也会申请失败
  2. 复制算法: 该方法首先把内存划分为大小相等的两个区域  先在其中一个区域进行内存分配 当执行GC的时候把不回收的对象全部复制到另一个区域 并进行内存整理 从而避免出现碎片 该方法的弊端为会减少一半的内存使用空间
  3. 标记-整理算法:该方法集合了标记标记清楚与复制算法优点 先进行标记后遍历整个堆内存 后进行整理使其排序 这样既可以避免标记清楚后的内存碎片空间也不会浪费一半的内存

三:堆分代

堆内存目前分为年轻代 年老代 所有新创建的对象都是年轻代 而经过数次GC回收后仍然会留下的被划分成年老代 这样可以提升GC的效率 可以理解为年老代存放的都是生命周期较长的对象 回收可以分为Minor GC、Major GC和Full GC

  1. Minor GC为从年轻代回收内存
  2. Major GC为清理年老代的内存
  3. Full GC为清理整个堆内存 

其中年轻代里有 一个Eden 和 两个Survivor 区域(一个被称为From一个被称为To)   一般推荐的比例为8:1  所有新创建出来的都是在Eden内 如果在经过一次Minor GC后该对象仍然存活就分配到Survivor区域 在经过数次Minor GC后仍然还存留着就会被分配到年老代 

年轻代内许多对象都为“朝生夕死”对象 所以一般使用复制回收算法 因为该算法效率会根据存活对象而影响 因为要全部复制所以存货对象越少效率越高且不会产生内存碎片

Minor GC流程

一次完成的Minor GC为刚开始所有对象都处于Eden区与Survivor区中的From区中 开始执行时会将Eden区全部复制到To区中 而Survivor中的From区会根据遍历的次数 大于一定次数分配到年老代 否则的话也复制到To区 这样之后Eden区与From区两个都全部清空了 这个时候From区与To区就会相互转换 使To区为空的 这样不断循环直到To区被填满 填满后所有对象都会被移动到年老代中

你可能感兴趣的:(Java垃圾回收机制详解与堆分代)