Java从诞生以来以其在网络应用开发上独特的魅力以及“一次开发,随处运行”的可移植性引起了人们极大的兴趣。Java与以往的高级语言如C/C++相比,在开发方面具有很大的优势,其中以对象内存管理机制中的垃圾处理机制(GC)最为突出。
1 C/C++与Java对象内存管理差别
C/C++将内存划分成四部分:数据区、代码区、栈区、堆区。Java则把内存划分成三部分即代码区、栈区、堆区,代码区主要用于存放程序的代码,栈区主要用于存放局部变量、内部变量等中间性变量,堆区主要用来存放对象。
C/C++中的对象内存管理是通过语句new()/delete()或malloc()/free()进行申请和释放的。用new()或malloc()申请内存后,若不使用delete()或free()进行释放,则所申请的内存一直被占用,即使不使用也不能自动释放,必须人为释放,导致编程工作很繁琐。
Java中的对象内存管理则改进了对内存的释放过程,使用new()或其他方法申请的内存在不使用时,可以自动进行垃圾处理,释放内存,从而节省内存,使内存的使用更加高效、合理。
Java中可以通过三种方法来销毁对象实现内存释放,这三种方法被称为Java销毁对象的三把利剑:垃圾回收器;finalize方法;利用System.gc方法强制启动垃圾回收器。
垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法实现资源自动回收的功能系统,会自动进行GC策略。
2 GC概述
Java垃圾处理主要是针对堆的管理,对堆中不使用的空间进行回收处理。判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中任何一个“活动的部分”所引用,此时该对象的内存空间已经无用。所谓“活动的部分”,是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕。
具体以下两例予以说明:
实例1:
int [][]matrix=new int [2][3];
matrix=null;
此例中,第一句是用new语句在堆中为数组申请了一个空间,然后用matrix来引用此空间的对象(这里数组可以理解为对象),此时这个内存空间就是有用的。第二句是给matrix赋空值,matrix则不再引用此数组。此时,这个空间就是无用的。
实例2:
int [][] m1=new int[2][3];
int [][] m2=new int[2][3];
m1=m2;
此例中,第一句是用new语句在堆中为数组申请了一个空间,用m1引用这个数组。第二句是用new语句在堆中为数组申请了一个空间,用m2引用这个数组。第三句是改变引用对象,把m2的引用赋给m1,则此时m1也引用m2引用的对象数组,因此,m1原来引用的数组无人引用,成为垃圾。