Java 9将使您的应用程序运行得更快吗?


Java 9附带了一些有关如何处理字符串的增强功能,有望改善应用程序的性能。

存储字符串 如果检查Java应用程序正在使用的内存,则很可能会注意到String对象分配了大量的堆。

直到Java 8,每个String在内部都表示为char [](这是一个char数组)。

字符数据类型是单Unicode字符,占用2个字节的存储器。它的最小值为'\ u0000'(= 0),最大值为'\ uffff'(= 65535)。

06-java9-linkedin-article.png

当我们存储Unicode字符时,例如希腊字符' α'(= '\ u03b1'),那么我们实际上是在利用分配给该char的两个字节。

但是,当我们存储拉丁字符(例如' a '(= '\ u0061')时,分配给该char的第一个字节将填充零,因此实际上未被使用。

如果Java不为每个拉丁字符分配2个字节,而是仅分配1个字节,那不是很好吗?

在Java 9中,已将String类更改为将字符存储在byte []中(而不是char [])。String的基础数据结构中的这一更改允许对内存进行细粒度的分配,具体取决于字符的类型:

  • 与以前一样,对于包含Unicode字符的字符串,将为每个字符分配2个字节。

  • 对于仅包含拉丁字符的字符串,将为每个字符分配1个字节,因此与Java的早期版本相比节省了内存。

连接字符串 直到Java 8,Java编译器都可以识别源代码中的任何String串联,并将它们转换为StringBuilder :: append的链。

在Java 9中,每个String串联都转换为对invokedynamic的调用,如JDK增强建议280中所述。

Java 9中提供了几种String串联策略,每种策略都采用不同的技术来计算结果/串联String的大小。MH_INLINE_SIZED_EXACT是其性能突出的策略之一,它利用私有Java API来执行String串联。

性能改进 该分配率是在Java应用程序的关键性能指标; 它是每个时间单位分配的内存量,通常以MB / sec为单位。

由于Java 9中String对象的内存占用减少,因此您的应用程序的分配率有望降低;这意味着将不经常调用垃圾收集器来清理内存。鉴于垃圾收集器在清理内存时暂停了您的应用程序,您可能会遇到频率降低和/或应用程序暂停时间减少的情况。因此,假定您的应用程序在Java 9中将具有较高的吞吐量和较低的延迟。

如前所述这里,“尺寸和性能的提升高达10%”已经在Java 9几种应用测量。

您的应用程序与Java 9一起运行的速度将提高多少?只有一种方法可以找到:下载Java 9,并评估应用程序的性能!


原文链接:http://codingdict.com