文档章节

六、Hotspot中的垃圾收集器

Swimmer
 Swimmer
发布于 2016/12/08 08:31
字数 859
阅读 10
收藏 0
点赞 0
评论 0

一、Serial/Serial Old收集器

  1. 历史最悠久的收集器
  2. 单线程的收集器
  3. 在工作时需要停掉虚拟机所有线程
  4. 优点是在做事专一,动作迅速
  5. 在Client端的新生代中一般使用这个收集器回收,回收200M以内的新生代只需要不到100ms,这对于Client是可以接受的

二、ParNew收集器

  1. Serial收集器的多线程版本
  2. 只有ParNew收集器可以与CMS收集器配合使用

三、Parallel Scavenge收集器

  1. 吞吐连优先的收集器 
  2. 吞吐量:代码运行时间/(代码运行时间 + 垃圾收集时间)

四、CMS收集器

  1. 老年代并发收集器
  2. 基于 标记清除算法实现
  3. 执行垃圾收集时有四个步骤
    • 初始标记(Stop the World):标记一下GC Root能直接关联的对象,速度很快
    • 并发标记:使用可达性分析算法,标记需要回收的对象
    • 重新标记(Stop the World):标记 并发标记 期间变化的对象(多线程)
    • 并发清除
  4. CMS优点:并发收集、低停顿
  5. CMS缺点:
    • 并发占用CPU,导致用户线程变慢
    • 会产生浮动垃圾(并发清除时产生的垃圾),因为在并发清除时还用用户线程在执行,所以要预留一部分内存,所以可以通过参数设定当老年代内存被占用 X% 时触发CMS回收,如果回收失败,会触发Serial Old收集器,进行再一次回收
    • CMS收集器是使用标记清除算法实现的,所以会残生大量内存碎片,所以当CMS收集器触发Serial Old时要进行内存整理操作(这个过程无法并发,所以会导致程序变慢,可以通过参数设定)

 

五、G1收集器

  1. G1收集器是注重停顿时间的收集器
  2. G1收集器可以不需要其他收集器配合,独立管理新生代和老年代
  3. G1收集器将java堆分成多个Region(新生代和老年代穿插在不同的Region里,不再物理隔离),两个Region通过复制算法手机,整体看来通过标记整理算法手机,不会产生内存碎片
  4. 通过建立可预测的停顿时间模型,可以让使用者明确在M毫秒内的内存回收不超过N毫秒
  5. G1收集器,会根据停顿时间模型计算每个Region回收的经验值,根据可以回收的时间(N毫秒)来回收最有回收价值的Region
  6. G1收集器通过Remebered Set记录Region中对象有没有被其他Region中的对象引用(为了避免全堆扫描)
  7. G1收集器的过程:
    • 初始标记(Stop the World):标记一下GC Root能直接关联的对象,速度很快,与CMS不同的是,这个阶段会修改TAMS值,让 并发标记 阶段产生的新对象都在正确可用的Region中创建
    • 并发标记:通过可达性分析算法标记回收的对象
    • 最终标记:修正在并发标记时改变的对象,并记录到Remebered Set Logs中,然后虚拟机将Logs合并到Remebered Set中,这个过程是并行的(非并发)
    • 筛选回收:根据Region的回收价值大小回收

 

© 著作权归作者所有

共有 人打赏支持
Swimmer
粉丝 2
博文 30
码字总数 12958
作品 0
朝阳
程序员
JVM实用参数(六) 吞吐量收集器

原文链接 本文连接 译者:张军 校对:梁海舰 在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准: 吞吐量越高算法越好 暂停时间越短算法越好 首先让我们...

低至一折起
2017/11/23
0
0
《JDK10新特性官方文档》JEP304: 垃圾收集器接口

作者: Roman Kennke 创建时间:2016/08/06 08:45 更新时间:2018/04/09 12:37 类型: 特性 状态: 已关闭/已提交 组件:hotspot/gc 范围:实现类 讨论: openjdk.java.net上的hotspot-gc-de...

floder
01/30
0
0
Hotspot 性能架构 -转

第一章:介绍和概述 Java HotSpot虚拟机是Sun公司的Java平台一个高效的虚拟机实现。Java HotSpot技术提供Java标准平台的基础设施,提供对快速开发、部署关键业务的桌面和企业应用程序的解决方...

刘小兵2014
2011/10/18
0
0
HotSpot 的垃圾收集 - 转

从J2SE 5.0开始,HotSpot JVM共包含四种垃圾收集器,它们全部基于分代算法。 一、代的划分 HotSpot JVM中内存被划分为三代:年幼代(young generation)、年长代(old generation)和永久代(...

刘小兵2014
2011/10/18
0
0
推荐书籍:《Java性能调优指南》

本书作者是Java性能和Java HotSpot 虚拟机领域的佼佼者,帮助你利用现代软工实践提高性能,避免常见错误,从实战生涯中总结技巧和窍门。 利用G1克服并行、串行和CMS垃圾收集器的局限性了解G...

ddddd8
2017/11/27
0
0
《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区 1:程序计数器(Program Counter Register),也...

洋哥6
2015/10/06
1K
0
谈谈Java内存管理

对于一个Java程序员来说,大多数情况下的确是无需对内存的分配、释放做太多考虑,对Jvm也无需有多么深的理解的。 但是在写程序的过程中却也往往因为这样而造成了一些不容易察觉到的内存问题,...

Galy_绿
2016/07/11
22
0
JVM的垃圾回收机制详解和性能调优

1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不需求jvm有gc,也没有规定gc怎么工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理...

商者
2016/03/30
76
0
hotspot的垃圾回收策略,设置和调优

引言: 我们都知道JVM内存由几个部分组成: Java栈、程序计数器(ProgramCounter)寄存器、本地方法栈、堆、方法区、运行常量池。 JVM垃圾回收仅仅针对公共内存区域即:堆和方法区进行。 本文...

小车车
2016/09/22
46
0
王一三学习笔记 | 理解Java垃圾回收

Serial GC、Parallel GC、Parallel Old GC(Parallel Compacting GC)、Concurrent Mark & Sweep GC (or "CMS")、Garbage First (G1) GC。 Young GC、Old GC、major GC、major GC、full GC。 ......

ijava
2017/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

切分log日志

新建logback.xml放到resource里面 <?xml version="1.0" encoding="utf-8"?><configuration> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <......

talen
5分钟前
0
0
spring @Resource 和 @Autowired 的使用区别

这两个 注解 @Resource 和 @Autowired , 常识都知道 @Resource 是 JAVAEE 自带的,@Autowired 是 spring 的自定义注解。 一般情况下, 使用 bean的时候, 这两个注解 随便使用一个即可。 但...

之渊
10分钟前
0
0
崛起于Springboot2.X之集成MongoDB使用Repository增删改查(26)

1、pom依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version></dependency><dependency> <groupId>log4j</......

木九天
12分钟前
1
0
springboot集成elasticsearch客户端问题记录

1背景说明 服务端ES版本为5.5.2,springboot版本为1.5.6。 工程中添加如下依赖 2问题记录 2.1 NetworkPlugin类找不到 报错java.lang.ClassNotFoundException: org.elasticsearch.plugins.Net...

zjg23
12分钟前
1
0
快速构建ceph可视化监控系统

前言 ceph的可视化方案很多,本篇介绍的是比较简单的一种方式,并且对包都进行了二次封装,所以能够在极短的时间内构建出一个可视化的监控系统 本系统组件如下: ceph-jewel版本 ceph_expor...

万建宁
12分钟前
0
0
Java构造器使用注意

public class 父类A {int age = 10;protected void say() {System.out.println("父类A");}public 父类A() {override();}public void override() {Syst...

咸鱼AI
13分钟前
0
0
TensorFlow 线性分类

构造直线 z = 2 * x - 3 * y + 4 x0*w0+x1*w1+b=0 x1=-x0* w0/w1-b/w1 斜率 k= -w0/w1 截距 -b/w1 随机生成数据,加入一定的偏差,用直线将二维平面分为两部分 使用线性模型拟合参数 损失函数...

阿豪boy
16分钟前
0
0
翻译冒泡排序测试

翻译一个冒泡排序: var a = [1,3,2,4,6,5];var f = 0;var n = a.length ;for( var i =1; i<= n; i++) { for( var j = n-1 ; j >= i; j --) { if(a[j] < a[j+1]) { ......

钟元OSS
17分钟前
0
0
maven父、子级版本号同时修改

命令: mvn versions:set -DnewVersion=0.0.2-SNAPSHOT

沉默的懒猫
19分钟前
0
0
Spring boot中的异常处理之注解响应

Controller层 return patientRepository.findById(id) .orElseThrow(() -> new NotFoundException(String.format("Patient %d not found", id))); Exception类 @ResponseS......

亚林瓜子
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部