欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JAVA拾遗-JAVA的垃圾回收工作,

来源: javaer 分享于  点击 13395 次 点评:262

JAVA拾遗-JAVA的垃圾回收工作,


1. 回收的目的原因: 在创建了足够的对象后,内存资源将耗尽,必须通过垃圾回收,将部分对象当作垃圾一样,扔到垃圾堆里,清除额外的空间供新的类继续住进内存这间大房子。 2. 垃圾回收的方法
方法 描述 优缺点
引用计数法 当有引用连接到对象时,引用计数加1,当引用离开作用域或被置为null时,引用计数减1.
垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。
简单但速度很慢。
如果对象之间循环引用时,可能会出现“对象应该被回收,但引用计数却不为0”。
从未被用于任何一种Java虚拟机实现中。
停止-复制 先暂停程序的运行,然后将所有存活的对象从当前堆复制到新堆,没有被复制的全部是垃圾。
当把对象从一处搬到另一处时,它所指向的引用都必须修正。
效率低下:
2个堆。
程序进入稳定期后,可能只有少量垃圾,但仍然复制很浪费。

标记-清除 同停止-复制,在发现没有新垃圾产生时,换到此模式下。
从堆栈和静态存储区触发,遍历所有的引用,进而找到所有存活的对象。每当找到一个存活的对象,就会给对象一个标记,这个过程不会回收任何对象,只有全部标记工作完成的时候,清理动作才会开始。在清理的过程中,没有标记的对象将被释放。不会发生复制动作。
慢。但当你知道只产生少量垃圾或不会产生垃圾时,速度就会很快。
也需要暂停。
综合方法 java虚拟机,内存分配以块为单位,如果对象较大,就会占用单独的块。有了块之后,垃圾回收器在回收的时候,就可以往废弃的块里拷贝对象了。
每个块都有相应的代数来记录它是否还存活。通常,如果块在某处被引用,其代数会增加。垃圾回收器将对上次回收动作之后新分配的块进行整理。
大型对象不会复制,只是代数加1.内含小型对象的那些块则被复制并整理。
JAVA虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器效率很低的话,就切换到“标记-清除”方式,同样JVM会跟踪“标记-清除”结果,要是空间出现很多的碎片,就会切换到“停止复制”方式。
“自适应技术”


以上只是根据think in java 4th中整理出来,回头要看看《深入java虚拟机》来进一步详细了解这些回收算法是如何操作的。 比如如何解决循环引用的情况,如何解决大对象,如何自适应等。

相关文章

    暂无相关文章
相关栏目:

用户点评