在C++中,对象所占的内存在程序结束运行之前会一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾,JVM的一个系统级线程会对该内存块进行自动释放。
垃圾回收优势:
1.垃圾回收能自动释放内存空间,减轻编程的负担,使java程序员在编写程序时不需要再考虑内存管理的问题。
2.垃圾回收机制使java中的对象不再有“作用域”的概念,只有引用的对象才有“作用域”。
3.垃圾回收机制防止了内存泄露,可以使空闲内存得到有效使用。同时,由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片(分配给对象的内存块之间的空闲内存洞),垃圾回收可以清除这些内存记录碎片,也就是将所占用的堆内存移到堆的一端,这样JVM就可以将整理出的内存分配给新的对象。
垃圾回收劣势:
1.垃圾回收机制开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象,该过程需要花费处理器的时间。
2.垃圾回收算法的不完备性。早先采用的某些垃圾回收算法就不能保证100%收集到所有的废弃内存。当然随着垃圾回收算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。
垃圾判定常用算法:
1.引用计数法(Reference Counting Collector)
实现原理:给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。任何时刻计数值为0的对象就是不可能再被使用的。这种方式的特点