JAVA拾遗-JAVA的垃圾回收工作,
分享于 点击 13395 次 点评:262
JAVA拾遗-JAVA的垃圾回收工作,
1. 回收的目的原因: 在创建了足够的对象后,内存资源将耗尽,必须通过垃圾回收,将部分对象当作垃圾一样,扔到垃圾堆里,清除额外的空间供新的类继续住进内存这间大房子。 2. 垃圾回收的方法方法 | 描述 | 优缺点 |
引用计数法 | 当有引用连接到对象时,引用计数加1,当引用离开作用域或被置为null时,引用计数减1. 垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。 |
简单但速度很慢。 如果对象之间循环引用时,可能会出现“对象应该被回收,但引用计数却不为0”。 从未被用于任何一种Java虚拟机实现中。 |
停止-复制 | 先暂停程序的运行,然后将所有存活的对象从当前堆复制到新堆,没有被复制的全部是垃圾。 当把对象从一处搬到另一处时,它所指向的引用都必须修正。 |
效率低下: 2个堆。 程序进入稳定期后,可能只有少量垃圾,但仍然复制很浪费。 |
标记-清除 | 同停止-复制,在发现没有新垃圾产生时,换到此模式下。 从堆栈和静态存储区触发,遍历所有的引用,进而找到所有存活的对象。每当找到一个存活的对象,就会给对象一个标记,这个过程不会回收任何对象,只有全部标记工作完成的时候,清理动作才会开始。在清理的过程中,没有标记的对象将被释放。不会发生复制动作。 |
慢。但当你知道只产生少量垃圾或不会产生垃圾时,速度就会很快。 也需要暂停。 |
综合方法 | java虚拟机,内存分配以块为单位,如果对象较大,就会占用单独的块。有了块之后,垃圾回收器在回收的时候,就可以往废弃的块里拷贝对象了。 每个块都有相应的代数来记录它是否还存活。通常,如果块在某处被引用,其代数会增加。垃圾回收器将对上次回收动作之后新分配的块进行整理。 大型对象不会复制,只是代数加1.内含小型对象的那些块则被复制并整理。 JAVA虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器效率很低的话,就切换到“标记-清除”方式,同样JVM会跟踪“标记-清除”结果,要是空间出现很多的碎片,就会切换到“停止复制”方式。 “自适应技术” |
以上只是根据think in java 4th中整理出来,回头要看看《深入java虚拟机》来进一步详细了解这些回收算法是如何操作的。 比如如何解决循环引用的情况,如何解决大对象,如何自适应等。
相关文章
- 暂无相关文章
用户点评