专栏首页JVMGCJVM中8种垃圾收集器小结
原创

JVM中8种垃圾收集器小结

JVM中8种垃圾收集器小结

JDK 发展历史

JAVA 1.0,代号Oak橡树)

于 1996-01-23 发行

JAVA 1.1

1997-02-19 发行, 主要更新内容:

  1. 引入 JDBC
  2. 添加内部类支持
  3. 引入 JAVA BEAN
  4. 引入 RMI
  5. 引入反射

JAVA 1.2, 代号 Playground(操场)

1998-12-8 发行,主要更新内容:

  1. 引入集合框架
  2. 对字符串常量做内存映射
  3. 引入 JIT(Just In Time)编译器
  4. 引入打包文件数字签名
  5. 引入控制授权访问系统资源策略工具
  6. 引入 JFC(Java Foundation Classes),包括 Swing1.0,拖放和 Java2D 类库
  7. 引入 Java 插件
  8. JDBC 中引入可滚动结果集,BLOB,CLOB, 批量更新和用户自定义类型
  9. Applet 中添加声音支持

JAVA1.3,代号 Kestrel(红隼)

2000-5-8 发布,主要更新内容:

  1. 引入 Java Sound API
  2. 引入 jar 文件索引
  3. 对 Java 各方面多了大量优化和增强
  4. Java Platform Debugger Architecture 用于 Java 调式的平台。

JAVA 1.4,代号 Merlin(隼)

2004-2-6 发布(首次在 JCP 下发行),主要更新内容:

  1. 添加 XML 处理
  2. 添加 Java 打印服务(Java Print Service API)
  3. 引入 Logging API
  4. 引入 Java Web Start
  5. 引入 JDBC 3.0 API
  6. 引入断言
  7. 引入 Preferences API
  8. 引入链式异常处理
  9. 支持 IPV6
  10. 支持正则表达式
  11. 引入 Image I/O API
  12. NIO,非阻塞的 IO,优化 Java 的 IO 读取。

JAVA 5.0,代号 Tiger(老虎),有重大改动

2004-9-30 发布,主要更新内容:

  1. 引入泛型
  2. For-Each 循环 增强循环,可使用迭代方式
  3. 自动装箱与自动拆箱
  4. 引入类型安全的枚举
  5. 引入可变参数
  6. 添加静态引入
  7. 引入注解
  8. 引入 Instrumentation
  9. 提供了 java.util.concurrent 并发包。

JAVA6,代号 Mustang(野马)

2006-12-11 发布,主要更新内容:

  1. 引入了一个支持脚本引擎的新框架(基于 Mozilla Rhino 的 JavaScript 脚本引擎)
  2. UI 的增强
  3. 对 WebService 支持的增强(JAX-WS2.0 和 JAXB2.0)
  4. 引入 JDBC4.0API
  5. 引入 Java Compiler API
  6. 通用的 Annotations 支持

JAVA7,代号 Dolphin(海豚)

2011-07-28 发布,这是 sun 被 oracle 收购(2009 年 4 月)后的第一个版本,主要更新内容:

  1. switch 语句块中允许以字符串作为分支条件
  2. 在创建泛型对象时应用类型推断, 比如你之前版本使用泛型类型时这样写 ArrayList<User> userList= new ArrayList<User>();,这个版本只需要这样写 ArrayList<User> userList= new ArrayList<>();,也即是后面一个尖括号内的类型,JVM 帮我们自动类型判断补全了。
  3. 在一个语句块中捕获多种异常
  4. 添加 try-with-resources 语法支持,使用文件操作后不用再显示执行 close 了。
  5. 支持动态语言
  6. JSR203, NIO.2,AIO, 新 I/O 文件系统,增加多重文件的支持、文件原始数据和符号链接, 支持 ZIP 文件操作
  7. JDBC 规范版本升级为 JDBC4.1
  8. 引入 Fork/Join 框架,用于并行执行任务
  9. 支持带下划线的数值,如 int a = 100000000;,0 太多不便于人阅读,这个版本支持这样写 int a = 100_000_000,这样就对数值一目了然了。
  10. Swing 组件增强(JLayer,Nimbus Look Feel…)参考

JAVA8

2014-3-19 发布,oracle 原计划 2013 年发布,由于安全性问题两次跳票,是自 JAVA5 以来最具革命性的版本,主要更新内容:

  1. 接口改进,接口居然可以定义默认方法实现和静态方法了。
  2. 引入函数式接口
  3. 引入 Lambda 表达式
  4. 引入全新的 Stream API,提供了对值流进行函数式操作。
  5. 引入新的 Date-Time API
  6. 引入新的 JavaScrpit 引擎 Nashorn
  7. 引入 Base64 类库
  8. 引入并发数组(parallel)
  9. 添加新的 Java 工具:jjs、jdeps
  10. JavaFX,一种用在桌面开发领域的技术
  11. 静态链接 JNI 程序库

JAVA9

2017-9-21 发布

  1. 模块化(jiqsaw)
  2. 交互式命令行(JShell)
  3. 默认垃圾回收期切换为 G1
  4. 进程操作改进
  5. 竞争锁性能优化
  6. 分段代码缓存
  7. 优化字符串占用空间

JAVA10

2018-3-21 发布

1.JEP286,var 局部变量类型推断。

2.JEP296,将原来用 Mercurial 管理的众多 JDK 仓库代码,合并到一个仓库中,简化开发和管理过程。

3.JEP304,统一的垃圾回收接口。

4.JEP307,G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。

5.JEP310,应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。

6.JEP312,ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。

7.JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。

8.JEP314,使用附加的 Unicode 语言标记扩展。

9.JEP317,能将堆内存占用分配给用户指定的备用内存设备。

10.JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。

11.JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。

12.JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为 \$FEATURE.\$INTERIM.\$UPDATE.\$PATCH,分别是大版本,中间版本,升级包和补丁版本。

Java 11

2018-9-25 发布

官网公开的 17 个 JEP(JDK Enhancement Proposal 特性增强提议):

  1. JEP181: Nest-Based Access Control(基于嵌套的访问控制)
  2. JEP309: Dynamic Class-File Constants(动态的类文件常量)
  3. JEP315: Improve Aarch64 Intrinsics(改进 Aarch64 Intrinsics)
  4. JEP318: Epsilon: A No-Op Garbage Collector(Epsilon 垃圾回收器,又被称为”No-Op(无操作)” 回收器)
  5. JEP320: Remove the Java EE and CORBA Modules(移除 Java EE 和 CORBA 模块,JavaFX 也已被移除)
  6. JEP321: HTTP Client (Standard)undefined7.JEP323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数的局部变量语法)
  7. JEP324: Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法实现的密钥协议)
  8. JEP327: Unicode 10
  9. JEP328: Flight Recorder(飞行记录仪)
  10. JEP329: ChaCha20 and Poly1305 Cryptographic Algorithms(实现 ChaCha20 和 Poly1305 加密算法)
  11. JEP330: Launch Single-File Source-Code Programs(启动单个 Java 源代码文件的程序)
  12. JEP331: Low-Overhead Heap Profiling(低开销的堆分配采样方法)
  13. JEP332: Transport Layer Security (TLS) 1.3(对 TLS 1.3 的支持)
  14. JEP333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)(ZGC:可伸缩的低延迟垃圾回收器,处于实验性阶段)
  15. JEP335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)
  16. JEP336: Deprecate the Pack200 Tools and API(弃用 Pack200 工具及其 API)

垃圾器收集器总结

Serial

  • 串行
  • 新生代
  • 复制算法
  • 响应速度优先
  • 单CPU环境下的Client模式

Serial Old

  • 串行
  • 老年代
  • 标记-整理
  • 响应速度优先
  • 单CPU环境下的Client模式、CMS的后备预案

ParNew

  • 并行
  • 新生代
  • 复制算法
  • 响应速度优先
  • 多CPU环境时在Server模式下与CMS配合

Parallel Scavenge

  • 并行
  • 新生代
  • 复制算法
  • 吞吐量优先
  • 在后台运算而不需要太多交互的任务

Parallel Old

  • 并行
  • 老年代
  • 标记-整理
  • 吞吐量优先
  • 在后台运算而不需要太多交互的任务

CMS

  • 并发
  • 老年代
  • 标记-清除
  • 响应速度优先
  • 集中在互联网站或B/S系统服务端上的Java应用

G1

  • 并发
  • both
  • 标记-整理+复制算法
  • 响应速度优先
  • 面向服务端应用,将来替换CMS
wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM 七种垃圾收集器

    下图展示的是 7 种作用于不同分代的收集器,如果两种收集器之前有连接,表示它们可以配合使用。收集器所在的位置表示它是属于新生代收集器还是老年代收集器。

    用户3596197
  • JVM垃圾收集器总结

    1、是一个单线程的收集器,“Stop The World” 2、对于运行在Client模式下的虚拟机来说是一个很好的选择 4、简单而高效

    神秘的寇先森
  • JVM中的垃圾收集器

      前面介绍的收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。这里讨论的是JDK1.7 Update14之后的HotSpot虚拟机。该虚...

    用户4919348
  • JVM之垃圾回收-垃圾收集器

    如果说前面介绍的收集算法(JVM之垃圾回收-垃圾收集算法)是内存回收的抽象策略,那么垃圾收集器就是内存回收的具体实现。

    谙忆
  • JVM-垃圾收集器

    本篇主要介绍一下JVM的几种垃圾收集器。其示意图如下所示,上面的三个是新生代的收集器, 下面三个是老年代的收集器,其中G1收集器是可以用于新生代和老年代的收集工...

    小小科
  • JVM 垃圾收集器

    GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现。

    万能青年
  • JVM 垃圾收集器

    本文“垃圾收集器”节选自《深入理解Java虚拟机:JVM高级特性与最佳实践》【作者:周志明】

    smartsi
  • JVM:垃圾收集器

    如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同厂商、不同版本的...

    HLee
  • JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】

    缺点: 当Serial收集器想进行垃圾回收的时候,必须暂停用户的所有进程,即stop the world。

    小小工匠
  • JVM(HotSpot) 垃圾收集器

    java404
  • JVM之垃圾收集器

    前言: 前面已经讨论过jvm内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生随着线程而灭,而java堆和方法区则不一样,一...

    shengjk1
  • JVM之垃圾收集器

    因为新生代和老年代采用回收算法的不同,垃圾收集器相应地也分为新生代收集器和老年代收集器。其中新生代收集器主要有Serial收集器、ParNew收集器和Paral...

    黑洞代码
  • HotSpot JVM 垃圾收集器

    7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用。

    java乐园
  • JVM中垃圾收集算法总结

      通过前面的介绍我们了解了对象创建和销毁的过程。那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法。

    用户4919348
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

      按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远...

    哲洛不闹
  • jvm -垃圾收集算法与经典垃圾收集器

    标记清除算法,首先对需要收集的对进行标记,或者对不需要回收的对象进行标记,然后统一回收掉被标记的对象。

    猎户星座1
  • JVM笔记-垃圾收集算法与垃圾收集器

    引用计数法(Reference Counting):为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。当有地方引用它时,计数器加一;引用失效时减一。当...

    WriteOnRead
  • JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】

    JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】探讨了如何判定堆内存中的对象是否已经死亡,这里我们来继续讨论下JVM中常用的垃圾...

    小小工匠
  • 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用...

    程序员追风

扫码关注云+社区

领取腾讯云代金券