gpt4 book ai didi

在运行时删除 Java 常量池

转载 作者:行者123 更新时间:2023-11-30 08:02:33 25 4
gpt4 key购买 nike

我有以下 Java 类:

public class Test {

public static void main(String[] args) {
if (false) {
log("String_to_be_never_printed_1");
}

if (isPrintable()) {
log("String_to_be_never_printed_2");
}

}

private static boolean isPrintable() {
return false;
}

private static void log(String s) {
System.out.println(s);
}

}

在两个 if 语句中,结果都将为 false。当我输出这个类的常量池表时,我得到:

Constant pool:
#1 = Class #2 // Test
#2 = Utf8 Test
....
#18 = Utf8 isPrintable
#19 = Utf8 ()Z
#20 = String #21 // String_to_be_never_printed_2
#21 = Utf8 String_to_be_never_printed_2
#22 = Methodref #1.#23 // Test.log:(Ljava/lang/String;)V
#23 = NameAndType #24:#25 // log:(Ljava/lang/String;)V
...

String_to_be_never_printed_2 存在(#20),而 String_to_be_never_printed_1 无处可见。这是预期的,因为编译器优化了第一个 if 语句。

我的问题是 VM 是否会设法从常量池中删除 String_to_be_never_printed_2(因为它永远不会被使用)?

最佳答案

什么都不会从常量池中删除。无论如何,这样做没有任何意义,因为删除不会对实际内存大小产生影响

关于在运行时删除 Java 常量池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com