JDK 1.8 中 HotSpot JVM 与 JDK 1.6 的主要区别:
- 元空间(Metaspace):JDK 1.8 引入了元空间来取代了永久代(PermGen)。在 JDK 1.6 中,字符串常量、类的静态变量等存放在永久代中,而在 JDK 1.8 中,这些数据被转移到了本地内存中的元空间,这有助于提高内存利用率和垃圾回收性能。
- 垃圾收集器的改进:JDK 1.8 对垃圾收集器进行了优化,引入了新的垃圾收集算法,比如 G1 收集器的优化,以及 Shenandoah GC 的新增。
- 性能提升:JDK 1.8 在性能上进行了提升,例如通过优化 JIT 编译器和内存管理,提高了应用性能。
- 新的API和语言特性:JDK 1.8 引入了许多新的API和语言特性,如 Lambda 表达式、Stream API 等,这些在 JDK 1.6 中不可用。
- 内部结构改变:JDK 1.8 的 HotSpot JVM 进行了一些内部结构的调整,比如合并了本地方法栈和虚拟机栈。
- 对动态类加载的改进:JDK 1.8 改进了动态类加载机制,允许在运行时动态生成和加载类,而不需要像 JDK 1.6 那样频繁地进行 Full GC。
- 对 Nashorn JavaScript 引擎的支持:虽然 JDK 11 中移除了 Nashorn 引擎,但在 JDK 1.8 中它是可用的,而在 JDK 1.6 中不可用5。
G1垃圾回收器相比之前的垃圾回收器有以下优化:
- 分区算法:G1使用基于Region的内存布局方式,将整个堆内存划分为多个固定大小的Region,每个Region可以独立地扮演Eden、Survivor或Old区的角色。
- 可控的停顿时间:G1可以设置一个期望的停顿时间,并在该时间内完成垃圾回收,这通过维护一个优先级列表来实现,优先回收那些能在给定时间内带来最大收益的Region。
- 并发执行:G1的垃圾回收线程和用户线程可以并发执行,减少了垃圾回收对应用性能的影响。它使用原始快照算法(SATB)来保证垃圾回收线程与用户线程的互不干扰。
- 减少内存碎片:G1在回收过程中不会产生内存碎片,这与一些其他垃圾回收器相比是一个显著的优点。
- 写屏障技术:G1使用写屏障技术来维护记忆集,允许在执行涉及引用关系建立的代码时,更新卡表的状态,确保卡表能够准确反映对象之间的跨代引用关系。
- 避免全局停顿:G1通过避免传统的全局GC停顿,实现了更加细粒度的控制和优化,减少了GC造成的全局停顿时间。(减少了stop the world的情况)
- 性能记录与优化:G1在执行Young GC过程中,会记录每次回收时每个Eden区和Survivor区的详细耗时数据,这些数据为下次回收提供了参考,帮助G1更精确地计算出在给定的最大暂停时间内可以回收的Region数量。
- 混合回收:G1的混合回收(Mixed GC)可以处理所有年轻代和部分老年代的对象以及大对象区,采用复制算法来完成,确保高效的内存回收。
- 参数调优:G1提供了多个参数供开发者进行调优,如
G1HeapRegionSize
、G1NewSizePercent
、G1MaxPauseMillis
等,使得开发者可以根据应用的具体需求和硬件环境进行细致的优化。 - 避免内存占用过高:G1相较于CMS,其内存占用和程序运行时的额外执行负载较高,但是通过合理的参数调优,可以在大内存应用上发挥优势。
1.6的情况:


垃圾回收算法
无论哪一种垃圾收集器, 都会stop the world。只是停顿时间长短区别

1.6 比较著名的是CMS; 1.8以后都是G1。
发表回复