分代收集算法

将这个堆内存划分成两块:新生代和老年代,刚刚创建的对象都在新生代,长久存活的对象都在老年代(老年代的垃圾回收很久发生一次,新生代的垃圾回收发生的比较频繁)

新生代又进一步划分成伊甸园Eden,幸存区From,幸存区To

(1)新创建的对象放在eden区,eden区满了就会触发minor GC

(2)将eden区和SurvivorFrom区的要回收的对象复制到SurvivorTo区,然后清空eden区和SurvivorFrom区,这时就只剩下SurvivorTo区有对象,然后再将SurvivorFrom区和SurvivorTo区进行交换,这是就只剩下SurvivorFrom区有存活对象

注意:这里用的就是标记复制算法,先将所有的存活对象移动到另一块区域,然后回收原区域所有要回收的对象,也就是说新生代采用的是标记复制算法

每次经过一次垃圾回收,剩余的对象年龄+1.当对象的年龄到达一定阈值(比如16)还没有被回收,那就会将这个对象迁移至老年代(除了这种情况要将对象放到老年代,还有当你创建了一个大对象,比如5M(这个值可以通过PretenureSizeThreshold这个参数进行设置,默认3M,即使Eden区有足够的空间来存放,也不会存放在Eden区,而是直接存入老年代)

关于minor gc,major gc,full  gc

新生代的垃圾收集叫minor gc

老年代的垃圾收集叫major gc

整个堆一起收集叫作full gc

minor gc:因为Java对象大多具备朝生夕死的特新,所以Minor GC非常频繁,一般回收速度也比较快.

Minor GC会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才恢复运行

major gc:一般出现Major GC,经常会伴随至少一次的Minor GC(但非绝对的)

Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长

full gc:full GC的过程是比较耗费时间的,因此应该尽量避免频繁触发Full GC。当触发 Major GC 时,如果老年代空间不足以容纳所有晋升的对象,就会触发 Full GC,在程序中手动调用System.gc()也会触发Full GC。

分代回收相关虚拟机参数:

 设置JVM参数:

-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc

Heap
//新生代10MB
 def new generation   total 9216K, used 1835K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)
//伊甸园区
  eden space 8192K,  22% used [0x00000000f9a00000, 0x00000000f9bcada0, 0x00000000fa200000)
//幸存区from和幸存区to
  from space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)
  to   space 1024K,   0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000)

//老年代
 tenured generation   total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)
   the space 10240K,   0% used [0x00000000fa400000, 0x00000000fa400000, 0x00000000fa400200, 0x00000000fae00000)


 compacting perm gen  total 21248K, used 2973K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)
   the space 21248K,  13% used [0x00000000fae00000, 0x00000000fb0e7558, 0x00000000fb0e7600, 0x00000000fc2c0000) 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值