Java中gcRoot和引用类型

Posted 时间的朋友

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中gcRoot和引用类型相关的知识,希望对你有一定的参考价值。

看到一个老问题,Java是如何判定回收哪些对象的?

答:从gcRoot根搜索不可达,且标记清理一次之后仍没有被复活的对象,会被认定为垃圾对象进行清理。注意在Java中没有对象的作用域,只有对象的引用的作用域。Java垃圾回收没有采用引用计数算法,因为它不好解决循环引用问题。Java垃圾算法实际上是标记出那些对象是被引用在用的,其它没被标记的就是没用的可以回收,而不是直接找出哪些对象是没用的。

那么,哪些对象可以作为gcRoot呢?

它其实是一组根引用,主要包括虚拟机栈中的局部变量表(实际就是所有正在被调用的方法等参数局部变量等),类的静态属性引用,常量对象引用,本地方法栈中对象引用。实际上Java垃圾回收主要是针对堆内存的,这些引用则来自于JVM运行时数据区的其它几部分:虚拟机栈,本地方法区,方法区。

Java中引用类型包含哪几类,有什么用?

最常用到的是强引用,只有这种引用存在,垃圾回收时就不会清理它指向的对象。其次是软引用,只有在垃圾回收内存空间不足时才会回收这类引用指向的对象,多用在缓存对象中。再其次是弱引用,只要发生垃圾回收就会被回收。最后是虚引用,是引用关系最弱的一种。

以上是关于Java中gcRoot和引用类型的主要内容,如果未能解决你的问题,请参考以下文章

JVM中GC Roots及引用类型概述

JVM垃圾收集器与内存分配策略

Java虚拟机知识点引用

JVM之GCRoots详解

java中引用数据类型和基本数据类型的区别

java 判断一个对象是值类型还是引用类型