GC之垃圾定位与引用类型

拼搏现实的明天。 2023-05-28 06:41 29阅读 0赞

GC - garbage collection - 垃圾收集

在C语言中 使用malloc申请空间,free释放空间,在C++中 使用new申请空空间,delete释放空间。

而在java中,JVM虚拟机采用自动回收的方式处理内存空间。

需要注意的是:

手动回收的好处在于便于内存空间的使用和处理,但是缺点在于容易忘记回收或多次回收

自动回收的好处在于不用去考虑内存回收的问题,但是缺点在于自动回收其实是交给了jvm去回收,根据不同的垃圾回收器,我们需要注意的点会更多。

如何定位JVM中的垃圾内存?

(1).引用计数算法

对象引用算法指的是给对象添加一个引用计数器,当别处使用到该对象时,计数器加1,当引用失效时,计数器减1,当计数器为0时,则对象就不可能再被使用,这时会通知GC收集器回收这些对象。但是该方式存在一个弊端,如果两个对象互相引用,同时两个对象没有被使用,将会造成内存浪费。所以JVM并没有使用该方式

(2).可达性分析算法

目前JVM是通过可达性分析算法来判断对象是否存活的。这个算法的基本思路是通过GC Roots的对象作为起始点,然后从这些节点向下搜索,形成一个探索链,没有在这条链上的对象,就是不可用对象。

这里需要了解一个概念,什么叫GC Root,GC Root是java创始者规定的几个区域的引用对象:

Gc Roots的对象 - 虚拟机栈中的引用对象,方法区中的静态属性引用的对象,方法区中的常量,本地方法栈引用的对象

对象引用

垃圾清理本质是对内存空间的管理,其实就是对引用对象的清理,在jdk1.2的时候,为了更加的可以细分需要清理的对象,将引用分为了四类

(1).强引用

强引用指的是直接new的对象,比如 Object obj = new Object();

这种引用可以直接访问对象,而且这种引用GC是不会回收的,所以操作不当就极易出现OOM异常。

(2).软引用

软引用来描述一些有用但非必须的对象,这种对象在JVM内存不足的时候会被JVM回收。所以可以利用此对象的特性解决OOM的问题。

该对象目前被用于作为缓存来使用

详情可了解 java.lang.ref.SoftReference

(3).弱引用

弱引用用来描述非必需对象,垃圾回收时无论内存是否充足,该引用都被回收。

java.lang.ref.WeakReference

(4).虚引用

虚引用与前面是三种不同,这个引用如同虚设,跟没有一样,虚引用必须和引用队列一起使用,不然的话就是null

java.lang.ref.PhantomReference

发表评论

表情:
评论列表 (有 0 条评论,29人围观)

还没有评论,来说两句吧...

相关阅读