JAVA 的垃圾回收机制
如果一些分配出去的内存空间不需要时没有及时回收,就会引起内存泄漏(Memory Leaks),也就是会引起系统运行速度的下降,严重的话甚至会导致整个程序瘫痪。所以回收这些内存空间,以节省宝贵的内存资源就显得尤为重要。
JAVA 提供了一个系统级的线程(JAVA 垃圾收集器线程)来对分配出去的内存进行跟踪,垃圾收集器线程是一种低优先级的线程,当 JAVA 虚拟机处于空闲循环时, 会自动检查分配出去的每一块内存空间,然后自动回收。相比C、C++等其他语言,需要程序员手工回收内存就简单多了。而且程序员并不总是知道内存什么时候该回收释放。JAVA 程序的内存分配和回收都是由 JRE 在后台自动执行的,程序员不能强制垃圾收集器回收一块内存,可以通过调用System.gc()方法来建议执行垃圾收集器,但是什么时候执行、能不能执行都是未知的。
每一个对象都有一个 finalize() 方法,用来回收内存以外的系统资源,每个对象只能调用 finalize() 方法一次。如果 finalize() 方法执行时产生异常,该对象仍可以被垃圾收集器收集。
JAVA 虚拟机具有两个显著的特点: 一是垃圾回收机制很好地提高编程效率,在使用 JAVA 语言编程时,依靠垃圾回收机制可大大缩短时间。二是垃圾回收机制保护程序的完整性,垃圾回收是 JAVA 安全策略的一个重要的部分。
在 JAVA 语言中,判断一块内存是否符合垃圾收集器收集的标准要符合两个要求:
一:给对象赋予了 null ,以后再也没有调用过。
二:给对象赋予了新值,即重新分配了对象。
垃圾收集的常用算法:
1、引用计数法(Reference Counting Collector)
2、tracing算法(Tracing Collector)
3、compacting算法(Compacting Collector)
4、copying算法(Coping Collector)
5、generation算法(Generational Collector)
6、adaptive算法(Adaptive Collector)