【发布时间】:2020-01-20 04:13:46
【问题描述】:
java compiler在优化时有没有可能在java中忽略if statement?
我们有两个环境 [A 和 B 相同],并且在两个环境中部署了相同的代码。 该代码有一种方法,其代码如下:
private LocaleCodeValue getDefaultLocaleCodeValue(String code) {
String value = code;
if (code.contains("_")) value = code.substring(0, code.lastIndexOf("_"));
return new LocaleCodeValue(code, value);
}
这应该适用于两种环境。
但是,在环境 B 上,有时会忽略 if 语句并在条件为真时直接返回对象。为了调试,我们执行了将导致条件为真的操作。它适用于anv A,但不适用于B(有时)。但我们 100 % 确定条件始终为真。 经过多天的调试,我们得出一个结论,即 JIT 编译器可能正在优化代码并可能忽略 if 语句。
所以我们把代码改成下面这样:
private LocaleCodeValue getDefaultLocaleCodeValue(String code) {
String value = code;
if (code.contains("_")) {
value = code.substring(0, code.lastIndexOf("_"));
return new LocaleCodeValue(code, value);
}
return new LocaleCodeValue(code, value);
}
现在代码按预期工作了。
我同意这个问题很难重现,但是我很好奇有人遇到过这样的问题吗?或者有没有可能是java编译器搞砸了这个?
Java Image : image: openjdk:10-jdk-slim
【问题讨论】:
-
可能会抛出异常
-
要么你的假设是错误的,并且在环境 B 上,当你认为它是,条件是 not true,或者你在编译器中发现了一个错误。这两个实现应该是 100% 等效的。鉴于在广泛部署的应用程序中发现这么大的错误似乎有些牵强,我想问题只是当您期望它为真时条件为假。如果您需要更多帮助,请提供我们可以实际运行和测试的示例代码。
-
我们无法根据您显示的内容进行猜测。显示实际代码,包括其上下文(在 try 块中?)。条件可能会引发异常,如果返回位于 finally 块中或异常被忽略,则可能会发生这种情况。
-
嗯,可能在某些情况下可能会发生这种情况(至少因为 JIT 是一个可能包含错误的软件),但我首先要寻找一个我的方程式中的错误。您能否详细说明您实际在做什么(最好是minimal reproducible example)以及您正在使用的确切 Jave 版本?
-
@GiacomoAlzetta 我同意你的观点,但我们 100% 确定条件始终正确。我们调试了将近 5 天。请相信。
标签: java compiler-optimization jit