降低Java垃圾回收开销的5条建议_科技频道_东方头条

发布日期:2019-11-02 00:49   来源:未知   阅读:

随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器。从 serial 垃圾回收器到CMS 收集器, JVM 见证了许多 GC 实现,而 G1 将成为其下一代垃圾回收器。

随着垃圾收集器的发展,每一代 GC 与其上一代相比,都带来了巨大的进步和改善。parallel GC 与 serial GC 相比,它让垃圾收集器以多线程的方式工作,充分利用了多核计算机的计算能力。CMS(“Concurrent Mark-Sweep”)收集器与 parallel GC 相比,它将回收过程分成了多个阶段,使得应用线程正在运行的时候,收集工作可以并发地完成,大大改善了频繁执行 “stop-the-world” 的情况。G1 对于拥有大量堆内存的 JVM 表现出更好的性能,并且具有更好的可预测和统一的暂停过程。

让我们将下面的代码作为一个简单的例子分析一下:

保持GC低开销的窍门有哪些?

所有标准的 Java 集合,包括定制和扩展的实现(比如 Trove 和 Google 的 Guava),底层都使用了数组(原生数据类型或者基于对象的类型)。因为数组一旦被分配,其大小就不可变,因此添加元素到集合时,大多数情况下都会导致需要重新申请一个新的大容量数组替换老的数组(指集合底层实现使用的数组)。

这个处理方式可能会付出惨重的性能代价,其优化的点在添加元素到新的 list 中这行代码。 随着每一次添加元素,list 都需要确保其底层数组拥有足够的位置来容纳新的元素。如果有空闲的位置,那么只是简单地将新元素存储到下一个空闲的槽位。如果没有的话,将分配一个新的底层数组,拷贝旧的数组内容到新的数组中,然后添加新的元素。这将导致多次分配数组,那些剩余的旧数组最终被 GC 所回收。

即使没有提供集合初始化的大小,大多数集合的实现都尽量优化重新分配数组的处理并且将其开销平摊到最低。不过,在构造集合的时候就提供大小可以得到最佳的效果。

1: 预测集合的容量

这个方法分配了一个新的数组,然后用另一个 list 中元素对该数组进行填充,只是元素的数序发生了变化。

上一篇:“世界上最年长的女人”:不吃肉,爱喝酸奶_国际频道_东方头条
下一篇:没有了
网站首页 | 香港35图库最快报码 | 02211心水 | 香港马会一字拆一肖 | 新曾道内部玄机图 | 2019年青蛙系列图库

Power by DedeCms