内存管理机制-垃圾回收集器
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 |
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收集器
ConcurrentMarkSweepCMS是一个单纯的老年收集器采用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),但每个角色的区域个数都不是固定的。这在内存使用上提供了更多的灵活性
超链接:
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回收
相关文章推荐
- GC回收与内存管理机制,垃圾回收
- java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- PHP内存管理机制与垃圾回收机制
- php内存管理机制、垃圾回收机制
- Java基础---JVM内存管理以及垃圾回收机制
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- PHP内存管理机制与垃圾回收机制
- Android_对android虚拟机的理解,包括内存管理机制垃圾回收机制。dalvik和art区别
- java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收
- 内存管理机制-JVM 垃圾回收算法
- PHP内存管理机制与垃圾回收机制
- 对android虚拟机的理解,包括内存管理机制,垃圾回收机制
- java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收
- 对android虚拟机的理解,包括内存管理机制垃圾回收机制。dalvik和art区别
- java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收
- PHP垃圾回收机制和内存管理机制
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- 深入理解java虚拟机阅读笔记二:java自动内存管理机制以及垃圾回收机制