怎么样宣传自己的网站,网络服务类型及协议,做网站整理信息的表格,网站开发的常见编程语言有哪些本文从几种JVM垃圾回收方式及原理出发#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响#xff0c;并通过最终测试数据对比#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录
1 引言
2 垃圾回收算法
2.1 标记清除法
2.2… 本文从几种JVM垃圾回收方式及原理出发研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响并通过最终测试数据对比给出了不同应用场景下如何选择垃圾回收策略的方法。 目录
1 引言
2 垃圾回收算法
2.1 标记清除法
2.2 复制算法
2.3 标记压缩法
2.4 分区算法 1 引言
垃圾回收Garbage Collection, GC是 Java 虚拟机JVM中 使用的一种内存管理方案它能够不断自动释放内存中的不再被使用的对象并按照特定的垃圾回收算法实现对于内存资源的管理。相较于 C/C 手动内存管理方式GC 的出现大大减少了开发人 员在内存资源管理方面的工作是 JVM 的核心组成部分并且对 JVM 的性能有着重要的影响。随着技术及硬件的发展新的垃圾回收方式也在随着 JDK 版 本的更新而被加入如在 JDK1.7 中正式引入了 G1 回收器JDK 11 中引入了 Z 回收器等。面对如此多的垃圾回收器如何在不同实际应用场景下中选择最适合的是进行JVM性能优化的首要问题解决这一问题则必须先了解不同垃圾回收方式的性能表现。以往也有相关方面的研究但性能测试或基于 SPEC JVM2008又或是基 于 SPEC jbb2000[3-4] 等一些现已不再提供支持的测试工具已不能适应当前时代的需求而通过一种权威且最新的基准测试工具分析不同垃圾回收器的性能表现是十分有意义的。SPEC jbbJava Business Benchmark基准测试是标准性能评估组织 SPEC 发布的一项用于衡量服务器 Java 应用性能的测试基准。从 2000 年 6 月 SPEC 组织发布第一版服务器 Java 性能测试基准 SPEC jbb2000 至今历经了 SPEC jbb20052006.1-2013.10、 SPEC jbb20132013.1-2014.12多个版本的更新后SPEC jbb2015 2015.9- 至今基于最新的 Java 应用程序特性开发支持虚拟化和云环境。现在 SPEC jbb 测试已经发展成为 JVM 厂商、Java 开发者研究学者以及相关学术机构评估 Java 业务应用性能及可扩展性的一项权威基准测试标准。 本文将首先从垃圾回收原理出发分别介绍几种垃圾回收器 然后对这几种垃圾回收器在基准测试中的性能表现进行分析。
2 垃圾回收算法
Java 自动化的管理内存资源必须通过垃圾回收算法来确定哪些是有效的对象哪些是无效的对象对于无效的对象就要进行垃圾回收处理。作为垃圾回收器的实现基础下面先介绍常见的垃圾回收算法。
2.1 标记清除法
在垃圾回收算法中根是指向对象的指针的起点部分。通过根对象进行引用搜索最终可达的对象被称为可达对象通过根对象进行引用搜索最终没有被引用的对象被称为不可达对象。在标记阶段首先通从根节点开始标记所有的可达对象不可达对象则为垃圾对象。在清除阶段清除所有未被标记的对象。由于清除时不考虑内存空间的连续性因此标记清除法最大的问题是产生内存空 间碎片。特别是在进行大对象内存分配时相较于连续内存空间内存碎片的存在会降低堆内存效率。 2.2 复制算法
复制算法将内存空间划分为相等的两部分且每次只会只使用其中的一部分当垃圾回收时首先将使用中那部分内存里存活的对象复制到另一部分内存区接着清除使用的内存块中的所有对象 最后将两个内存区进行互换从而完成垃圾回收。复制算法在复制的过程中能够有效避免内存空间碎片的产生但代价是系统内存空间损失一半。
2.3 标记压缩法
标记压缩法是一种针对老年代的垃圾回收算法。对于老年代由于大部分对象都是存活对象使用复制算法代价将使内存折半成本太高并不适用。标记压缩法正是为了应对这种情况而产生首 先从根节点开始对所有可达对象进行标记然后将所有存活的对象压缩到内存一端再清理剩余的所有的空间。这种方法既避免了碎片的产生又不需要将内存分为两半效率很高。
2.4 分区算法
分区算法将整个堆空间划分成连续的不同小区间每一小区间都独立使用独立回收并可以控制一次回收的小区间数量。一般来说在相同条件下堆空间越大进行一次垃圾回收的所需的时 间就越长导致产生的停顿时间也越长。因此如果将堆内存分割成多个小块并根据目标停顿时间的要求每次合理地控制回收部分小区间而不是回收整个堆空间则可以有效减小一次垃圾回收所产生的的停顿时间。