JVM的FastThrow优化机制
2024-01-08 21:18:28
前言:
? ? ? ? 前一阵子,在公司排查线上问题发现:出问题的方法报空指针异常,但是没有异常堆栈信息和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;
/**
* 〈一句话功能简述〉<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 -X:+PrintFlagsInitial -version | grep OmitStackTraceInFastThrow
????????被修改的参数:
文章来源:https://blog.csdn.net/huantai3334/article/details/131687448
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!