Java有几种引用类型
Java 中的内存管理包括内存分配和内存回收,这些都是由 JVM 帮我们完成的。当创建对象时为其分配内存空间;当失去引用时,GC会自动清除并回收他们所占用的空间。
当一个对象在堆内存中运行时,根据它对应的有向图的状态,有如下三种状态:
- 可达状态 当一个对象被创建后,有一个以上的引用变量引用他,在有向图中可以从起点导航到该点,此时可以通过引用变量调用它的属性和方法。
- 可恢复状态 程序中不再有任何对象引用变量引用它,此时不能从有向图的起点到达它。系统准备回收,再回收之前系统会调用该对象的finalize()方法进行资源清理,如果在finalize 中重新让一个及以上的引用变量引用该对象,则它会再次变为可达状态,否则,进入不可达状态。
- 不可达状态 所有的关联都被切断,永久性的失去引用,只有在该状态下系统才会真正的回收对象所占用的资源。
三张状态转换图如下:
强引用
在Java 中,创建一个对象,并把它赋值给一个引用变量,就是强引用。被强引用所引用的对象时绝对不会被垃圾回收机制回收的,即使系统非常紧张,因此它是造成内存泄露的主要原因之一。
软引用
软引用需要用SoftReference类来实现,当一个对象只有软引用时,它有可能被回收。对于软引用,当系统内存空间足够时,不会被回收,否则会被系统回收,该对象不可再被使用。
Xmx:设置java虚拟机堆内存最大容量;
Xms:设置java虚拟机初始容量。
弱引用
弱引用于软引用类似,但他的生存期更短,通过WeakReference类实现。对于只有弱引用的对象,当垃圾机制运行时,不管内存是否足够,总会回收该对象占用的内存。
虚引用
虚引用主要是跟踪对象被垃圾回收的状态,可以通过检查与虚引用关联的队列中是否包含指定的引用,了解对象是否被回收。
与软引用和弱引用不同,虚引用不能单独使用。
虚引用对象在被释放前会将它添加到他关联的引用队列中。通过PhantomReference类实现,结合引用队列ReferenceQuence使用。