jvm虚拟机(二)自动垃圾回收机制(GC)

GC(Garbage Collector)垃圾收集器:程序运行时自动回收那些不再被程序访问的对象空间的内存管理机制。

其中工作的原理:以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收(回收的是该对象占用的内存空间)JVM运行时数据区中,栈的内存分配在入栈的时候已经确定了,出栈即回收,所以不需要管内存回收。需要集中处理回收的主要是堆区。
接下来讨论就是重点:GC算法 →GC Root
第一个GC算法(Mark-Sweep标记清理算法标记清除阶段):
流程:从GC Root对象开始遍历整个JVM的内存,标记出哪些是存活的对象,遍历结束后,未标记的则是不要的对象,即垃圾对象应该被删除。然后删除垃圾对象。
缺点:产生内存碎片,内存碎片是啥呢(比如 对象A的大小为1KB 当对象A被清理后会留出相对应出1KB的空间,就在这个时候创建对象B大小为10KB,对象A被清理后会留出的1KB空间是放不下对象B的,对象B空间大于对象A空间,导致空间不能为合理利用,所以产生第二个方法GC算法)

第二个方法GC算法Mark-Sweep标记清理算法压缩阶段)整理:
流程:整理的意思是,前面一个对象被清理后,后面一个对象会自动补齐。这样会减少内存碎片。
缺点:带来另一个缺点,对象移动的代 价太大。所以产生了第三个方法

第三个方法GC算法(Copy Collection复制算法)
流程:把整个内存一分为二。第一个内存区
域 中标价出来要 清理的对象 。把没有被标记的好对象 全部移入第二个内存区域中。
缺点:需要内存空间大(2倍内存)所以产生了第四个方法


)J9HJA9(~~$0`12A7_XZE7U.png

第四个方法GC算法(标记-整理算法)
流程:标记-整理算法标记过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,再清理掉端边界以外的内存区域。
缺点:标记整理算法解决了内存碎片的问题,也规避了复制算法只能利用一半内存区域的弊端。标记整理算法对内存变动更频繁,需要整理所有存活对象的引用地址,在效率上比复制算法要差很多。

第五个方法GC算法(分代收集算法,一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。)
流程:分代收集算法分代收集算法严格来说并不是一种思想或理论,而是融合上述3种基础的算法思想,而产生的针对不同情况所采用不同算法的一套组合方法,根据对象存活周期的不同将内存划分为几块。
新生代:每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
老年代:因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理算法或者标记-整理算法来进行回收。

image

把堆区划分成年轻代(young),和老年代(old)
年轻代中又分为 Eden区 和两个Survivor区
重点:
年轻代:
NEW对象的时候 产生在 Eden区 当Eden区快满的时候就会触发young GC(只属于年轻代的GC)
采用上面方法中的复制方法,把好的对象 放入 Survivor区
(两块Survivor区交替使用 E区+S1区 复制 到 S2区 ***** E区+S2区 复制到 S1区 如此反复)
老年代(old区):
young GC 过程中 每存活一次 年龄age就会加1. 如果age>=6.就往老年区中复制
(大对象 例如 →1千万大小的int数组 也会存入old区)
如果老年区也存满了会触发 Full GC 会引起 Stop The World (STW停止全世界)
Stop The World:整个JAVA程序暂停来进行垃圾清理

JVM内存分配过程
  1、JVM 会试图为相关Java对象在Eden中初始化一块内存区域。
  2、当Eden空间足够时,内存申请结束;否则到下一步。
  3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
  4、Survivor区被用来作为Eden及Old的中间交换区域,当Old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区。
  5、当Old区空间不够时,JVM 会在Old区进行完全的垃圾收集(0级)。
  6、完全垃圾收集后,若Survivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误。

image

(https://www.jianshu.com/p/23f8249886c6) 感谢借鉴链接(https://blog.csdn.net/mirocyber/article/details/105106311) 感谢借鉴链接
(https://www.jianshu.com/p/2f4a8e04c657) 感谢借鉴链接
(https://www.cnblogs.com/windlaughing/archive/2013/05/27/3101650.html)感谢借鉴链接

你可能感兴趣的:(jvm虚拟机(二)自动垃圾回收机制(GC))