基于分代的垃圾收集算法

注意:当JVM触发GC垃圾收回时,JVM的其他应用程序都会暂停工作。

一、设计思路:把对象按照寿命长短来分组,分为 年轻代年老代
- 年轻代:新创建的对象
- 年老代:对象经过几次回收后仍然存活,划分到年老代(收集频度低,减少了每次垃圾收集时所要扫描的对象的数量,从而提高了垃圾回收效率)


Young区分为Eden 区和两个Survivor 区
- Eden:新创建的对象
- 当Eden区满后会触发minor GC 将Eden 区仍然存活的对象复制到其中一个Survivor区中,另外一个survivor区中的存活对象也复制到这个Survivor中,以保证始终有一个Survivor区是空的。(为什么要保证Survivor区有一个是空的)
Old区存放的是Young区Survivor满后触发minor GC 后仍然存活的对象。
- 如果Old区也满了,将会触发Full GC,回收整个堆内存。
Perm区存放的主要是类的Class对象。
- 由Full GC 触发垃圾回收
建议:Young 区的大小为整个堆的1/4,Survivor = Young/4。

二、三类垃圾收集算法:
● Serial Conllector
- JVM 配置参数 -XX:+UseSerialGC
- JVM在做此GC时由于是串行,这些动作又是单线程,所以JVM中的其他应用程序会全部停止


● Parallel Conllector
● ParNewGC
- -XX:UseParNewGC
- 对象分配和回收策略与SerialGC类似,但是是多线程并行回收
● ParallelGC
- Server下默认的GC方式
- -XX:UseParallelGC
- 并行回收,线程数配置 -XX:ParallelGCThreads来指定
- 线程数计算公式:CPU和核数小于8,线程数可以和核数一样;
大于8,值为3+(cpu core * 5)/8


● ParallelOldGC
- -XX:UseParallelOldGC
- 并行回收,线程数配置 -XX:ParallelGCThreads来指定
- 线程数计算公式:CPU和核数小于8,线程数可以和核数一样;
大于8,值为3+(cpu core * 5)/8
-- 后两种的区别在于Full GC,前者清空整个堆的垃圾对象,后者清空部分。
-- GC 垃圾回收都是以多线程方式进行的,同样也将暂停所有的应用程序
● CMS Conllector
- -XX:UseConcMarkSweepGC
- 并发的线程数默认为4,配置参数 -XX:ParallelCMSThreads
- 触发CMS GC 时回收的只是Old 区或者 Perm 区的垃圾对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值