class Exception里面没有什么新鲜东西,它继承自class Throwable,接下来我们看一下Throwable的结构,在它的构造函数中调用了fillInStackTrace这个函数。接下来我们看看这个函数干了些什么。
fillInStackTrace函数的声明为
Java代码
1 |
public synchronized native Throwable fillInStackTrace();
|
这是个native方法。
然后我们到jdk的代码里去找它的具体实现。
代码
01 |
Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable) |
03 |
JVM_FillInStackTrace(env, throwable);
|
07 |
JVM_ENTRY( void , JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
|
08 |
JVMWrapper( "JVM_FillInStackTrace" );
|
09 |
Handle exception(thread, JNIHandles::resolve_non_null(receiver));
|
10 |
java_lang_Throwable::fill_in_stack_ trace (exception);
|
13 |
void java_lang_Throwable::fill_in_stack_ trace (Handle throwable, TRAPS) {
|
14 |
if (!StackTraceInThrowable) return ;
|
15 |
ResourceMark rm(THREAD);
|
18 |
Back trace Builder bt(CHECK);
|
20 |
for (frame fr = thread->last_frame(); max_depth != total_count;) {
|
21 |
methodOop method = NULL;
|
24 |
bt.push(method, bci, CHECK);
|
29 |
set_back trace (throwable(), bt.back trace ());
|
上面的代码中,这一系列调用可以发现,当你new一个exception的时候,jvm已经在exception里构建好了所有的stacktrace( BacktraceBuilderbt),这里花费的代价是可观的,试想一下,在web项目中,调用栈的深度可是很大的。因此,当你对stacktrace不感兴趣的时候,不需要这样的信息时,最好不要随便的new exception。
这里介绍一个常用的避免这种问题的相应的解决方法,即不需要stacktrace信息时,抛自己定义的特殊excepion。
自定义XXXException,覆盖掉native的那个函数,构造一个空的函数即可,具体实现如下。
代码
1 |
XXXException extends Exception {
|
3 |
public void synchronized fillInStackTrace(){}
|
然后throw exception的时候,抛自定义的XXXException就好了,这样会大大的提高效率,也节省了空间。
当然做getStackTrace()的代价是蛮大的。曾经遇到一个案例,只需要stacktrace中的某个trace,却要通过getStackTrace()这个函数取到所有的trace,取其中的第i个,这样着实有些不划算。后来我们在jdk中给提供了一个接口StackTraceElementXXXUtils::getStackTraceElement(int index, Throwable t)便可以达到这个目的,节约了不小的时间开销,也省了内存。
分享到:
相关推荐
书中可能还会涉及更高级的主题,比如异常安全的编程技巧、自定义异常类、多层异常处理和异常的性能影响等。 通过阅读"More Exceptional C++.chm"和"Exceptional C++.chm",开发者能够深入理解C++异常处理的精髓,...
本篇文章将探讨"exception 需要解决的问题",并结合提供的标签"源码"和"工具"进行深入分析。 在Java编程语言中,异常处理机制通过try-catch-finally语句块实现。当一个异常在try块中发生时,控制权会立即传递给相应...
通过使用ExceptionLog这样的工具,开发者可以在软件开发的各个阶段及时发现并解决问题,降低软件发布后的故障率,提升用户体验。了解并熟练运用这类工具,是每个专业开发者必备的技能之一。通过深入研究和实践,...
### Android Native Exception详解 #### 一、概览 在Android系统中,应用程序主要基于Java运行时环境进行开发,但也有不少部分是...此外,掌握Native Exception的处理流程也是提高应用稳定性和性能的重要手段之一。
例如,IDE(集成开发环境)的调试功能,日志记录工具,或者性能分析工具等,这些都可以帮助开发者在遇到异常时找出问题的根源。 压缩包子文件的文件名称为"复件 ext-lang-zh_CN.js11",看起来像是一个JavaScript...
异常处理通常涉及三个关键字:`try`、`catch`和`throw`,它们协同工作以确保程序在遇到问题时能够优雅地恢复或提供有用的错误信息。 1. **异常基础**: C++中的异常是一种结构化错误处理方式,它允许程序在运行时...
7. **工具使用**:标签中的“工具”可能暗示了利用开发者工具中的断点、步进执行和性能分析等功能来诊断问题。 8. **博文链接**:提供的博文链接指向iteye博客的一篇文章,可能提供了关于这个错误更具体的上下文或...
- 对于Exception,我们通常希望在ERROR或FATAL级别记录,因为它们代表了程序运行中的严重问题。 2. **记录Exception** - 当捕获到一个Exception时,可以使用`logger.error("message", e)`来记录,这里的`e`就是...
- 虽然全面的日志记录有助于诊断问题,但过多的日志输出可能导致性能下降。因此,可以根据环境和异常的严重程度来调整日志级别。 总之,"Laravel开发-laravel-exception-logger"项目旨在提升Laravel异常处理和日志...
总的来说,virtio-user + vhost-net作为一种新的exception path方案,在维护性、灵活性、性能等方面都显示出了明显的优势。通过实际测试和验证,它在保持DPDK高性能包处理的同时,为特定情况下的网络数据处理提供了...
### Android Kernel Exception详解 ...通过对内核异常处理流程、日志信息、内存布局以及具体案例的分析,我们可以更深入地理解这些问题,并采取相应的措施来减少此类异常的发生,进而提升系统的整体性能和稳定性。
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
在本场景中,`emqx-windows-exception.zip` 是一个包含EMQ X Broker在Windows操作系统上的异常处理或特定版本的压缩包。 EMQ X Broker作为MQTT服务器,提供了以下关键功能和特性: 1. **高可用性**:支持集群模式...
9. 性能考虑:虽然异常处理为错误处理提供了强大工具,但过度使用异常可能会对性能产生影响。因此,需要在效率和代码清晰性之间找到平衡。 10. 非异常错误处理:异常不是处理所有错误的唯一方法,有时使用返回值、...
1. 提升软件质量:通过测试可以评估和改进软件性能,确保其稳定性和可靠性。 2. 简化软件维护和进化:良好的测试基础使软件的修改和扩展更为容易。 3. 应对复杂性:大型和复杂的软件系统需要自动化测试来覆盖各种...
- **异常开销**: 主要来源于`fillStackTrace`方法,该方法在`Exception`类的构造函数中调用。 - **`Thread.getStackTrace`方法**: 此方法性能较差,因为它同样涉及到了栈跟踪信息的填充。 - **`try/catch/throw`语句...
Redgate Exception Hunter是一款由Redgate Software公司开发的专业软件调试工具,主要用于帮助开发者定位并解决.NET应用程序中的异常问题。1.0.0.551版本是该产品的一个更新补丁,旨在修复之前版本可能存在的问题,...