Java堆是个运行时数据区类例子(对象)从中分配空间Java虚拟机(JVM)堆中储存着正在运行应用所建立所有对象这些对象通过、.gif' />、a.gif' />和multia.gif' />等指令建立但是它们不需要代码来显式地释放般来说堆是由垃圾回收 来负责尽管JVM规范标准并不要求特殊垃圾回收技术甚至根本就不需要垃圾回收但是由于内存有限性JVM在实现时候都有个由垃圾回收所管理堆垃圾回收是种动态存储管理技术它自动地释放不再被引用对象按照特定垃圾收集算法来实现资源自动回收功能
垃圾收集意义
在C中对象所占内存在结束运行的前直被占用在明确释放的前不能分配给其它对象;而在Java中当没有对象引用指向原先分配给某个对象内存时该内存便成为垃圾JVM个系统级线程会自动释放该内存块垃圾收集意味着不再需要对象是"无用信息"这些信息将被丢弃当个对象不再被引用时候内存回收它占领空间以便空间被后来新对象使用事实上除了释放没用对象垃圾收集也可以清除内存记录碎片由于创建对象和垃圾收集器释放丢弃对象所占内存空间内存会出现碎片碎片是分配给对象内存块的间空闲内存洞碎片整理将所占用堆内存移到堆端JVM将整理出内存分配给新对象
垃圾收集能自动释放内存空间减轻编程负担这使Java 虚拟机具有些优点首先它能使编程效率提高在没有垃圾收集机制时候可能要花许多时间来解决个难懂存储器问题在用Java语言编程时候靠垃圾收集机制可大大缩短时间其次是它保护完整性 垃圾收集是Java语言安全性策略个重要部份
垃圾收集个潜在缺点是它开销影响性能Java虚拟机必须追踪运行中有用对象 而且最终释放没用对象这个过程需要花费处理器时间其次垃圾收集算法不完备性早先采用某些垃圾收集算法就不能保证100%收集到所有废弃内存当然随着垃圾收集算法不断改进以及软、硬件运行效率不断提升这些问题都可以迎刃而解
垃圾收集算法分析
Java语言规范标准没有明确地介绍说明JVM使用哪种垃圾回收算法但是任何种垃圾收集算法般要做2件基本事情:(1)发现无用信息对象;(2)回收被无用对象占用内存空间使该空间可被再次使用
大多数垃圾回收算法使用了根集(root )这个概念;所谓根集就量正在执行Java可以访问引用变量集合(包括局部变量、参数、类变量)可以使用引用变量访问对象属性和对象思路方法垃圾收集首选需要确定从根开始哪些是可达和哪些是不可达从根集可达对象都是活动对象它们不能作为垃圾被回收这也包括从根集间接可达对象而根集通过任意路径不可达对象符合垃圾收集条件应该被回收下面介绍几个常用算法
1、 引用计数法(Reference Counting Collector)
引用计数法是唯没有使用根集垃圾回收法该算法使用引用计数器来区分存活对象和不再使用对象般来说堆中每个对象对应个引用计数器当每次创建个对象并赋给个变量时引用计数器置为1当对象被赋给任意变量时引用计数器每次加1当对象出了作用域后(该对象丢弃不再使用)引用计数器减1旦引用计数器为0对象就满足了垃圾收集条件
基于引用计数器垃圾收集器运行较快不会长时间中断执行适宜地必须 实时运行但引用计数器增加了执行开销每次对象赋给新变量计数器加1而每次现有对象出了作用域生计数器减1
2、tracing算法(Tracing Collector)
tracing算法是为了解决引用计数法问题而提出它使用了根集概念基于tracing算法垃圾收集器从根集开始扫描识别出哪些对象可达哪些对象不可达并用某种方式标记可达对象例如对每个可达对象设置个或多个位在扫描识别过程中基于tracing算法垃圾收集也称为标记和清除(mark-and-sweep)垃圾收集器.
3、compacting算法(Compacting Collector)