I.起因
生产环境发现公共代码中日志打印只有,没有详细的堆栈信息。
java.lang.NullPointerException
正常情况1.8 -XX:+OmitStackTraceInFastThrow 默认已开启,会优化掉相同异常栈信息。
II.问题
以下代码本地无法复现该异常:
List<String> list = new ArrayList();
for (int j = 0; j < 11000; j++) {
try {
list.get(-1);
} catch (Exception ex) {
int length = ex.getStackTrace().length;
System.out.println(String.format("报错异常 :: %s, 堆栈长度 :: %s %s", ex, length,j));
}
}
启动参数
"D:\Program Files (x86)\Java\jdk1.8.0_144\bin\java.exe" -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\AppData\Local\Temp\classpath71073870.jar com.ding.study.util.TestMain
III.问题排查
查看hotspot相关代码
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/tip/src/share/vm/opto/graphKit.cpp
只有 ProfileTraps=true 才会执行热代码等判断。
本机默认使用client模式,ProfileTraps 在c1模式下 默认是false,所以不会触发.
IV.问题解决
Idea 启动增加配置
Modify options >add VM options > 增加 -server
总结:
client模式下 默认并未开启OmitStackTraceInFastThrow
开启
-XX:+OmitStackTraceInFastThrow
关闭
-XX:-OmitStackTraceInFastThrow
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/tip/src/share/vm/opto/graphKit.cpp