20191109 为什么JVM新生代中有两个survivor?

原因:为了保证任何时候总有一个survivor是空的(幸存区),主要为了解决内存的碎片化问题,防止频繁触发GC,影响程序的性能和响应速度。(内存地址不连续,就会产生很多内存碎片,浪费survivor空间,存活对象,预筛选机制

 

因为将eden区的存活对象复制到survivor区时,必须保证survivor区是空的,如果survivor区中已有上次复制的存活对象时,这次再复制的对象肯定和上次的内存地址是不连续的,会产生内存碎片,浪费survivor空间。

 

如果只有一个survivor区,第一次GC后,survivor区非空,Eden区空,为了保证第二次能复制到一个空的区域,新的对象必须在survivor区中出生,而survivor区是很小的,很容易就会再次引发GC。

而如果有两个survivor区,第一次GC后,把eden区和survivor0区一起复制到survivor1区,然后清空survivor0和eden区,此时survivor1非空,survivor0和eden区为空,下一次GC时把survivor0和survivor1交换,这样就能保证向survivor区复制时始终都有一个survivor区是空的,也就能保证新对象能始终在eden区出生了。

 

1、把存活对象复制到survivor中;

2、发生一次Young GC后,清空一个Eden区域和其中的一个survivor区域,把存活的对象copy到另一个survivor区域;

3、内存地址不连续,内存碎片,浪费内存空间。

4、向survivor区复制时始终都有一个survivor区是空的。 内存碎片过多,会导致频发发生GC.

5、老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多.(Full GC消耗的时间远远高于young GC; GC消耗的时间

6、频发的Full GC消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度;

7、Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。(预筛选机制

8、垃圾回收机制,只发生在堆内存,回收对象,释放内存空间;

 

年青代的Eden区满了会触发younggc;younggc回收的是整个Eden区域的内存;内存拷贝。

老年代old满了会触发oldgc

Full GC清理整个heap区,包括Yong区和old区。

 

为什么要设置两个Survivor区?设置两个Survivor区最大的好处就是解决了内存的碎片化。

Eden区理所当然大一些,否则新建对象很快就导致Eden区满,进而触发Minor GC,有悖于初衷。 

触发Young GC后,会回收掉无用的对象,存活的对象内存拷贝到Survivor。

 

内存碎片化带来的风险是极大的,严重影响JAVA程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间,接下去如果程序需要给一个内存需求很大的对象分配内存。

永远有一个survivor space是空的,另一个非空的survivor space无碎片。

 

合理设置JVM参数,以最大程度避免不合理的full gc

堆内存:Major GC,full GC

1)年轻代(Eden区域,S1区域,S2区域),Young GC

2)年老代:Old GC

young GC:当新生代中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到老年代,所以young GC后老年代的占用量通常会有所升高。

full GC:什么时候会触发full GC?年老代的剩余空间小于Young GC的平均晋升大小时;System.gc()、heap dump带GC,默认也是触发full GC。

并发GC的触发条件就不太一样。以CMS GC为例,它主要是定时去检查年老代的使用量,当使用量超过了触发比例就会启动一次CMS GC,对old gen做并发收集。

依赖包滥用System.gc()导致的频繁Full GC,用户进程终止,垃圾收集进程运行。用户响应慢,没有用户线程在执行了。

 

新生代可以分为Eden、survivor0、survivor1,正常的对象分配都是在eden完成的,如果eden空间不够了,会触发一次minor gc,存活的对象放在s0或s1中。随着每次minor gc,存活的对象会不断的从s0迁到s1,再从s1迁到s0,这个过程经过几次之后,如果对象还是存活的,就会晋升到老年代。满足年龄晋升条件

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值