JAVA的内存回收

Java内存管理包括内存分配和内存管理两方面,这两方面都是JVM自动完成的,带来了很大方便的同时也加重了JVM的工作,从而使Java程序运行变慢。

基本上可以把JVM内存中的对象引用理解成一种有向图,把引用变量、对象都当成有向图的顶点,将引用关系当成图的有向边,有向边总是从引用端指向被引用对象。因为对象都是由线程创建的,所以可以把线程对象当成有向图的起始顶点。

当一个堆对象在内存中运行时可以分为三种状态:

①可达状态:当一个对象被创建后,有一个及以上的变量引用它。在有向图中可从起始顶点导航到该对象,那么它就处于可达状态,程序可以通过引用变量来调用对象的方法和属性。

②可恢复状态:如果某个对象不再有任何引用变量引用它,它将先进入可恢复状态,系统的垃圾回收机制准备回收该对象所占用的内存。在回收之前,系统会调用可恢复对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个及以上的引用变量引用该对象,则这个对象会再次变为可达状态。

③当对象的所有关联都被切断,且系统调用所有对象的finalize方法依然没有使该对象变为可达状态,那么这个对象将永久失去引用,被系统回收。

对象状态转换

为了更好地管理对象的引用,从JDK1.2开始Java在java.lang.ref包下提供了3个类:SoftReference、PhantomReference、WeakReference,分别代表对象的三种引用方式:软引用、虚引用、弱引用。

归纳起来Java有四种引用方式:强引用、软引用、虚引用、弱引用。

①强引用:这是Java程序中最常见的引用方式,程序创建一个对象并把这个对象赋给一个引用变量,这个变量就是强引用。被强引用的对象不会被垃圾回收机制回收,不论内存有多么紧张,即使有些Java对象以后永远不会用到。由于JVM肯定不会回收强引用的Java对象,因此强引用是造成Java内存泄漏的主要原因之一。

②软引用:软引用需要通过SoftReference类来实现,当一个对象只具有软引用时,它可能被垃圾回收机制强制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也使用该对象。当系统内存不足时,系统会回收它。

③弱引用:弱引用与软引用有点类似,区别在于弱引用所引用对象的生存期更短。弱引用通过WeakReference类实现,当系统垃圾回收机制运行时,不论系统内存是否足够,总会回收该对象所占用的内存。不是立即回收,而是等到系统垃圾回收机制运行时才会被回收。与WeakReference功能类似的还有WeakHashMap,当程序有大量的对象需要用弱引用来引用时,可以考虑使用WeakHashMap来保存他们。

④虚引用:虚引用不能单独使用,主要作用是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已包含指定的虚引用,从而了解引用的对象是否即将被回收。引用队列由ReferenceQuene类表示,它用于保存被回收后对象的引用。当软引用、弱引用与引用队列联合使用时,软引用和弱引用在被释放之后,将会把它对应的引用添加到关联的引用队列之中,耳虚引用是在被释放之前,将把它对应的虚引用添加到它关联的引用队列之中,这可使得对象在被释放之前采取行动。

猜你喜欢

转载自www.cnblogs.com/Alpharun/p/8985520.html