JVM的FastThrow优化机制

前言:

        前一阵子,在公司排查线上问题发现:出问题的方法报空指针异常,但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理,但是经过翻阅代码发现不是。最后一番查找资料,这种现象是JVM的一种优化机制,叫做FastThrow机制。

正文:

1. FastThrow机制概念:

         JVM会对一些特定类型异常做了Fast Throw优化(Fast Throw机制),如果检测到,在代码里某个位置连续多次抛出同一类型异常,直接抛出一个事先分配好的、类型匹配的异常对象,即没有原始的堆栈信息和Message。Fast Throw机制可以节省内存,减少日志打印,但是对问题排查增加难度。

        JVM只对几个特定类型异常开启了Fast Throw优化,这些异常包括:

  • NullPointerException
  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException

2. FastThrow机制实验:

        使用开发工具运行如下代码,在循环执行7000多次后,会触发FastThrow机制。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 〈一句话功能简述〉
* 〈验证JVM Fast机制〉 *

* -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; @Override public void run() { try { System.out.println(this.getClass().getSimpleName() + "--" + (++count)); String str = null; System.out.println(str.length()); } catch (Throwable e) { e.printStackTrace(); } } }

        出现FastThrow机制打印日志截图:JVM的FastThrow优化机制_第1张图片

 3. 关闭FastThrow机制:

        在JVM启动参照中:添加 -XX:-OmitStackTraceInFastThrow参数,就可以关闭FastThrow机制的优化。

4. 拓展,查看JVM是否默认关闭FastThrow机制:

4.1 查看JVM默认参数命令:

        -XX:+PrintFlagsInitial命令侧重于查询修改,"="是JVM默认加载的参数,有冒号:= 表示人为修改之后的参数。

 java -X:+PrintFlagsInitial -version | grep OmitStackTraceInFastThrow

        被修改的参数:

你可能感兴趣的:(jvm)