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机制。

java 复制代码
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;

    @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机制打印日志截图:

3. 关闭FastThrow机制:

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

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

4.1 查看JVM默认参数命令:

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

java 复制代码
 java -X:+PrintFlagsInitial -version | grep OmitStackTraceInFastThrow

被修改的参数:

相关推荐
袋鼠云数栈1 小时前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle
Mr. zhihao5 小时前
JVM 偏向锁 4 秒延迟:从源码动机到 JEP-374 废弃全链路
jvm·并发·偏向锁
孙克旭_5 小时前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx5 小时前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
恒拓高科WorkPlus7 小时前
企业如何搭建安全内部通讯平台|企业内部通讯平台怎么选才更安全?
jvm·数据库·安全
随遇而安zx9 小时前
【地基篇】---JVM 类加载 源码解析(基于 Java 8)
java·jvm·python
ly76891 天前
JVM 类加载机制:打破双亲委派模型的实践与陷阱
jvm·热部署·spi·类加载器·双亲委派
随遇而安zx1 天前
【地基篇】---Java 8 JVM 知识大纲
java·开发语言·jvm
liangbo71 天前
01-JVM 内存模型全景
java·jvm
ly76891 天前
JVM 内存屏障与可见性:从 volatile 到 JSR-133 的底层实现
jvm·jit·volatile·内存屏障·jmm·jsr-133