今天在线上环境遇到这个事情,log日志只记录空指针,其他任务堆栈信息,都没有。对于排查问题,简直是毁灭性。不过还是要感谢万能的互联网,这个问题,不止我一个出现。所以通过各种搜索终于找到了的原因。
线上情况如下:
原因:
在java 1.5的release notes里面可以看到这样一句话:
The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
大概意思是:
服务器JVM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当这样的异常被抛出几次时,可以重新编译方法。在重新编译之后,编译器可能会选择一个更快的策略,使用不提供堆栈跟踪的预分配异常。要完全禁用预分配异常的使用,请使用这个新标志:-XX:-OmitStackTraceInFastThrow。(记住这一点)
不过这种情况,目前只有在 java -server -XX:+OmitStackTraceInFastThrow 你的jar包。 时出现。
例如我的启动命令是:
# 启动参数
nohup java \
-server -Xmn1024m -Xms6144m -Xmx6144m -XX:PermSize=128m -XX:MaxPermSize=1024m \
-XX:ParallelGCThreads=16 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=2 -XX:+UseCMSCompactAtFullCollection \
-XX:CMSFullGCsBeforeCompaction=5 -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy \
-Djava.rmi.server.hostname=47.93.199.93 \
-Dcom.sun.management.jmxremote.port=10002 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-cp dsp-server-1.0-SNAPSHOT.jar cn.shuzilm.interf.rtb.RtbServer \
>/dev/null 2>&1 &
默认是开启 OmitStackTraceInFastThrow 模式的。
解决方案:
# 启动参数
nohup java \
-server -Xmn1024m -Xms6144m -Xmx6144m -XX:PermSize=128m -XX:MaxPermSize=1024m \
-XX:ParallelGCThreads=16 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=2我去: -XX:+UseCMSCompactAtFullCollection -XX:-OmitStackTraceInFastThrow \
-XX:CMSFullGCsBeforeCompaction=5 -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy \
-Djava.rmi.server.hostname=47.93.199.93 \
-Dcom.sun.management.jmxremote.port=10002 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-cp dsp-server-1.0-SNAPSHOT.jar cn.shuzilm.interf.rtb.RtbServer \
>/dev/null 2>&1 &
jvm调试选项:
参考网址:https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#Options