GC之垃圾定位与引用类型
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
还没有评论,来说两句吧...