Java垃圾回收机制分析1-引用算法

        与C、C++等语言相比,Java语言的一大特色就是垃圾回收机制(Garbage collection)

        什么是垃圾回收机制呢?

        在C、C++等不支持垃圾回收机制的程序语言中,使用malloc或者new所申请的空间存储在堆(Heap)中,使用完时候需要使用free或者delete方法手动释放,否则程序会一直占用这部分空间,造成内存泄漏和内存溢出。

        为了避免程序员忘记回收已申请的堆内存,Java的发明者增加了垃圾回收机制,在对象不再被引用时,JVM自动释放其空间,而无需程序员手动执行free或者delete方法进行释放。

        Java垃圾回收机制如何判断哪些对象需要被回收呢?

        早期的垃圾回收器通常使用引用计数法(Reference Counting)来判断对象是否应该被回收。引用计数法顾名思义,就是在每一个对象创建时添加一个引用计数器,每当对象被引用一次时计数器的值加1,引用失效时计数器的值减1,当计数器的值为0表示改对象需要被回收。但是,引用计数法有一个缺陷,就是循环引用的对象是无法被识别出来回收(例如A、B两个对象相互引用时,引用计数器永远不会为0)。

        下面通过一段实例代码说明:

        GCObject objectA = new GCObject();// objectA对象的引用计数器加1,为1。

        GCObject objectB = new GCObject();// objectA对象的引用计数器加1,为1。

        objectA.instance = objectB; // objectB对象的引用计数器加1,为2。

        objectB.instance = objectA; // objectA对象的引用计数器加1,为2。

        objectA = null; // objectA对象的引用计数器减1,为1。

        objectB = null; // objectB对象的引用计数器减1,为1。

        这时发现objectA对象、objectB对象不再被栈中的objectA、objectB变量引用,采用引用计数器算法他们的计数器的值永远不为0,因此他们的内存无法得到释放。

        因此,Java采用根搜索算法(GC Roots Tracking)。JVM通过一系列根集(GC Roots)对象做为起始向下搜索引用对象以及引用对象的引用对象,搜索到的路径称为引用链,当某个对象不在引用链中时,就表示该对象是需要被回收的。

        哪些对象是根集(GC Roots)呢?

        Java中根集(GC Roots)对象包括一下几种:

  1. 方法区中的类静态变量和常量所引用的对象;
  2. 本地方法栈中JNI所引用的对象;
  3. 虚拟机栈(栈帧中的局部变量表)中引用的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值