java中的垃圾回收机制
JAVA 的一个重要特点就是有垃圾回收器,并且能够自动回收垃圾,这也是java相对与其他语言的有优势的地方,如C语言就没有自动回收垃圾的机制。
java的每一个实例对象和数组都是在对堆里面分配空间的,解释器具有为类实例分配空间的工作能力,在解释器为一个实例分配完存储空间时,就会记录该实例对象所占用的内存区域的使用,一旦对象使用完毕之后,就会被回收到垃圾中!
在java语言中,出来new语句外没有其他方法为一个对象申请和释放内存,对内存的释放和回收的工作是有java运行系统承担的。在SUN公司开发的java解释器和Hot java 环境中,碎片回收后后台线程回收的方式来执行,这样子不但为系统提供良好的性能还使我们程序员摆脱了自己控制内存使用的风险。java的自动垃圾回收功能解决了两个最常见的应用程序错误:内存外露和无效内存的引用。
清理垃圾数据的重要性常常会被程序员忽视,这是很危险的,这些会导致垃圾占据系统资源,一直到内存耗尽。java提供了一种叫做垃圾回收的机制来避免程序员忽略垃圾的处理,java自动帮我们完成垃圾回收的工作,而不需要程序员再去考虑。
在java程序运行的时候,一个垃圾回收机器会不定时的被唤醒来检查是否有不再被用到的对象,并将其回收然后释放资源(空间),但垃圾回收机制的启动不受我们程序员的控制,有可能一个程序到运行完时,垃圾回收器都没有被启动。所以这个不是一个很可靠的机制,但这也不是什么坏事,因为垃圾回收机制会给系统资源带来额外的负担。启动的几率越小,带来的额外负担就越少。
不同的java虚拟机采用不同的回收策略:1.复制式 2.自省式
1.复制式:就是将在运行的程序暂停,将正在被使用的所有对象复制到另一个堆内存,那些不被使用的内存就会被释放掉。
这种复制方式需要维护所需内存数量的两倍的内存空间,即使你的垃圾很少,也会把堆内存的内容复制到另外一块堆内存中,这使得这种策略的效率低下。
2.自省式:
自省式回收器会检测所有正在被使用的对象,然后将其做标记,完成任务后将所有不再被使用的对象所占据的空间一次释放。但这样的方式速度很慢,不过如果程序的垃圾很少的话,这样的策略就很有优势了。
所以可以将两中方法结合起来使用,在一些jvm中两种方式有机的结合起来运用,在实际应用中,jvm会监督这两只模式的运作效率,如果程序中的对象长期被使用,JVM就会转换到“自省模式”回收模式,而当产生大量垃圾或者对象多占用的内存不连续的情况严重的时,又会转换至“复制式”模式,如此循环。实现两种机制交换。