class Exception
里面没有什么新鲜东西,它继承自
class Throwable
,接下来我们看一下
Throwable
的结构,在它的构造函数中调用了
fillInStackTrace
这个函数。接下来我们看看这个函数干了些什么。
fillInStackTrace
函数的声明为
public synchronized native Throwable fillInStackTrace();
这是个
native
方法。
然后我们到jdk的代码里去找它的具体实现。
Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, jobject throwable)
{
JVM_FillInStackTrace(env, throwable);
return throwable;
}
JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
JVMWrapper("JVM_FillInStackTrace");
Handle exception(thread, JNIHandles::resolve_non_null(receiver));
java_lang_Throwable::fill_in_stack_trace(exception);
JVM_END
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, TRAPS) {
if (!StackTraceInThrowable) return;
ResourceMark rm(THREAD);
……………………………………………….
BacktraceBuilder bt(CHECK);
………………………………………………
for (frame fr = thread->last_frame(); max_depth != total_count;) {
methodOop method = NULL;
int bci = 0;
………………………………………………
bt.push(method, bci, CHECK);
total_count++;
}
// Put completed stack trace into throwable object
set_backtrace(throwable(), bt.backtrace());
}
上面的代码中,这一系列调用可以发现,当你
new
一个
exception
的时候,
jvm
已经在
exception
里构建好了所有的
stacktrace(
BacktraceBuilder
bt
)
,这里花费的代价是可观的,试想一下,在web项目中,调用栈的深度可是很大的。因此,当你对
stacktrace
不感兴趣的时候,不需要这样的信息时,最好不要随便的
new exception
。
这里介绍一个常用的避免这种问题的相应的解决方法,即不需要stacktrace信息时,抛自己定义的特殊excepion。
自定义
XXXException
,覆盖掉
native
的那个函数
,
构造一个空的函数即可,具体实现如下。
XXXException extends Exception {
public void synchronized fillInStackTrace(){}
…
}
然后throw exception的时候,抛自定义的XXXException就好了,这样会大大的提高效率,也节省了空间。
当然做
getStackTrace()
的代价是蛮大的。曾经遇到一个案例,只需要
stacktrace
中的某个
trace
,却要通过
getStackTrace()
这个函数取到所有的
trace
,取其中的第
i
个,这样着实有些不划算。后来我们在
jdk
中给提供了一个接口
StackTraceElement
XXXUtils::getStackTraceElement(int index, Throwable t)
便可以达到这个目的,节约了不小的时间开销,也省了内存。
分享到:
相关推荐
1. C#语言方面... 4 1.1 垃圾回收... 4 1.1.1 避免不必要的对象创建...... 1.1.2 不要使用空析构函数 ★....4.1 JScript性能优化的基本原则... 24 4.2 JScript语言本身的优化... 24 4.3 DOM相关... 27 4.4 其他... 28
2. 避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好...
避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace 消耗性能,除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如Array List比Vector性能好....
另外由于C#对Exception(异常)处理、内存管理优化等采用的多项先进技术,使基于C#开发的SiteMapIMS-DOTNET稳定性大大加强。 主要有以下七大特点: 1、采用先进的技术 ;2、支持多种数据格式;3、贴近用户的人性化图形...
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...
10.1.1. 性能优化的内容 48 10.1.2. 不同类型系统的优化 48 10.1.2.1. 在线事务处理信息系统(OLTP) 48 10.1.2.2. 数据仓库系统(Data Warehousing) 48 10.2. SQL语句的优化 48 10.2.1. SQL语句的优化规则 48 ...
优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的...
10.11 使用指针优化性能 213 10.12 内容总结 217 11 泛型 218 11.1 泛型的概念 218 11.2 使用泛型 219 11.3 可空类型 219 11.4 运算符和可空类型 220 11.5 System.Collections.Generic命名空间 227 11.6 ...
6. 如何优化Hibernate? 1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用...
15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计与日志...
15.3 易用性,性能、成本和安全性 15.4 建立一个安全政策 15.5 身份验证原则 15.6 加密技术基础 15.6.1 私有密钥加密 15.6.2 公有密钥加密 15.6.3 数字签名 15.7 数字证书 15.8 安全的Web服务器 15.9 审计...