java垃圾回收机制

任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用 

 

java GC垃圾回收机制(分代管理机制)

    1.年轻代(Young Generation):所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

       特点:内存分为三个区,eden区(8)和两个survisor区(1),绝大部分对象在eden区生成,回收时先把存活的对象复制到survisor0中,然后清空eden区当survidor0满时, 将eden和survidor0存活的对象都复制到survidor1中,然后清空survidor0和eden,survidor0和survidor1一直交换反复                                 (survidor0和survidor1必须有一个是为空的)。当survidor1不足以存放survidor0和Eden对象时,存活对象直接存放在年老代。

        年轻代发生的GC叫做Minor GC发生的频率比较高,不影响年老代。

    2.年老代(Old Generation):在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

        特点:内存比新生代也大很多(大概比例是1:2),年老代发生的GC叫做Major GC(full GC),频率较低,对象存活的周期都较长,存活率高,回收时年轻    代、老年代都进行回收。

    3.持久代(Permanent Generation):用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些     class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

 

垃圾收集器(GC):

                            新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge

                            老年代收集器使用的收集器:Serial Old、Parallel Old、CMS

 

GC执行机制:两种类型Scavenge GC和Full GC 

                  1.Scavenge GC一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把

尚且存活的对象移动到Survivor区,然后整理Sruvivor。不会影响年老代,GC频率大、速度快、效率高。

                  2.Full GC对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。

有如下原因可能导致Full GC:

                                            1.年老代(Tenured)被写满

                                            2.持久代(Perm)被写满

                                            3.System.gc()被显示调满

                                            4.上一次GC之后Heap的各域分配策略动态变化

 

优化GC目的:

    1. 一个是将转移到老年代的对象数量降到最少

    2. 另一个是减少Full GC的执行时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值