JVM之GC与对象的引用

Posted 23号杂货铺

tags:

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

GC,从当下的企业级应用开发来看,是大多数攻城狮必须具备和get的技能。但又有很多人不愿意去面对它(比如我),因为它纵使虐你千百遍,你都必须仍旧待之如初恋......

JVM之GC与对象的引用(三)

那,什么是GC呢?


中文称之为“垃圾回收”。当一个对象被创建时,就会在JVM的堆区中拥有一块内存,我在《JVM之类的生命周期》中讲到,Java程序会陆续地去创建无数个对象去被使用。假如,所有的对象都永久占有内存,那服务器、机器的内存就极为可能被耗尽,最后引发内存空间不足。

因此,就必须采取一种措施来及时回收那些无用对象的内存,以保证内存可以被重复利用。在大学学过C语言的童鞋们可能会知道,C语言的回收内存的任务是由程序本身负责的,也就是要交到程序猿的手上去处理,而这却是一个有为繁琐的机制实现,内部关联错综复杂。尽管给程序带来了很多的灵活性,但也导致了一些弊端,比如:

1、可能因为粗心,忘记释放某些内存,影响程序;

2、可能因为错误的释放,释放了一些核心类库所占用的内存;

3、可能因为要管理内存,头发没了

......


所以,这是一件很可怕的事情。而在Java 当中,内存的回收由JVM来管理,不需要由程序猿去控制,想想就觉得松了一口气啊。

JVM之GC与对象的引用(三)

在程序的运行时环境中,JVM提供了一个系统级的垃圾回收器线程,它负责自动回收那些无用对象所占用的内存,这种内存回收的过程,我们称它为“垃圾回收(Garbage Collection)”,简称GC。

(以下我都简称为GC)


谈及GC,我们得先理解一个概念。


对象的可触及性(也叫可达性)


在JVM的垃圾回收器看来,堆区中的每个对象都可能处于3种状态的其中之一。

1、可触及状态。

当一个对象被创建后,只要程序还有引用变量去引用它,那么它就始终处于可触及状态。

2、可复活状态。

当程序不再有任何引用变量引用一个对象时,那么该对象就进入了可复活的状态。在这种状态中,GC就会准备释放它所占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的finalize()方法,finalize方法继承或重写子Object,这些方法可能使得该对象又重新回到可触及的状态。

finalize方法的特点:

(1)、垃圾回收器是否会执行该方法以及何时执行,都是不确定的。

(2)、垃圾回收器在执行finalize()方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。


3、不可触及状态(也叫不可达状态)。

当JVM执行完所有可以复活对象的finalize()方法后,假如这些方法都没有使得该对象重新回到可触及的状态,那么该对象便进入此状态。

JVM之GC与对象的引用(三)


而GC正可以通过判断对象的不可触及状态,将不再被引用的对象进行垃圾回收,从而达到释放内存的作用。


有初学者可能会将finalize和finally代码块的理解相互混淆,在这里不做展开,有兴趣了解的朋友可以上网查阅一下。


当一个对象如何到达不可触及的状态,这就牵扯到另一个概念。就是对象的引用。


那什么是对象的引用?


在Java中,关于对象的引用,可分为4种,分别为强引用、软引用、弱引用、虚引用。软,弱,虚引用可在java.lang.ref包中找到它们。Reference的子类实现,SoftReference、WeakReference、PhantomReference。

JVM之GC与对象的引用(三)


1、强引用


程序中一般的引用类型,此级别的对象是可触及的,不会被回收。强引用指向的对象在任何时候都不会被回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指向的对象。GC不会依靠随意回收具有强引用的对象来解决内存不足的问题。


2、软引用


类似于一个可有可无的状态。如果内存空间足够,GC就不会去回收它,如果内存空间不足,就会去回收。而且只要对象没有被回收,该对象就可以被程序使用。软引用可以被用作实现内存敏感的高速缓存。


3、弱引用


如果一个对象具有弱引用,相比于软引用,弱引用只有更短暂的生命周期。在GC线程扫描它所管辖的内存区域时,一旦发现该对象,无论当前空间是否足够,都会去回收释放该对象的内存。


4、虚引用


虚引用并不会决定对象的生命周期,类似等同于未被引用。会在任意时候都可能被GC回收。主要用来跟踪对象被垃圾回收器回收的活动。和其它引用还有一个区别,在于虚引用必须和引用队列(ReferenceQueue)联合使用。



— END —



JVM之GC与对象的引用(三)

非营利性质

技术资源共享交流平台





以上是关于JVM之GC与对象的引用的主要内容,如果未能解决你的问题,请参考以下文章

理解JVM之GC&内存分配

jvm之GC知识点

JVM内存管理与GC机制

深入JVM系列之GC机制收集器与GC调优

深入JVM系列之GC机制收集器与GC调优(转)

深入探究jvm之GC的算法及种类