您的位置:首页 > 其它

内存管理机制-垃圾回收集器

2017-06-02 00:00 204 查看

RoadMap



垃圾回收器的类型

分类垃圾回收器类型
线程数串行垃圾回收
并行垃圾回收
工作模式并发垃圾回收
独占垃圾回收
碎片算法压缩垃圾回收
非压缩垃圾回收
分代新生代垃圾回收
老年代垃圾回收

评价GC策略的指标

吞吐量

指在应用程序的生命周期内,应用程序所花费的时间和系统总运行时间的比值
系统总运行时间=程序耗时+GC耗时
如果系统运行了100min,gc运行了1min,那么系统的吞吐量就是(100-1)/100=99%

回收负载

和吞吐量想法,垃圾负载是指回收器耗时与系统运行总时间的比值

停顿时间

指垃圾回收器正在运行时,应用程序的暂停时间。对于独立回收器而言,停顿时间可能会比较长。

回收频率

回收频率指回收器多长时间会运行一次。一般来说,固定程序的频率越低越好。

反应时间

当一个对象称为垃圾对象之后,多长时间,它占据的内存会被释放

通常情况下,很难让一个程序在所有指标上都达到最优,只能根据程序特点,尽可能让GC配合程序而工作

垃圾回收器

Serial收集器

Serial收集器是最古老,实现简单,逻辑高效,JVM默认的一款收集器

--
线程数串行单线程
工作模式独占式
分代新生代,老年代
碎片处理新生代:复制算法.老年代:标记压缩算法
GC参数-XX:+UseSerialGC
串行的工作模式会导致较长的应用程序的停顿时间

ParNew收集器

ParNew收集器是针对新生代并行的收集器。

--
线程数并行多线程
工作模式独占式
分代新生代
碎片处理复制算法
GC参数-XX:UseParNewGC
并行的工作模型是指GC的线程在同一时刻同时运行,和应用程序还是串行的模式,所以也还是会和应用程序去争夺CPU资源,当GC分配到资源后会造成短暂的程序停顿,但是同时也会降低吞吐量

ParallelScavenge收集器

ParalleScavenge收集器和ParNew收集器类似。区别在于ParalleScavenge收集器
重点关注程序吞吐量。有时,这个收集器也被叫为吞吐量优先收集器

--
线程数并行多线程
工作模式独占式
分代新生代
碎片处理复制算法
GC参数-XX:UseParallelGC
-XX:MaxGCPauseMillis设置最大停顿时间
-XX:GCTimeRatio设置吞吐量默认是99GC时间=1/(1+99)=1%

SerialOld收集器

SerialOld收集器是Serial收集器老版本针对老年代使用。已被Serial收集器取代。
多树是和ParallelScavenge组合使用

--
线程数串行单线程
工作模式独占式
分代老年代
碎片处理标记压缩
GC参数-XX:UseSerialOldGC

Parallelold收集器

ParaellOld收集器是针对老年代并行的收集器。

--
线程数并行多线程
工作模式非独占式
分代老年代
碎片处理标记清理
GC参数-XX:UseParallelOldGC
-XX:ParallelGCThreads并行线程的数量

CMS收集器

ConcurrentMarkSweep
CMS是一个单纯的老年收集器采用Mark-Sweep算法,主要关注与停顿时间。它采用非独占式的并发模式,可以和应用程序同时执行,所以总的来说停顿时间较少
运行过程比较复杂,在标记,清除的不同阶段,它会尝试与应用程序同时进行。



–初始标记

•根可以直接关联到的对象

•速度快

–并发标记(和用户线程一起)

•主要标记过程,标记全部对象

–重新标记

•由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正

–并发清除(和用户线程一起)

•基于标记结果,直接清理对象

--
线程数并行多线程
工作模式独占式
分代老年代
碎片处理标记压缩
GC参数–-XX:+UseConcMarkSweepGC

G1收集器

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器.以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.在OracleJDK7update4及以上版本中得到完全支持,专为以下应用程序设计:

可以像CMS收集器一样,GC操作与应用的线程一起并发执行

紧凑的空闲内存区间且没有很长的GC停顿时间.

需要可预测的GC暂停耗时.

不想牺牲太多吞吐量性能.

启动后不需要请求更大的Java堆.

G1的长期目标是取代CMS(ConcurrentMark-SweepCollector,并发标记-清除).因为特性的不同使G1成为比CMS更好的解决方案.一个区别是,G1是一款压缩型的收集器.G1通过有效的压缩完全避免了对细微空闲内存空间的分配,不用依赖于regions,这不仅大大简化了收集器,而且还消除了潜在的内存碎片问题。除压缩以外,G1的垃圾收集停顿也比CMS容易估计,也允许用户自定义所希望的停顿参数(pausetargets)

上一代的垃圾收集器(串行serial,并行parallel,以及CMS)都把堆内存划分为固定大小的三个部分:年轻代(younggeneration),年老代(oldgeneration),以及持久代(permanentgeneration).

而G1收集器采用一种不同的方式来管理堆内存.
堆内存被划分为多个大小相等的heap区,每个heap区都是逻辑上连续的一段内存(virtualmemory).其中一部分区域被当成老一代收集器相同的角色(eden,survivor,old),但每个角色的区域个数都不是固定的。这在内存使用上提供了更多的灵活性

超链接:G1收集器详解

GC参数整理

-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC:新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: