Java内存管理之GC垃圾回收机制是什么?什么是垃圾?如何判断是否为垃圾?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_34122324/article/details/84680645


1. 垃圾回收机制是什么?

垃圾回收机制让开发者无需关注空间的创建和释放,而是以守护进程的形式在后台自动回收垃圾。

这样做不仅提高了开发效率,更改善了内存的使用状况。


2. 什么是垃圾呢?如何判断是否为垃圾呢?

什么是垃圾?垃圾指所有不再存活的对象

常见的判断是否存活有两种方法:引用计数法可达性分析

  • 引用计数法
    为每一个创建的对象分配一个引用计数器,用来存储该对象被引用的个数。当该个数为零,意味着没有人再使用这个对象,可以认为“对象死亡”。但是,这种方案存在严重的问题,就是无法检测“循环引用”:当两个对象互相引用,即时它俩都不被外界任何东西引用,它俩的计数都不为零,因此永远不会被回收。而实际上对于开发者而言,这两个对象已经完全没有用处了。
    因此,Java 里没有采用这样的方案来判定对象的“存活性”。

  • 可达性分析
    基本思路是把所有引用的对象想象成一棵树,从树的根结点 GC Roots 出发,持续遍历找出所有连接的树枝对象,这些对象则被称为“可达”对象,或称“存活”对象。其余的对象则被视为“死亡”的“不可达”对象,或称“垃圾”。参考下图,object5,object6 和 object7 便是不可达对象,视为“死亡状态”,应该被垃圾回收器回收。

在这里插入图片描述


3. GC root指的是谁?

GC Roots 本身一定是可达的,这样从它们出发遍历到的对象才能保证一定可达。那么,Java 里有哪些对象是一定可达呢?

主要有以下四种:

  • 虚拟机栈(帧栈中的本地变量表)中引用的对象。
  • 方法区中静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中 JNI 引用的对象。

这么几种类型的 GC Roots,每次垃圾回收器会从这些根结点开始遍历寻找所有可达节点。

猜你喜欢

转载自blog.csdn.net/baidu_34122324/article/details/84680645