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)便可以达到这个目的,节约了不小的时间开销,也省了内存。
分享到:
相关推荐
public void testObject() throws Exception{ Finder finder=new Finder("select id from [Users] where 1=1 "); finder.append("and userId=:userId").setParam("userId", 6); Integer id = baseFangService....
上一篇(Android 性能优化(三)认识异常Exception和错误Error)讲到造成Crash的原因却有很多,比如:运行时异常的空指针、数组越界、未实例化、强制类型、低内存机制等等,有些时候我们在开发测试阶段都没有出现...
2. 避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好...
1.5.5 捕获指定的异常,不要使用通用的System.Exception. 10 1.5.6 要在finally里释放占用的资源... 11 1.6 反射... 11 1.6.1 反射分类... 12 1.6.2 动态创建对象... 12 1.6.3 动态方法调用... 12 1.6.4 推荐...
magic-script是一款基于JVM的脚本语言,目前主要是为magic-api项目设计。magic-api,接口快速开发框架,通过Web页面配置,自动映射为...spider-flow,新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫
HRPC HRPC是一款基于Netty和Zookeeper设计的轻量级高性能RPC框架。... public void fail(Exception e) { logger.error("result:" e.getMessage()); } }, "188888888"); 标签:rpc
使用C#编写,web socket客户端连接源码,可用于性能测试。
No exception handling (无异常处理) C++ only (C++语言异常处理) C++ 加SEH (C++语言加windows 结构异常处理机制) 异常处理每增加一个级别,都要付出时空上的代价。我们从下面简单的C++例子着手,...
1. C#语言方面 1.1 垃圾回收 1.1.1 避免不必要的对象创建 1.1.2 不要使用空析构函数 ★ ...1.5.5 捕获指定的异常,不要使用通用的System.Exception. 1.5.6 要在finally里释放占用的资源 1.6 反射 1.6.
避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace 消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如Array List比Vector性能好....
虽然使用数据集通过减少对数据库服务器的高花费的访问而提高了性能,但是它也带来了多个用户试图同时访问相同数据的可能性,由此引起数据并发性异常(data concurrency exception)。本文调查了数据并发性异常背后的...
比较了Hibernate和JDBC的性能和实用场景。
1. 并行Streams实际上可能会降低你的性能 Java8带来了让人期待的新特性之–并行。parallelStream() 方法在集合和流上实现了并行。它将它们分解成子问题,然后分配给不同的线程进行处理,这些任务可以分给不同的...
一个基于Java的监视工具,使用运行时数据记录所有用户操作和错误,显示执行性能和执行的方法行。 它不会修改类源文件,也不需要编码,只需将其放在类路径中即可查看mir
为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样...
我们将卷积神经网络中的起始模解释为正则卷积和深度可分离卷积运算(深度卷积后的...由于Exception体系结构与Inception V3具有相同数量的参数,因此性能的提高不是由于容量的增加,而是由于更有效地使用了模型参数。
这是幻影的测试针对坏服务器测试客户端正如问题所讨论的,我们需要针对坏服务器测试 cohttp 客户端。 是一个用 Python 编写的程序,它提供了可运行的服务器故障场景示例。 在接下来的测试中,cohttp 客户端将尝试处...
它的主要意图就要将日志记录,性能统计,安全控制等等代码从商业逻辑代码中清楚的划分出来,我们可以把这些行为一个一个单独看作系统所要解决的问题,就是所谓的面向问题的编程(不知将AOP译作面向问题的编程是否欠妥...
规范中包含五个主要的部分分别为:命名(Naming)、安全(Security)、异常(Exception)、性能(Performance),其他(Other)。五个部分的规范按照英文首字母开头进行编码。规范中之列出简单的说明和实例,这样...
首步我们一般在程序中先处理我们完成异常处理的类,完成异常处理的功能,因为可能除数为0是会出现异常,我们查找java.lang包中各个Exception类,发现RuntimeException类集合中的ArithmeticException可以处理运算异常...