Java垃圾回收机制
综合了若⼲⼈的blog~
1. 垃圾回收的意义
在C++中,对象所占的内存在程序结束运⾏之前⼀直被占⽤,在明确释
放之前不能分配给其它对象;⽽在Java中,当没有对象引⽤指向原先分配给
某个对象的内存时,该内存便成为垃圾。JVM的⼀个系统级线程会⾃动释放
该内存块。垃圾回收意味着程序不再需要的对象是"⽆⽤信息",这些信息将
被丢弃。当⼀个对象不再被引⽤的时候,内存回收它占领的空间,以便空间
被后来的新对象使⽤。事实上,除了释放没⽤的对象,垃圾回收也可以清除
内存记录碎⽚。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,
内存会出现碎⽚。碎⽚是分配给对象的内存块之间的空闲内存洞。碎⽚整理
将所占⽤的堆内存移到堆的⼀端,JVM将整理出的内存分配给新的对象。
垃圾回收能⾃动释放内存空间,减轻编程的负担。这使Java 虚拟机具有
⼀些优点。⾸先,它能使编程效率提⾼。在没有垃圾回收机制的时候,可能
要花许多时间来解决⼀个难懂的存储器问题。在⽤Java语⾔编程的时候,靠
垃圾回收机制可⼤⼤缩短时间。其次是它保护程序的完整性, 垃圾回收是
Java语⾔安全性策略的⼀个重要部份。
垃圾回收的⼀个潜在的缺点是它的开销影响程序性能。Java虚拟机必须
追踪运⾏程序中有⽤的对象,⽽且最终释放没⽤的对象。这⼀个过程需要花
费处理器的时间。其次垃圾回收算法的不完备性,早先采⽤的某些垃圾回收
算法就不能保证100%收集到所有的废弃内存。当然随着垃圾回收算法的不
断改进以及软硬件运⾏效率的不断提升,这些问题都可以迎刃⽽解。
2. 垃圾收集的算法分析
Java语⾔规范没有明确地说明JVM使⽤哪种垃圾回收算法,但是任何⼀
种垃圾回收算法⼀般要做2件基本的事情:(1)发现⽆⽤信息对象;(2)
回收被⽆⽤对象占⽤的内存空间,使该空间可被程序再次使⽤。
⼤多数垃圾回收算法使⽤了根集(root set)这个概念;所谓根集就是正在
执⾏的Java程序可以访问的引⽤变量的集合(包括局部变量、参数、类变
量),程序可以使⽤引⽤变量访问对象的属性和调⽤对象的⽅法。垃圾回收
⾸先需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象
都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对
象。⽽根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。
评论0