旧的编译代码是否受益于最新 jre 上的紧凑字符串?
Does old compiled code have benefits from compact strings on latest jre?
假设我有一些由以前版本的编译器编译的旧代码。它会从改进中受益 String
class 更少的内存消耗还是我需要用最新的 jdk 重新编译它?
是,旧字节码将受益于压缩字符串优化而无需重新编译。这是因为它是对 String class 本身的实现的更改。字节码格式仍然相当高级,并且抽象出字符串、对象等的实际实现。
但是,还有另一个更改 (JEP280) 确实需要重新编译才能从中受益。在 Java 的早期版本中,非常量字符串连接在后台被编译为对 StringBuilder(或 StringBuffer)的一系列调用。所以像 "I have " + i + " cats"
这样的代码将等同于 new StringBuilder().append("I have ").append(i).append(" cats").toString()
。 JEP280 将此更改为将连接编译为 invokedynamic 指令,这实质上将字符串连接的实现移动到运行时选择的库中。这本身并不是优化,但它允许在将来添加更有效的字符串连接而无需重新编译。
假设我有一些由以前版本的编译器编译的旧代码。它会从改进中受益 String
class 更少的内存消耗还是我需要用最新的 jdk 重新编译它?
是,旧字节码将受益于压缩字符串优化而无需重新编译。这是因为它是对 String class 本身的实现的更改。字节码格式仍然相当高级,并且抽象出字符串、对象等的实际实现。
但是,还有另一个更改 (JEP280) 确实需要重新编译才能从中受益。在 Java 的早期版本中,非常量字符串连接在后台被编译为对 StringBuilder(或 StringBuffer)的一系列调用。所以像 "I have " + i + " cats"
这样的代码将等同于 new StringBuilder().append("I have ").append(i).append(" cats").toString()
。 JEP280 将此更改为将连接编译为 invokedynamic 指令,这实质上将字符串连接的实现移动到运行时选择的库中。这本身并不是优化,但它允许在将来添加更有效的字符串连接而无需重新编译。