Garbage Collection(垃圾回收)
一、回收原则
首先明确一点,java的GC回收是完全自动的,没有提供相关api手动回收,所有的内存分配和回收权限都在jvm,在开发人员手里没有绝对的强制垃圾回收的方法,不过可以这样去做:
- 对于不再引用的对象,及时把它的引用赋为null。 obj = null;
- 如果内存确实很紧张,调用System.gc() 方法来**建议垃圾回收器开始回收垃圾,通知GC运行,**但是Java语言规范并不保证GC一定会执行。
- 垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
1.1 垃圾收集器收集的标准(内存空间)
- 给对象赋予了空值null,以下再没有调用过
- 给对象赋予了新值
- 给对象重新分配了内存地址
1.2 关于四种引用类型
JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。
**1、强引用:**一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象。只要强引用存在就永远不会被回收,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError。只有它的引用赋为null。 obj = null;才可能会被回收
**2、软引用:**用SoftReference类实现,**一般不会轻易回收,只有内存不够才会回收。**这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
**3、弱引用:**用WeekReference类实现,一旦垃圾回收已启动,就会回收。
4、虚引用:**不能单独存在,**那么它就和没有任何引用一样,用 PhantomReference 类来表示,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态。在任何时候都可能被垃圾回收器回收。
二、优先级
垃圾回收在jvm中优先级相当相当 低。