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)
便可以达到这个目的,节约了不小的时间开销,也省了内存。
分享到:
相关推荐
了解程序中的线程竞争情况对于优化并发性能至关重要: - 通过`ManagementFactory.getThreadMXBean().getThreadInfo(currentThreadId)`可以获得当前线程的信息,包括`blockedTime`、`blockedCount`、`waitedTime`和`...
监测和分析响应时间是评估Node.js应用性能的重要手段。可以通过收集统计周期内的平均响应时间以及响应时间分布情况来判断系统的响应速度是否满足业务需求。对于响应时间较长的情况,需要进一步定位原因。 #### 关注...
因此,在开发.NET应用程序时,需要采取一些措施来优化垃圾回收过程,从而提升程序的整体性能。 **1.1.1 避免不必要的对象创建** - **1.1.1.1 避免循环创建对象**:在循环中反复创建相同的对象是非常低效的做法。...
1. **异常捕获**:ExceptionLog能够自动捕获应用程序运行期间发生的任何异常,确保不会因为未处理的异常而导致程序意外终止。 2. **日志记录**:工具会将捕获到的异常信息记录到日志文件中,包括异常的完整堆栈跟踪...
- **不要用 `Exception` 控制程序流程**:异常处理不应用于正常的程序流程控制,而应仅用于处理意外情况。 这些优化策略有助于提升大型网站的响应速度和用户体验,同时降低服务器负载,从而确保系统的稳定性和可...
### .NET性能优化宝典 #### 一、C#语言方面 **1.1 垃圾回收** 垃圾回收机制是.NET运行时自动管理内存的一部分,对于提高程序的性能至关重要。 **1.1.1 避免不必要的对象创建** 在C#中,不必要的对象创建会增加...
### 提升Web应用系统性能研究 #### 摘要与背景 随着互联网技术的发展与普及,Web应用系统已经成为人们日常生活中不可或缺的一部分。...未来,随着技术的发展,我们还可以探索更多优化Web应用性能的方法。
#### 提升Web应用性能的方法 ##### 1. 在Servlet的init()方法中缓存数据 - **原理**: 应用服务器初始化Servlet实例后,在客户端请求服务之前,会调用Servlet的`init()`方法。在Servlet的整个生命周期中,该方法仅...
标题“Uncaught DOMException:”通常出现在JavaScript编程中,指的是在文档对象模型(DOM)操作...在实际应用中,对“Uncaught DOMException:”的处理和性能测试文档的学习都对提升Web开发者的技能和系统性能至关重要。
"Laravel开发-laravel-exception-logger"项目旨在提供一个跨Laravel应用程序的统一异常日志记录系统,使得开发者可以更有效地追踪、管理和分析应用中的错误。 1. **异常处理**: - Laravel中的异常处理机制遵循PSR...
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang....然而,优化过程需要结合具体应用的负载情况和资源需求来进行,确保在满足应用性能需求的同时,避免不必要的内存浪费。
### JSP_Servlet应用程序优化的八种方法 #### 技术1:在`HttpServlet init()`方法中缓存数据 ...通过实施上述优化策略,可以显著提高JSP/Servlet应用程序的性能和可扩展性,更好地应对日益增长的用户量和请求。
源码分析对于理解软件内部工作原理、优化代码以及排查问题至关重要。而工具的使用则能提升开发效率,帮助快速定位和解决问题。 压缩包内的文件“JS正则表达式大全 - oneJavaer - BlogJava.mht”表明博客内容可能还...
- **减少不必要的请求**:频繁的网络请求会影响应用性能,尤其是在更新界面信息时。应合理规划同步服务器数据的频率,避免过度更新。可以采用后台任务或定时器进行智能调度,只在必要时发送请求。 - **利用推送...
了解PL/SQL的变量声明、流程控制(IF, CASE, LOOP)、异常处理(EXCEPTION)以及游标操作对提升应用程序性能至关重要。 3. 数据库设计:在开发Oracle应用前,需进行严谨的数据库设计。这包括实体关系模型(ER图)、...
Oracle数据库是全球广泛...通过深入学习和实践这些知识点,你可以更好地理解和优化Oracle数据库的性能,同时掌握如何编写和使用存储过程来增强数据库应用的功能和效率。这些资料将是你提升Oracle技术能力的重要资源。
### ASP.NET程序性能优化的七个方面 在ASP.NET应用程序开发过程中,为了提高...以上七个方面涵盖了ASP.NET程序性能优化的关键点,开发者可以根据具体应用场景灵活选择合适的优化策略,从而提高应用程序的整体性能。