Java垃圾回收新算法
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原来引用的数组无人引用,成为垃圾。3 传统收集器简介
Java依托于垃圾收集GC机制,可以自动回收垃圾即释放堆空间,让其他对象可以使用此部分空间。而采用了某种 GC 算法的收集器(Collector)称之为某某垃圾收集器(Garbage Collector)。目前 Java中采用的垃圾收集器一般包括:引用计数法(Reference Counting Collector)、 Tracing算法(Tracing Collector)、Compacting算法(Compacting Collector)、Coping算法(Coping Collector)、Generation算法(Generational Collector)、Adaptive算法(Adaptive Collector)。
3.1 引用计数法
引用计数法是唯一没有使用根集的垃圾回收的方法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1,当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。
基于引用计数器的垃圾收集器运行较快,不会长时间中断程序执行,必须适宜地实时运行的程序。但引用计数器增加了程序执行的开销,因为每次对象赋给新的变量,计数器加1,而每次现有对象出了作用域,计数器减1。
3.2 Tracing算法
Tracing算法是为了解决引用计数法的问题而提出,它使用了根集的概念。基于Tracing算法的垃圾收集器从根集开始扫描,识别出哪些对象可达,哪些对象不可达,并用某种方式标记可达对象,例如对每个可达对象设置一个或多个位。在扫描识别过程中,基于Tracing算法的垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器。
3.3 Compacting算法
为了解决堆碎片问题,基于tracing的垃圾回收吸收了Compacting算法的思想,在清除的过程中,算法将所有对象移到堆的一端,堆的另一端就变成了一个相邻的空闲内存区,收集器会对它移动的所有对象的所有引用进行更新,使得这些引用在新的位置能识别原来 的对象。在基于Compacting算法的收
- 用FPGA实现FFT算法(06-21)
- FIR数字滤波器分布式算法的原理及FPGA实现(08-07)
- 基于算法的DSP硬件结构分析(04-02)
- 基于DSP的音频会议信号合成算法研究(05-10)
- 基于DSP的Max-Log-MAP算法实现与优化(05-27)
- 一种长序列小波变换快速算法的DSP实现(08-11)