JAVA垃圾回收器学习笔记

 

JAVA垃圾回收器学习——稻草人

(文章学习内容来自课本书籍和互联网,并在不断完善中)

 

JAVA的一个重要特点就是具有一个垃圾回收器,能够实现垃圾的自动回收,而不需要程序员去考虑。Java解释器在为一个实例对象分配完存储空间后,便开始记录该实例对象所占用的内存空间的使用,直至使用完毕便将其回收。 在Java的运行过程中,一个垃圾回收器会不定时的被唤醒来检查是否有不再被使用的对象,并释放它们占用的内存空间。垃圾回收器的启用不由程序员控制,无规律可循。

不同Java虚拟机有不同的垃圾回收机制,一般有两种比较常用:复制式回收机制和“自省式”回收机制。

1.1.复制式回收机制:

这种策略的执行模式是现将正在运行的程序暂停,然后把正在被使用的所有对象复制一份到另一块堆内存中,那些 不再被使用的对象所占的内存空间被释放。此方式需要的内存空间是所需维护的两倍,而且当程序只产生了少量甚 至没有垃圾时,就会导致效率低下。

1.2.“自省式”回收机制:

检测所有正在使用的对象,并为他们标注,完成这项工作后再将所有不再被使用的对象所占据的内存空间一次释放 掉。尽管此种方式速度很慢,但在只有少量的垃圾或者没有垃圾时,就极具优势。

 

这两种方式颇具互补性,所以在一些JVM中结合的运用。如果程序中的对象长期的使用,JVM就换至“自省式”,而当产生大量垃圾或所占的内存不连续情况严重时,又会换至“复制式”。

 

垃圾收集的目的在于清除不再使用的对象。gc(即是垃圾回收机制)通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。

2.1.引用计数

引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm必须适当增减引用数。当某对象的引用数为0时,便可以进行垃圾收集。

2.2.对象引用遍历

早期的jvm使用引用计数,现在大多数jvm采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。 为此,gc需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以增加效率。

 

*另外网上还看到几种垃圾回收机制,如下:

(1)增量收集器

增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。

(2)分代收集器

这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。

(3)并发收集器

并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。

(4)并行收集器

并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章