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 的优化。

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

目录
相关文章
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
1068 6
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
472 27
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1398 166
|
Arthas 监控 Java
Arthas jvm(查看当前JVM的信息)
Arthas jvm(查看当前JVM的信息)
442 17
|
Arthas 监控 Java
Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)
Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)
208 15
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
2221 10
|
Arthas 监控 Java
Arthas sc(查看JVM已加载的类信息 )
Arthas sc(查看JVM已加载的类信息 )
746 9
|
监控 Java 编译器
聊聊JVM如何优化
JVM的优化是一个复杂而细致的过程,涉及内存管理、垃圾回收、即时编译、线程调度等多个方面。通过合理配置JVM参数、选择合适的垃圾回收器、优化线程调度和使用专业的监控工具,可以大幅提升Java应用的性能和稳定性。掌握这些优化技巧,能够帮助开发者在高并发、高负载的生产环境中保持系统的高效运行。
841 13
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
417 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
监控 Java 开发者
Java虚拟机(JVM)深度优化指南####
本文深入探讨了Java虚拟机(JVM)的工作原理及其性能优化策略,旨在帮助开发者通过理解JVM的内部机制来提升Java应用的运行效率。不同于传统的技术教程,本文采用案例分析与实战技巧相结合的方式,为读者揭示JVM调优的艺术。 ####
560 8