深入理解JVM 垃圾收集器(上)
- HotSpot虚拟机中的垃圾收集器
- GC评价标准
- GC调优
- 响应时间
- 吞吐量
- 1.新生代收集器
- Serial收集器
- ParNew收集器
- Parallel Scavenge收集器
- 2.老年代收集器
- Serial Old收集器
- Parallel Old收集器
- CMS收集器(Concurrent Mark Sweep)
HotSpot虚拟机中的垃圾收集器
7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。
GC实现目标: 准确、高效、低停顿、空闲内存规整.
GC评价标准
在评估一个GC时,有几个方面需要关注。
- GC的停顿时间: 大部分GC执行时需要将应用程序停止以便内存保持一个一致的状态来进行回收,这会对应用程序的执行性能造成影响。
- GC的吞吐量: 在不面向用户的应用程序中,可能并不关注停顿时间,而是关注总体的执行效率,这时GC的吞吐量可以理解为回收一定内存所需的时间。
GC调优
java应用调优一般关注两个指标:响应时间和吞吐量。
响应时间
响应时间指的是应用对请求的响应时间,如:
- 一个桌面应用对时间的响应时间
- 网站返回一个页面的时间
- 数据库查询结果返回时间
对于专注于最小响应时间的应用,长时间停顿是无法接受的。
吞吐量
吞吐量专注于应用在一段时间的的最大工作量。如:
- 给定时间内完成的事物数
- 每小时批处理程序能够完成的任务
- 每小时数据库可以完成的查询操作数
较长停顿时间在此情况下是可以接受的。比起低响应时间,吞吐量优先应用更看重一段时间内的表现。
1.新生代收集器
Serial收集器
|
工作区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Serial收集器 (Stop the World) |
新生代 | 单线程 | 复制算法 |
Client模式下的默认新生代收集器。 进行垃圾收集时,必须Stop the world,直到它收集结束。 -XX:+UseSerialGC |
ParNew收集器
|
工作区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
ParNew收集器 (Serial收集器的多线程版本) (Stop the World) |
新生代 | 多线程 | 复制算法 | Server模式下的默认新生代收集器 |
Parallel Scavenge收集器
|
工作区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Parallel Scavenge收集器 (Stop the World) |
新生代 | 多线程 | 复制算法 |
吞吐量优先收集器 目标:控制吞吐量 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间) 吞吐量越高说明CPU时间利用率越高。 JVM参数: -XX:MaxGCPauseMillis 控制最大垃圾收集时间 -XX:GCTimeRatio 控制吞吐量大小 -XX:+UseParallelGC -XX:+UseParallelOldGC |
2.老年代收集器
Serial Old收集器
|
作用区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Serial Old收集器 (Stop the World) |
老年代 | 单线程 | 标记整理算法 | 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
如果在Server模式下,主要两大用途: (1)在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用 (2)作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用 |
Parallel Old收集器
|
作用区域
|
单线程/多线程
|
垃圾收集算法
|
|
---|---|---|---|---|
Parallel Old收集器 (Stop the World) |
老年代 | 多线程 | 标记整理算法 |
Parallel Old 是Parallel Scavenge收集器的老年代版本。这个收集器在1.6中才开始提供。 在JDK1.5以及之前的版本中,Parallel Scavenge+Serial Old(单线程),无法充分利用多CPU的处理能力。1.6之后,终于有了名副其实的“吞吐量优先“收集器组合:Parallel Scavenge + Parallel Old。 |
CMS收集器(Concurrent Mark Sweep)
|
作用区域
|
单线程/多线程
|
垃圾收集器算法
|
|
---|---|---|---|---|
CMS收集器 | 老年代 | 多线程 | 标记-清除算法 |
目标:最短回收停顿时间 优点:并发收集,低停顿 缺点: 1)CPU资源敏感。 在并发阶段,虽然不会导致用于线程停顿。但会因为占用了一部分CPU资源,导致用户应用程序变慢,吞吐量降低。 2)无法处理浮动垃圾 并发清理阶段,用户线程仍旧在运行并产生垃圾,这些产生的垃圾此次收集无法清理。 因此,需要预留一部分内存用于并发清理时用户程序使用。 解决方法: 当预留的内存不够时,将发生Concurrent Mode Failure,JVM启动后备预案,临时启用Serial Old进行老年代垃圾收集 -XX:CMSInitiatingOccupancyFraction 3)内存碎片问题 解决方法: -XX:CMSFullGCsBeforeCompaction 设置执行多少次不带压缩的Full GC后,运行一次带压缩的 (默认为0,表示每次Full GC都进行碎片整理) |
CMS在老年代的整个过程分为4个步骤:
|
阶段
|
描述
|
---|---|---|
1 |
初始标记 (Stop the World) |
仅仅标记GC Roots能直接关联到的对象,速度很快 |
2 |
重新标记 (Stop the World) |
修正并发标记阶段因用户程序继续运行而导致标记发生变动的那一部分标记记录。此阶段比初始标记阶段稍长,但远比并发标记阶段的时间短。 |
3 | 并发标记 | 对GC Roots非直接关联到的对象进行标记,在此阶段,并发标记线程与用户线程并发执行,标记可能发生变动 |
4 | 并发清除 |
深入理解JVM 垃圾收集器(上)的更多相关文章
- 深入理解JVM - 垃圾收集器
垃圾回收主要是要解决3件事情: 那些内存需要回收? 如何回收? 什么时候回收? 那些内存需要回收 在强引用的情况下已经“死”了的对象就需要回收,在非强引用的情况下视情况回收.在java里面,几乎所有的 ...
- 深入理解JVM 垃圾收集器(下)G1收集器
1.回顾CMS 1.1堆内存结构 1.2新生代GC 1.3老年代GC 2.G1收集器 2.1G1实现概览及使用场景 G1的推荐使用场景 2.2GC 2.2.1新生代GC 2.2.2老年代GC 老年代G ...
- 深入理解JVM - 垃圾收集器与内存分配策略 - 第三章
引用计数算法——判断对象是否存活的算法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象 ...
- 【006】【JVM——垃圾收集器总结】
Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...
- 第五章 JVM垃圾收集器(1)
说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...
- JVM垃圾收集器(1)
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...
- GC垃圾回收 | 深入理解G1垃圾收集器和GC日志
来源:并发编程网链接:http://ifeve.com/深入理解G1垃圾收集器/ G1 GC是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项:作为JVM GC算法的一次重大 ...
- 7种JVM垃圾收集器特点,优劣势、及使用场景
今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 一.常见的垃圾收集器有3类 1.新生代的收集器包括 Serial PraNew Pa ...
- 第六章 JVM垃圾收集器(2)
上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...
随机推荐
- grid++report中篇
QQ:1187362408 欢迎技术交流和学习 grid++report中篇(grid++report): TODO: 1.grid++report:简单介绍( Grid++Report 是一款高性能 ...
- 如何让VS检查函数和类Comment的添加情况
问题: 现在有一个大的项目,我不能确定是否每个类和函数是否已经加上了comments,是否每个comments都是标注正确的. VS中有没有检查Comments的功能? 解决方案: 1.右击proje ...
- 分享申请IDP账号的过程,包含duns申请的分享
本文转载至 http://www.cocoachina.com/ios/20140325/8038.html 5月份接到公司要申请开发者账号的任务,就一直在各个论坛找申请的流程,但都是一些09年10年 ...
- MVC结构简介
本文编译自J2EE的相关文档.MVC(Model-View-Controller)应用程序结构被用来分析分布式应用程序的特征.这种抽象结构能有助于将应用程序分割成若干逻辑部件,使程序设计变得更加容易. ...
- 【BZOJ2208】[Jsoi2010]连通数 DFS
[BZOJ2208][Jsoi2010]连通数 Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示 ...
- A day
今天推荐一部微电影,从老人的视角看这个社会. 老人在途中买橘子的经历仿佛是看到了当年自己的影子. A day对于有些人来说,很长.对于某些人来说很短暂.这一天所做的事情就是穿过马路走过天桥去水果店买四 ...
- ZOJ 3946 Highway Project(Dijkstra)
Highway Project Time Limit: 2 Seconds Memory Limit: 65536 KB Edward, the emperor of the Marjar ...
- Trifo-VIO:Roubst and Efficient Stero Visual Inertial Odometry using Points and Lines论文笔记
这是2018-IROS上的一篇文章,亮点是作者提出了Lines特征的VIO方案,还有就是提出一个新颖的回环检测,不是用传统的基于优化的方法或者BA,另外作者还发布了一个新的用于VIO的数据集.亮点主要 ...
- python split(),os.path.split()和os.path.splitext()函数用法
https://blog.csdn.net/T1243_3/article/details/80170006 # -*- coding:utf-8 -*- """ @ ...
- 解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)
编译成功,运行时报错: 在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题: *** Error in `xxx': free(): invalid poin ...