频道栏目
首页 > 资讯 > 其他 > 正文

jvm垃圾回收_垃圾回收策略及流程

17-09-25        来源:[db:作者]  
收藏   我要投稿

垃圾回收策略:分代回收。
不同的对象的生命周期是不一样,因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代
(Permanent Generation)。
年轻代:所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
年老代:在年轻代中经历了默认15次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代:用于存放静态文件,类,方法等。持久代对垃圾回收没有显著影响,一般不作为垃圾回收的讨论范围。
GC有两种类型:Minor GC 和Full GC。
Minor GC:发生在年轻代。年轻代分三个区,一个Eden区,两个Survivor区。大部分对象在Eden区中生成,区满触发Minor GC,将不需要回收的对象复制到其中之一的Survivor区(S1),再次发生GC,则将S1区不需要回收的对象复制到S2区,相互复制默认达到15次,则会被复制到老年代中。
Full GC:对整个堆进行整理,包括整个Heap区域( Eden + S1 + S2 + Tenured)。Full GC因为需要对整个对进行回收,会发生stop the world,所以比Minor GC要慢10倍以上,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。Full GC采用mark-sweep-compact(MSC)垃圾收集算法,标记 ,清理,压缩。
JVM如何判断一个Java对象是否可以回收?
Java对象是否存活的判断算法,可达性算法。就是把内存中的每一个对象都看作一个节点,并且定义了一些对象作为根节点“GC Roots”。如果一个对象中有另一个对象的引用,那么就认为第一个对象有一条指向第二个对象的边。JVM会起一个线程从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。
四种作为GC Roots的对象:首先第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象;第二种是我们在类中定义了全局的静态的对象,也就是使用了static关键字;第三种便是常量引用,就是使用了static final关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也应该作为GC Roots;最后一种是在使用JNI技术时,有时候单纯的Java代码并不能满足我们的需求,我们可能需要在Java中调用C或C++的代码,因此会使用native方法,JVM内存中专门有一块本地方法栈,用来保存这些对象的引用,所以本地方法栈中引用的对象也会被作为GC Roots。
finalize方法,这是一个在Object类中定义的方法,如果我们重写了finalize方法,那么在对象被回收之前将会调用finalize方法,如果我们在finalize方法中将对象和某个还在生命周期的对象关联上,那么这个对象还有可能在回收之前被复活,当然这种机会只有一次,当第二次遇到回收时,将不会再调用finalize方法。
内存泄露
指该内存空间使用完毕后未回收,常表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有是也将其称为“对象游离”。

相关TAG标签
上一篇:JS事件处理函数
下一篇:Python环境搭建教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站