java的垃圾回收

转载 2016年08月30日 20:51:53
永久代的垃圾收集主要收集两部分内容:废弃常量和无用的类(收集方式和对象的收集方法类似)。判断一个类是否无用的标准:
1)该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2)加载该类的ClassLoader已经被回收。

3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

标记-清除算法:
分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。不足之处:一个是效率问题,标记和清除两个过程的效率都不是太高,另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续内存而不得不触发另一次垃圾收集动作。


复制算法,将内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉,这样使得每次都要对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可


标记-整理的标记过程和标记清理的标记过程一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一段移动,然后直接清理掉标记以外的内存


即使在可达性分析算法中不可达的对象,也并非是非死不可的,这时候它们暂时处于缓刑状态。要真正死亡,至少需要经历两次标记过程:如果对象在可达性分析后发现没有GC Roots相连接的引用链,那么它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize方法,当对象没有覆盖finalize,或者finalize方法已经被虚拟机调用,虚拟机将这两种情况视为没有必要执行。finalize方法是对象逃脱死亡的最后一次机会,稍后虚拟机将会对F-Queue(没有必要执行finalize方法的对象队列)进行第二次标记,这个时候一个对象如果没有被重新引用,那么就要被收集了

相关文章推荐

Java内存分配及垃圾回收文章汇总

  • 2010年11月11日 14:51
  • 379KB
  • 下载

JAVA内存模型与垃圾回收

  • 2010年05月19日 11:37
  • 340KB
  • 下载

Java提高:不要主动进行垃圾回收

一、建议           不要调用system.gc,即使经常出现内存溢出也不要调用,内存溢出是可分析的,是可以查找原因的,GC可不是一个好招数。    二、分析         ...

java垃圾回收日志分析工具GCViewer

  • 2015年09月02日 10:46
  • 2.39MB
  • 下载

Java_GC垃圾回收调优指南

  • 2011年04月25日 16:04
  • 285KB
  • 下载

降低Java垃圾回收开销的5条建议

保持GC低开销的窍门有哪些?随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器。从 serial 垃圾回收器 到CM...

java 垃圾回收 机制详解

  • 2016年05月09日 16:48
  • 203KB
  • 下载

Java垃圾回收原理

  • 2012年05月10日 13:40
  • 3KB
  • 下载

Java清理_终结处理和垃圾回收(笔记)

Java清理_终结处理和垃圾回收(笔记)清理_终结处理和垃圾回收 垃圾回收: Java语言new出来的对象会自己回收,主要要考虑其他语言如c/c++创建出来的对象,要自己手动写相应语言的清理方法进...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java的垃圾回收
举报原因:
原因补充:

(最多只允许输入30个字)