JVM垃圾回收机制(一)--垃圾回收回收什么

1.垃圾回收

垃圾回收的历史要比Java语言久远的多,MIT的LISP是第一门真正使用内存动态分配和垃圾收集技术的语言(LISP名称源自列表处理(LISt Processing)的英语缩写,由来自麻省理工学院的人工智能研究先驱约翰·麦卡锡(John McCarthy)在1958年基于λ演算所创造的计算机程序设计语言).

说到垃圾回收(Garbage Collection,简称GC),就要说下垃圾回收是收集什么,何时回收,虚拟机是怎么通过垃圾收集器进行自动垃圾回收的.

1.1 垃圾回收收集什么

按照标准的说法,垃圾回收是一个监控堆内存区域,识别正在使用中或不使用的对象,并对不使用的对象进行回收的过程.在C语言中,垃圾回收是手动完成的(需要我们在程序中定义),而Java语言是通过垃圾收集器去自动完成的.说白了,垃圾回收就是回收未被引用的对象.既然要回收未被引用的对象,那我们就得说说何为引用的对象(使用中的对象).

何谓使用中的对象?所谓使用中的对象,就是在程序中仍然存在该对象的引用.

说到对象的引用,我们就不得不说说对象引用是何物.

1.1.1 对象的引用

在JDK1.2之前,Java中对于引用类型的定义很狭隘,它指如果引用(reference)类型的数据中存储着另外一块内存的起始地址,那么就表示这块内存代表着一个引用.

在JDK1.2之后,Java对引用的概念进行了扩展,分为强引用,软引用,弱引用,虚引用.

①强引用(Strong Reference):就是我们在代码中很常见的Object obj = new Object()这类的引用,其中obj就指向在堆内存中分配的Object对象.只要强引用存在,垃圾收集器就不会回收该对象.

②软引用(Soft Reference):用来描述一些有用但非必须的对象(像不像曹操说的鸡肋,食之无味弃之可惜).在JDK1.2之后,提供了java.lang.ref.SoftReference类来实现软引用,如

SoftReference<String> softRf = new SoftReference<String>(new String("helloworld"));

使用softRf.get()就可以获取到引用的对象.这里softRf就是一个软引用.软引用引用的对象,在内存空间不足的情况下,会被回收.

③弱引用(Weak Reference):弱引用也来描述非必须对象,它比软引用还弱.在JDK1.2之后,提供了java.lang.ref.WeakReference类来实现弱引用.如

WeakReference<String> weakRf = new WeakReference<String>(new String("helloworld"));     

使用weakRf.get()就可以获取到引用的对象.其中weakRf就是一个弱引用.弱引用引用的对象,在垃圾回收器回收工作的时候,就会被回收.

④虚引用(Phantom Reference):听这名字,就像影子似的,所以它也叫幽灵引用,是最弱的一种引用关系.在JDK1.2之后,提供了java.lang.ref.PhantomReference类表示虚引用.但是用法跟上面不一样哈.

虚引用必须与引用队列(ReferenceQueue)一起使用.

如:ReferenceQueue<String> rfQueue = new ReferenceQueue<String>();

  PhantomReference<String> phantomRf = new PhantomReference<String>(new String("helloworld"), rfQueue);

使用phantomRf.get()可以获取到引用的对象.虚引用并不影响它引用的对象的生命周期,使用虚引用的唯一作用就是在垃圾收集器工作的时候,告诉系统"我要走了,拜拜".

相关推荐