JVM中8种垃圾收集器小结

和自甴很熟 提交于 2020-12-10 19:24:20

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&lt;&gt;();,也即是后面一个尖括号内的类型,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)
    7.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

</user></user></user>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!