宁夏网站设计,万宁网站建设公司,永久免费crm软件哪个好,巢湖seo推广选哪家前言#xff1a; 前一阵子#xff0c;在公司排查线上问题发现#xff1a;出问题的方法报空指针异常#xff0c;但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理#xff0c;但是经过翻阅代码发现不是。最后一番查找资料#xff0c;这种现象是JVM的一种优化机…前言 前一阵子在公司排查线上问题发现出问题的方法报空指针异常但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理但是经过翻阅代码发现不是。最后一番查找资料这种现象是JVM的一种优化机制叫做FastThrow机制。
正文
1. FastThrow机制概念 JVM会对一些特定类型异常做了Fast Throw优化Fast Throw机制如果检测到在代码里某个位置连续多次抛出同一类型异常直接抛出一个事先分配好的、类型匹配的异常对象即没有原始的堆栈信息和Message。Fast Throw机制可以节省内存减少日志打印但是对问题排查增加难度。 JVM只对几个特定类型异常开启了Fast Throw优化这些异常包括
NullPointerExceptionArithmeticExceptionArrayIndexOutOfBoundsExceptionArrayStoreExceptionClassCastException
2. FastThrow机制实验 使用开发工具运行如下代码在循环执行7000多次后会触发FastThrow机制。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 〈一句话功能简述〉br* 〈验证JVM Fast机制〉* p* -XX:-OmitStackTraceInFastThrow** author hanxiaozhang* create 2023/5/5* since 1.0.0*/
public class No3JvmOmitStackTraceInFastThrow {public static void main(String[] args) throws Exception {FastThrowThread npeThread new FastThrowThread();ExecutorService executorService Executors.newFixedThreadPool(20);for (int i 0; i Integer.MAX_VALUE; i) {executorService.execute(npeThread);// 稍微sleep一下Thread.sleep(2);}}
}class FastThrowThread extends Thread {private static int count 0;Overridepublic void run() {try {System.out.println(this.getClass().getSimpleName() -- (count));String str null;System.out.println(str.length());} catch (Throwable e) {e.printStackTrace();}}
} 出现FastThrow机制打印日志截图 3. 关闭FastThrow机制 在JVM启动参照中添加 -XX:-OmitStackTraceInFastThrow参数就可以关闭FastThrow机制的优化。
4. 拓展查看JVM是否默认关闭FastThrow机制
4.1 查看JVM默认参数命令 -XX:PrintFlagsInitial命令侧重于查询修改是JVM默认加载的参数有冒号 表示人为修改之后的参数。 java -X:PrintFlagsInitial -version | grep OmitStackTraceInFastThrow 被修改的参数