前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM之GC与对象的引用(三)

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

作者头像
23号杂货铺
发布2019-09-27 16:34:50
5310
发布2019-09-27 16:34:50
举报
文章被收录于专栏:23号杂货铺23号杂货铺

GC,从当下的企业级应用开发来看,是大多数攻城狮必须具备和get的技能。但又有很多人不愿意去面对它(比如我

),因为它纵使虐你千百遍,你都必须仍旧待之如初恋......

那,什么是GC呢?

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

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

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

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

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

......

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

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

(以下我都简称为GC)

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

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

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

1、可触及状态。

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

2、可复活状态。

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

finalize方法的特点:

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

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

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

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

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

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

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

那什么是对象的引用?

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

1、强引用

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

2、软引用

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

3、弱引用

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

4、虚引用

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 23号杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档