.1. GC算法

.1.1. 标记-清除算法(Mark-Sweep)

1、标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象

2、在标记完成后统一回收所有被标记的对象

缺点:一个是效率问题,标记和清除两个过程的效率都不高;

另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中

需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

.1.1. 复制算法(Copying)

1、将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。

2、当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

优点:这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等

复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为

了原来的一半,未免太高了一点。

缺点:复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低

.1.1. 标记-整理算法(Mark-Compact)

1、标记

2、让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

.1.1. 分代收集算法(Generational Collection)

1、根据对象存活周期的不同将内存划分为几块。

2、一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

3、在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

4、老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。

.1. 垃圾回收器

.1.1. Serial收集器:

1、是一个单线程的收集器,“Stop The World”

2、对于运行在Client模式下的虚拟机来说是一个很好的选择

4、简单而高效

.1.1. Serial Old收集器

1、Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。

2、主要意义也是在于给Client模式下的虚拟机使用。

3、如果在Server模式下,那么它主要还有两大用途:

一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用[1],

另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

.1.1. ParNew收集器

1、Serial收集器的多线程版本

2、单CPU不如Serial

3、Server模式下新生代首选,目前只有它能与CMS收集器配合工作

4、使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。

5、-XX:ParallelGCThreads:限制垃圾收集的线程数。

.1.1. Parallel Scavenge收集器

1、吞吐量优先”收集器

2、新生代收集器,复制算法,并行的多线程收集器

3、目标是达到一个可控制的吞吐量(Throughput)。

4、吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

5、两个参数用于精确控制吞吐量:

-XX:MaxGCPauseMillis是控制最大垃圾收集停顿时间

-XX:GCTimeRatio直接设置吞吐量大小

-XX:+UseAdaptiveSizePolicy:动态设置新生代大小、Eden与Survivor区的比例、晋升老年代对象年龄

6、并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

7、并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户

程序在继续运行,而垃圾收集程序运行于另一个CPU上。

Parallel Old收集器

1、Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

2、在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。

CMS收集器一款优秀的收集器

1、以获取最短回收停顿时间为目标的收集器。

2、非常符合互联网站或者B/S系统的服务端上,重视服务的响应速度,希望系统停顿时间最短的应用

3、基于“标记—清除”算法实现的

4、CMS收集器的内存回收过程是与用户线程一起并发执行的

5、它的运作过程分为4个步骤,包括:

初始标记,“Stop The World”,只是标记一下GC Roots能直接关联到的对象,速度很快

并发标记,并发标记阶段就是进行GC RootsTracing的过程

重新标记,Stop The World”,是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,但远比并发标记的时间短

并发清除(CMS concurrent sweep)

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

7、缺点:

对CPU资源非常敏感。

无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。

一款基于“标记—清除”算法实现的收集器

G1(Garbage-First)收集器

1、当今收集器技术发展的最前沿成果之一

2、G1是一款面向服务端应用的垃圾收集器。

3、优点:

并行与并发:充分利用多CPU、多核环境下的硬件优势

分代收集:不需要其他收集器配合就能独立管理整个GC堆

空间整合:“标记—整理”算法实现的收集器,局部上基于“复制”算法不会产生内存空间碎片

可预测的停顿:能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒

4、G1收集器的运作大致可划分为以下几个步骤:

初始标记:标记一下GC Roots能直接关联到的对象,需要停顿线程,但耗时很短

并发标记:是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行

最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录

筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划

垃圾收集器参数总结

收集器设置:

-XX:+UseSerialGC:年轻串行(Serial),老年串行(Serial Old)

-XX:+UseParNewGC:年轻并行(ParNew),老年串行(Serial Old)

-XX:+UseConcMarkSweepGC:年轻并行(ParNew),老年串行(CMS),备份(Serial Old)

-XX:+UseParallelGC:年轻并行吞吐(Parallel Scavenge),老年串行(Serial Old)

-XX:+UseParalledlOldGC:年轻并行吞吐(Parallel Scavenge),老年并行吞吐(Parallel Old)

收集器参数:

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

.1. JVM参数列表

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m  -XX:MaxTenuringThreshold=0

-Xmx3550m:最大堆内存为3550M。

-Xms3550m:初始堆内存为3550m。

此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g:设置年轻代大小为2G。

整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:设置每个线程的堆栈大小。

JDK5.0以后每个线程堆栈大小为1M,在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000左右。

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。

设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxPermSize=16m:设置持久代大小为16m。

-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。

如果设置为0的话,则年轻代对象不经过Survivor区,直 接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象 再年轻代的存活时间,增加在年轻代即被回收的概论。

收集器设置

-XX:+UseSerialGC:设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器

垃圾回收统计信息

-XX:+PrintGC

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

-Xloggc:filename

并行收集器设置

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

.1. jvm案例演示

内存:

内存标签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(java堆和永久代)的变化趋势。

我们通过下面的一段代码体验一下它的监视功能。运行时设置的虚拟机参数为:-Xms100m -Xmx100m -XX:+UseSerialGC,这段代码的作用是以64kb/50毫秒的速度往java堆内存中填充数据。

public class TestMemory {

static class OOMObject {

public byte[] placeholder = new byte[64 * 1024];

}

public static void fillHeap(int num) throws Exception {

ArrayList<OOMObject> list = new ArrayList<OOMObject>();

for (int i = 0; i < num; i++) {

Thread.sleep(50);

list.add(new OOMObject());

}

System.gc();

}

public static void main(String[] args) throws Exception {

fillHeap(1000);

Thread.sleep(500000);

}

}

从图中可以看出,运行轨迹成曲线增长,循环1000次后,虽然整个新生代Eden和Survivor区都基本上被清空了,但是老年代仍然保持峰值状态,这说明,填充的数据在GC后仍然存活,因为list的作用域没有结束。如果把System.gc();移到fillHeap(1000);后,就可以全部回收掉。

jvm3---垃圾回收器算法相关推荐

  1. 垃圾回收器算法之引用计数器法

    垃圾回收器算法之引用计数器法 微软将运行在公共语言运行时里的代码成为托管代码:但是从更广泛的意义上来说,只要语言提供了自动内存管理功能,我们使用其开发的代码都可以称为托管代码:自动内存管理即我们平时所 ...

  2. 常见的垃圾回收器算法有哪些,各有什么优劣?

    标记清除 这种算法分两分: 标记.清除两个阶段, 标记阶段是从根集合(GC Root)开始扫描,每到达一个对象就会标记该对象为存活状态,清除阶段在扫描完成之后将没有标记的对象给清除掉. 这个算法有个缺 ...

  3. 垃圾回收概述,算法及垃圾回收器

    参考2目录 1. 常见面试题 2. 概述 2.1 什么是垃圾 2.2 为什么需要GC(垃圾收集)? 2.3 Java的垃圾回收机制 2.4 垃圾收集主要关注的区域 3. 垃圾回收算法 3.1 判断对象 ...

  4. 经典面试题:聊一聊垃圾回收算法

    关于垃圾回收算法的这道面试题,几乎是所有 3 年以上的 Java 面试中必问的题目,甚至有些好一点的公司会在校招时问到面试者.那么本文就系统的讲一下垃圾回收的算法,和 Hotspot 虚拟机执行垃圾回 ...

  5. 垃圾回收概述(垃圾回收算法)

    垃圾回收概述 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集. 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使 ...

  6. JVM 垃圾回收算法及回收器详解

    本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Python是 ...

  7. Java虚拟机JVM常用的几种回收算法和垃圾回收器

    1. 垃圾回收算法 1.1 "标记-清除"算法 对内存对象进行可达性分析并标记,标记完成后统一回收.书中说有两个不足:①标记和清除效率不高:②内存空间是大量不连续的内存碎片.标记是 ...

  8. 主要垃圾回收器和垃圾回收算法

    垃圾回收算法: 标记清除算法 mark-sweep 分为标记和清除两个阶段,但是内存碎片化严重 复制算法 copying 为了解决内存碎片化问题,但是空间利用率降低,主要用于大量对象存活时间短的年轻代 ...

  9. JVM从入门到精通(六):JVM调优必备理论知识 - 3种垃圾清除算法,常见的垃圾回收器

    JVM调优是一层窗户纸,只是看起来很难.学完本节课,让你: 熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验 What is garbage 什么是垃圾?没有引用指向的对象就是 ...

  10. 垃圾回收算法以及垃圾回收器_什么是垃圾回收?

    垃圾回收算法以及垃圾回收器 以下是我们的垃圾收集手册中的一个示例,该手册将在接下来的几周内发布. 同时,花点时间熟悉垃圾收集的基础知识-这将是本书的第一章. 乍一看,垃圾收集应该处理顾名思义的问题–查 ...

最新文章

  1. 单片机值得学吗?会单片机能找什么工作?
  2. SharePoint Server 2016 部署安装(三)—— 安装SharePoint Server
  3. 动态调整linux分区大小,GParted 动态调整Linux分区大小
  4. 添加服务oracle,oracle 11g(四)给oracle添加为系统服务(脚本)
  5. Linux终端进程后台运行与前后台切换
  6. 计算机系统u盘判断,U盘真实容量检测工具
  7. ASP.NET Core 引用其他程序集项目里面的 Controller 控制器
  8. java版b2b2c社交电商spring cloud分布式微服务 (三) 服务消费者(Feign)
  9. visio流程图添加连接点
  10. 4.SQL常用函数汇总
  11. K线形态识别—K线反转形态之底部反转形态
  12. Badboy提示脚本错误解决方法
  13. Android Data Binding 初识
  14. 神奇相机将照片变文字 超大相册搜图无压力
  15. solidworks批量图号分离_SolidWorks2014基于宏实现快速图号名称分离.docx
  16. 期货市场之反转形态分析
  17. CF869E The Untended Antiquity 解题报告
  18. ESD防护选型思路(一)
  19. 计算机c程序题孔融让梨,幼儿园大班语言游戏教案《孔融让梨》含PPT课件.doc
  20. forwardRef 的详解及使用

热门文章

  1. 多线激光雷达遇到的问题
  2. 《Lua程序设计》第7章 迭代器与泛型for 学习笔记
  3. 魏兴华_ORACLE优化器革命漫谈
  4. 实战 TPCC-MySQL 基准测试
  5. Gartner发布2011年SIEM市场分析报告(幻方图)
  6. jQuery API/1.1.1/CSS
  7. centos 网络自动连接_自动连接最优信号 腾讯云?云兔解决物联网络连接问题
  8. Android WiFi 扫描并选择网络进行连接
  9. Codeforces 1042 D Petya and Array
  10. unity update 协程_[转载]【转载】unity3D中使用协程来做“多次调用一次更新”特性的一个大坑。...