JAVA垃圾回收Garbage Collection(二、垃圾收集器)
时间:2018-08-05
本文章向大家介绍JAVA垃圾回收Garbage Collection(二、垃圾收集器),需要的朋友可以参考一下。
垃圾收集器
- HotSpot虚拟机的垃圾收集器
- Java虚拟机规范中对垃圾收集器如何实现没有任何规定,因此不同版本的虚拟机所提供的垃圾收集器都可能有很大的差别,并且都会提供参数供用户自己应用的特点和要求组合出各个年代使用的收集器。java 1.7之后的Hotspot虚拟机包含的收集器如下:
- 新生代收集器:Serial ,ParNew,Parallel Scavenge
- 老年代收集器:CMS,Serial Old,Parallel Old
- 独立堆收集器:G1
- Serial收集器
- serial收集器是最基本发展历史最悠久的收集器。在jdk1.3之前是虚拟机新生代收集的唯一选择。这个收集器是单线程收集器,但它单线程的意义并不仅仅说明它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是,它进行垃圾收集时,必须暂停其他所有的线程,之道它收集结束。"Stop The World"是这个收集器的特点。这个工作其实是由虚拟机在后台自动发起自动完成的在用户不可见的情况下把用户正常工作的线程全部停掉对很多应用难以接受。但是虚拟机开发团队为消除或者工作线程因为内存回收而导致的停顿一直努力进行着,从serial到Parallel收集器到CMS再到G1,一个个越来越优秀的收集器出现,用户线程停顿时间不断缩短,但是仍然没办法消除。
- serial优点:简单高效,对单CPU的环境Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率,在应用场景中分配给虚拟机内存的一般不会很大,收集几十上百兆的新生代时,停顿时间可以控制到几十毫秒最多一百毫秒内只要不是频繁发生这点停顿是可以接受的。所以serial在Client模式下的虚拟机是个很好的选择。
- ParNew收集器
- ParNew收集器其实是Serial收集器的多线程版本,除了使用多线程进行垃圾回收外,其余包括Serial收集器的所有可控参数,收集算法,Stop The World 对象分配规则,回收策略都和Serial一样。示意图如下:
-
- 目前只有ParNew收集器能和CMS收集器配合工作,成为Server模式下虚拟机的首选新生代收集器。
- Parallel Scavenge收集器
- 新生代收集器,使用的也是复制算法Parallel Scavenge收集器的特点是它的关注点和其他收集器不同CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控的吞吐量(ThroughPut)。吞吐量:就是cpu用于运行用户代码的时间与cpu总消耗时间的比值,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机运行了100分钟,垃圾收集花掉1分钟,吞吐量就是99%。
- Parallel Scavenge 收集器总共有两个参数用以精确控制吞吐量分别是:最大垃圾收集停顿时间-XX:MaxGCPauseMills,直接设置吞吐量大小的-XX:GCTimeRatio
- MaxGCPauseMills:GC停顿时间缩短是牺牲吞吐量和新生代空间换来的,系统把新生代调小点,收集200M肯定比500M快,这也导致垃圾收集器更加频繁的原来10s一次,每次100ms,现在是5s一次每次70ms。停顿时间下来了,吞吐 量也下来了。
- GCTimeRatio:0-100的整数,垃圾收集时间占总时间的占比,就是吞吐量的倒数;如默认是99 就是占用1%(1/(99+1))的垃圾收集时间;
- -XX:+UseAdaptiveSizePolicy:打开后不需要手动设定Eden Survivor比例,老年代对象大小的细节参数,续集及会动态调整这些参数以提供最适合的停顿时间或者最大的吞吐量。自适应调节也是与ParNew收集器的重要区别。
- 新生代收集器,使用的也是复制算法Parallel Scavenge收集器的特点是它的关注点和其他收集器不同CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控的吞吐量(ThroughPut)。吞吐量:就是cpu用于运行用户代码的时间与cpu总消耗时间的比值,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机运行了100分钟,垃圾收集花掉1分钟,吞吐量就是99%。
- Serial Old
- serial的老年代版本,单线程收集器使用标记-整理算法,主要在Client模式下的虚拟机下使用
- JDK1.5之前与Parallel Scavenge收集器搭配使用,CMS的后备预案
- Parallel Old
- Parallel Scavenge收集器的老年代版本,使用多线程和标记整理算法。
- 新生代如果选择了Parallel Scavenge收集器,老年代只能使用Serial Old,有了Parallel Old出现后,在注重吞吐量和CPU敏感的资源场合可以优先使用Parallel Scavenge和Parallel Old组合。
- CMS(Concurrent Mark Sweep)
- G1(Garbage First)
- G1收集器是一款面向服务端应用的垃圾收集器
- 并行与并发:G1能充分利用多CPU多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World的时间
- 分代收集:G1收集器可收集新生代老年代两种,不需要其他收集器配合就可以独立管理整个GC堆
- 空间整合:G1采用"标记-整理"算法实现收集器,意味着G1运作期间不会产生内存空间碎片,收集后可提供规整的可用内存
- 可预测的停顿:建立可预测的停顿时间模型,能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集器上的时间不得超过N毫秒
- G1收集器是一款面向服务端应用的垃圾收集器
- 【自然框架】之表单控件(一)实体类(Class)VS 字典(Dictionary)
- 跨平台后门Mokes现已加入OS X豪华午餐
- 【问底】严澜:数据挖掘入门——分词
- 机器学习-简单线性回归教程
- NSA(美国国安局)泄漏Exploit分析
- 详解Windows Shim的攻防利用
- 基于Github的源码白盒扫描工具Raptor
- 把业务逻辑变成数据结构和SQL语句的例子。自然架构改成自然框架
- 【自然框架】之通用权限(六):权限到节点
- 【自然框架】之“元数据”的威力
- 周末娱乐:讲真,这才是我所说黑客的定义!
- 数据访问函数库的使用方法(一)——添加修改数据
- 数据访问函数库的使用方法(二)—— 获取记录集和使用事务的方法
- “数据访问函数库”(DataAccessLibrary for .net2.0 )源代码下载 09.06.15更新
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- HDU 1495 非常可乐 最简单的的解决方案
- Performing Push Install adb: error: failed to get feature set: more than one 解决方案
- Shell Style Guide
- 10分钟搞定OAuth2.0授权服务
- IP 地址大解密
- 曾经,我以为我很懂MySQL索引
- AES加解密工具类AESUtil记录
- iOS逆向之使用unc0ver越狱 iOS13.5
- Spring @Autowired npe example:Why your Spring @Autowired component is null
- Spring JPA 查询创建
- 『Python动手学』Python处理.mat文件
- Swift 打开三方地图 腾讯地图、百度地图、高德地图、Apple 地图
- 初学者应该看的JavaScript Promise 完整指南
- React Advanced Topics
- try catch引发的性能优化深度思考