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

 

RoadMap

 

垃圾回收器的类型

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

评价GC策略的指标

吞吐量

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

回收负载

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

停顿时间

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

回收频率

回收频率指回收器多长时间会运行一次。通常来讲,固定程序的频率越低越好。并发

反应时间

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

一般状况下,很难让一个程序在全部指标上都达到最优,只能根据程序特色,尽量让GC配合程序而工做spa

垃圾回收器

Serial 收集器

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

- -
线程数 串行单线程
工做模式 独占式
分代 新生代,老年代
碎片处理 新生代: 复制算法. 老年代:标记压缩算法
GC 参数 -XX:+UseSerialGC

串行的工做模式会致使较长的应用程序的停顿时间 线程

ParNew 收集器

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

- -
线程数 并行多线程
工做模式 独占式
分代 新生代
碎片处理 复制算法
GC 参数 -XX:UseParNewGC

并行的工做模型是指 GC的线程在同一时刻同时运行,和应用程序仍是串行的模式,因此也仍是会和应用程序去争夺CPU资源,当GC分配到资源后 会形成短暂的程序停顿,可是同时也会下降吞吐量 code

Parallel Scavenge 收集器

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

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

Serial Old 收集器

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

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

Parallel old 收集器

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

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

CMS 收集器

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

 
  1. –初始标记
  2. •根能够直接关联到的对象
  3. •速度快
  4. –并发标记(和用户线程一块儿)
  5. •主要标记过程,标记所有对象
  6. –从新标记
  7. •因为并发标记时,用户线程依然运行,所以在正式清理前,再作修正
  8. –并发清除(和用户线程一块儿)
  9. •基于标记结果,直接清理对象
- -
线程数 并行多线程
工做模式 独占式
分代 老年代
碎片处理 标记压缩
GC 参数 –-XX:+UseConcMarkSweepGC

 

G1 收集器

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

  • 能够像CMS收集器同样,GC操做与应用的线程一块儿并发执行
  • 紧凑的空闲内存区间且没有很长的GC停顿时间.
  • 须要可预测的GC暂停耗时.
  • 不想牺牲太多吞吐量性能.
  • 启动后不须要请求更大的Java堆.

G1 的长期目标是取代CMS(Concurrent Mark-Sweep Collector, 并发标记-清除). 由于特性的不一样使G1成为比CMS更好的解决方案. 一个区别是,G1是一款压缩型的收集器.G1经过有效的压缩彻底避免了对细微空闲内存空间的分配,不用依赖于regions,这不只大大简化了收集器,而 且还消除了潜在的内存碎片问题。除压缩之外,G1的垃圾收集停顿也比CMS容易估计,也容许用户自定义所但愿的停顿参数(pause targets)

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

 

而 G1 收集器采用一种不一样的方式来管理堆内存. 
堆内存被划分为多个大小相等的 heap 区,每一个heap区都是逻辑上连续的一段内存(virtual memory). 其中一部分区域被当成老一代收集器相同的角色(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回收

相关文章
相关标签/搜索