近期在学习Java垃圾回收机制,有些总结与心得记录下来:
当对象彻底失去引用时,垃圾回收机制会回收其占用的内存
只有当程序认为需要更多的额外内存时,垃圾回收机制才会进行垃圾回收
特点:
1. 只回收堆内存中的对象,不回收任何物理资源(数据库链接,网络IO等)
2. 程序无法精确控制垃圾回收的运行
3. 在垃圾回收机制回收之前,会调用它的finalize()方法,可能使该对象重新得到引用而不被回收
状态的转化:
强制垃圾回收:
前面有提到“程序是无法精确控制Java回收的时机”,强制垃圾回收只是提醒系统进行垃圾回收,具体时间无法确定。
下面提供两种方法:
System.gc()
Runtime.getRuntime().gc()
对象的各种引用方式
1. 强引用 StrongReference
l 时最常使用的一种引用方式:如对象,数组的创建;
l 当一个对象被一个及以上的引用变量引用时,不会被垃圾回收;
2. 软引用 SoftReference
l 通常用于对内存敏感的程序中
l 内存充足时不会被回收;内存不足时可能被回收
3. 弱引用 WeakReference
l 与软引用类似,但比其级别更低
l 不管内存是否足够,都回收该对象占用的内存;但回收时机取决于
回收机制运行时才被回收
4. 虚引用 PhantomReference
l 虚引用不能单独使用,必须和引用队列联合使用
l 虚引用主要用于跟踪对象被垃圾回收的状态