垃圾收集器

Serial收集器(一般用于客户端)

串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩(整理);垃圾收集的过程中会Stop The World(服务暂停)。

一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。

特点:CPU利用率最高,停顿时间即用户等待时间比较长。

适用场景:小型应用、桌面应用。

4个线程同时运行,当需要垃圾回收的时候,四个线程会暂停,此时只有GC线程运行,运行完成后4个线程继续运行。 

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。


ParNew收集器(缩短中间停顿时间更合适客服端)

ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩(整理)。

在客户端情况下不如serial。Jdk1.5,sum公司发明了一个非常牛的垃圾回收器cms,这个处理器并发执行,用于回收老年代内存。如果老年代使用cms新生代只能使用parnew或者serial。cms不能和parallell共用。

参数控制:-XX:+UseParNewGC  ParNew收集器。

-XX:ParallelGCThreads 限制线程数量。


parallel 收集器(更注重吞吐量适合服务端)

Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-整理(压缩)

采用多线程来通过扫描并压缩堆。原理图和ParNew原理图一样,只是关注点不同而已。

特点:停顿时间短,回收效率高,对吞吐量要求高。

适用场景:大型应用,科学计算,大规模数据采集等。

-XX:MaxGCPauseMillis 垃圾收集器最大停顿时间、-XX:GCTimeRatio 吞吐量大小,GCTimeRatio 取值(0到100,默认最大99.)。

ParNew收集器和parallel收集器的不同:

1、ParNew收集器关注的是缩短GC线程的运行时间。

2、parallel收集器关注的是吞吐量。

吞吐量:CPU用于运行用户代码的时间与CPU消耗的总时间的比值。也就是说吞吐量=(执行用户代码的时间)/(执行用户代码的时间 + 垃圾回收所占用的时间)。


CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

工作过程:初始标记、并发标记、重新标记、并发清理。

优点:并发收集、低停顿。

缺点:占用大量的CPU资源、无法处理浮动垃圾、空间碎片,并发阶段会降低吞吐量,出现Concurrent Module Failure。

主要用于老年代,减少延迟,提高响应速度。

采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。

(1)初始标记

(2)并发标记

(3)并发预处理

(4)重新标记

(5)并发清除

(6)并发重置

特点:响应时间优先,减少垃圾收集停顿时间。

适应场景:大型服务器等。

通过JVM参数 -XX:+UseConcMarkSweepGC设置。

 


G1收集器

G1收集器(或者垃圾优先收集器)能够尽量缩短处理超大堆(大于4GB)时产生的停顿。

在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。

步骤:初始标记,并发标记,最终标记,刷选回收。

优势:并行与并发,分代收集,空间整合,可预测的停顿。

特点:支持很大的堆,高吞吐量

--支持多CPU和垃圾回收线程

--在主线程暂停的情况下,使用并行收集

--在主线程运行的情况下,使用并发收集

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收。

从JDK 9开始,G1成为默认的垃圾回收器。

通过JVM参数 -XX:+UseG1GC 使用G1垃圾回收器


内存分配策略规则

java的内存分配策略:

1、优先分配到eden

2、大对象直接分配到老年代

       因为eden执行垃圾回收算法频率是非常高的,eden一般都是采用复制算法,每次都要移动这些大对象,导致性能会很低,所以直接把大对象放在老年代里面。

       可以通过-XX:PretenureSizeThreshold设置一个值,当大于这个值就放到老年代里面。

3、长期存活的对象分配到老年代

       在jdk1.6的时候是严格遵守这个约定的,在后来的版本就不是很严格了,回收几次就放到老年代里面了。

       可以通过-XX:MaxTenuringThreshold设置存活时间,当大于这个值就放到老年代里面。

4、空间分配担保

       在进行内存分配的过程中,如果内存不够了,会向老年代借用内存。默认是启用的。可以通过-XX:+HandlePromotionFailure禁用空间分配担保。

5、动态对象年龄判断


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值