JVM优化过头了,直接把异常信息优化没了? (中)

简介: JVM优化过头了,直接把异常信息优化没了? (中)

image.png

关于消除异常的性能消耗,他提出了三个解决方案:

重构你的代码不使用它们。

缓存异常实例。

重写 fillInStackTrace 方法。

通过小日...小日子过的还不错的日本的站点,输入关键信息后,知乎的这个链接排在第二个:

image.png

https://www.zhihu.com/question/21405047

image.png

这个问题下面,有一个R大的回答,粘贴给你看看:

image.png

大家都不约而同的提到了重写 fillInStackTrace 方法,这个性能优化小技巧,也就是我们可以这样去自定义异常:

image.png

用一个不严谨的方式测试一下,你就看这个意思就行:


image.png

重写了 fillInStackTrace 方法,直接返回 this 的对象,比调用了爬栈方法的原始方法,快了不是一星半点儿。

其实除了重写 fillInStackTrace 方法之外,JDK 7 之后还提供了这样的一个方法:

java.lang.Throwable#Throwable(java.lang.String, java.lang.Throwable, boolean, boolean)


image.png

可以通过 writableStackTrace 入参来控制是否需要去爬栈。

那么到底什么时候才应该去用这样的一个性能优化手段呢?

其实R大的回答里面说的很清楚了:

image.png

其实我们写业务代码的,异常信息打印还是非常有必要的。

但是对于一些追求性能的框架,就可以利用这个优势。

比如我在 disruptor 和 kafka 的源码里面都找到了这样的优化落地源码。

先看 disruptor 的:

com.lmax.disruptor.AlertException


image.png

  • Overridden so the stack trace is not filled in for this exception for performance reasons.
  • 由于性能的原因,重载后的堆栈跟踪不会被填入这个异常。

再看 kafka 的:

org.apache.kafka.common.errors.ApiException


image.png


  • avoid the expensive and useless stack trace for api exceptions
  • 避免对api异常进行昂贵而无用的堆栈跟踪

而且你注意到了吗,上面着两个框架中,直接把 synchronized 都干掉了。如果你也打算重写,那么也可以分析一下你的场景中是否可以去掉 synchronized,性能又可以来一点提升。

另外,R大的回答里面还提到了这个优化是 C2 的优化。

我们可以简单的证明一下。

目录
相关文章
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
47 0
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
45 3
|
1月前
|
存储 算法 Java
深入理解Java虚拟机(JVM)及其优化策略
【10月更文挑战第10天】深入理解Java虚拟机(JVM)及其优化策略
41 1
|
1月前
|
监控 Java
Java的JVM如何优化?
Java的JVM如何优化?
57 3
|
4月前
|
开发者 Java
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
|
4月前
|
Arthas 存储 监控
JVM内存问题之JNI内存泄漏没有关联的异常类型吗
JVM内存问题之JNI内存泄漏没有关联的异常类型吗
|
4月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
94 3
|
4月前
|
缓存 算法 Java
JVM内存溢出(OutOfMemory)异常排查与解决方法
JVM内存溢出(OutOfMemory)异常排查与解决方法
|
4月前
|
监控 Java 中间件
FGC频繁导致CPU 飙升定位及JVM配置优化总结
FGC频繁导致CPU 飙升定位及JVM配置优化总结
162 0
|
4月前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
47 0