- 浏览: 211107 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
Prepared:
Hadoop的几个明显缺点 -
CSunDNan:
...
openjdk jvm 方法字节码执行过程 -
幻影之蚀:
...
mysql 源码分析2 源码调试环境建立 -
shukongchengje:
紧急呼唤楼主,mysql代码从哪里弄?官网wiki上看的一头雾 ...
mysql源码分析 整体架构 -
yeshaoting:
好文章.不介意的话转载了.
jvm 字节码中文含义
openjdk 异常处理流程
{
oop except_oop = STACK_OBJECT(-1); //从栈中弹出异常的引用
CHECK_NULL(except_oop); //检查异常引用是否为空
THREAD->set_pending_exception(except_oop, NULL, 0);
goto handle_exception; //处理异常执行代码
}
处理异常的代码handle_exception
{
Handle except_oop(THREAD, THREAD->pending_exception());
CALL_VM(continuation_bci = (intptr_t)InterpreterRuntime::exception_handler_for_exception(THREAD, except_oop()), handle_exception); //此为查找异常表,也就是执行InterpreterRuntime::exception_handler_for_exception,如果在执行的过程中还抛出异常,回到handle_exception开始地方,继续执行
except_oop = (oop) THREAD->vm_result();
THREAD->set_vm_result(NULL);
if (continuation_bci >= 0) { //查找异常表exception_handler_for_exception
SET_STACK_OBJECT(except_oop(), 0);
MORE_STACK(1);
pc = METHOD->code_base() + continuation_bci; //pc指针
............
goto run ; //转到解释器处理循环
}
THREAD->set_pending_exception(except_oop(), NULL, 0);
goto handle_return; //本方法没有找到相应的异常处理,继续往上抛出
}
查找异常表的代码
InterpreterRuntime::exception_handler_for_exception(JavaThread* thread, oopDesc* exception)
{
.............
if (thread->do_not_unlock_if_synchronized()) {
return Interpreter::remove_activation_entry();
}
do {
KlassHandle h_klass(THREAD, h_exception->klass());
handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD);
if (HAS_PENDING_EXCEPTION) { //需要处理异常
h_exception = Handle(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
if (handler_bci >= 0) {
current_bci = handler_bci;
should_repeat = true;
}
}
}while (should_repeat == true);
address continuation = NULL;
if (handler_bci < 0 || !thread->reguard_stack((address) &continuation)) {
continuation = Interpreter::remove_activation_entry();
h_method->interpreter_throwout_increment();
}else{
handler_pc = h_method->code_base() + handler_bci;
set_bcp_and_mdp(handler_pc, thread);
continuation = Interpreter::dispatch_table(vtos)[*handler_pc];
}
thread->set_vm_result(h_exception());
return continuation;
}
handle_return:
{
if (THREAD->do_not_unlock()) { //对方法中监视器的处理
}else{
}
if (illegal_state_oop() != NULL || original_exception() != NULL) {
istate->set_msg(throwing_exception);
if (illegal_state_oop() != NULL)
THREAD->set_pending_exception(illegal_state_oop(), NULL, 0);
else
THREAD->set_pending_exception(original_exception(), NULL, 0);
istate->set_return_kind((Bytecodes::Code)opcode);
UPDATE_PC_AND_RETURN(0);
generate_normal_entry中
__ pushptr(return_from_native_method.addr());调用前的返回地址(这就是上面return返回后的地址)
__ jmp(rax); 调用
*/
}
}
{
oop except_oop = STACK_OBJECT(-1); //从栈中弹出异常的引用
CHECK_NULL(except_oop); //检查异常引用是否为空
THREAD->set_pending_exception(except_oop, NULL, 0);
goto handle_exception; //处理异常执行代码
}
处理异常的代码handle_exception
{
Handle except_oop(THREAD, THREAD->pending_exception());
CALL_VM(continuation_bci = (intptr_t)InterpreterRuntime::exception_handler_for_exception(THREAD, except_oop()), handle_exception); //此为查找异常表,也就是执行InterpreterRuntime::exception_handler_for_exception,如果在执行的过程中还抛出异常,回到handle_exception开始地方,继续执行
except_oop = (oop) THREAD->vm_result();
THREAD->set_vm_result(NULL);
if (continuation_bci >= 0) { //查找异常表exception_handler_for_exception
SET_STACK_OBJECT(except_oop(), 0);
MORE_STACK(1);
pc = METHOD->code_base() + continuation_bci; //pc指针
............
goto run ; //转到解释器处理循环
}
THREAD->set_pending_exception(except_oop(), NULL, 0);
goto handle_return; //本方法没有找到相应的异常处理,继续往上抛出
}
查找异常表的代码
InterpreterRuntime::exception_handler_for_exception(JavaThread* thread, oopDesc* exception)
{
.............
if (thread->do_not_unlock_if_synchronized()) {
return Interpreter::remove_activation_entry();
}
do {
KlassHandle h_klass(THREAD, h_exception->klass());
handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD);
if (HAS_PENDING_EXCEPTION) { //需要处理异常
h_exception = Handle(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
if (handler_bci >= 0) {
current_bci = handler_bci;
should_repeat = true;
}
}
}while (should_repeat == true);
address continuation = NULL;
if (handler_bci < 0 || !thread->reguard_stack((address) &continuation)) {
continuation = Interpreter::remove_activation_entry();
h_method->interpreter_throwout_increment();
}else{
handler_pc = h_method->code_base() + handler_bci;
set_bcp_and_mdp(handler_pc, thread);
continuation = Interpreter::dispatch_table(vtos)[*handler_pc];
}
thread->set_vm_result(h_exception());
return continuation;
}
handle_return:
{
if (THREAD->do_not_unlock()) { //对方法中监视器的处理
}else{
}
if (illegal_state_oop() != NULL || original_exception() != NULL) {
istate->set_msg(throwing_exception);
if (illegal_state_oop() != NULL)
THREAD->set_pending_exception(illegal_state_oop(), NULL, 0);
else
THREAD->set_pending_exception(original_exception(), NULL, 0);
istate->set_return_kind((Bytecodes::Code)opcode);
UPDATE_PC_AND_RETURN(0);
generate_normal_entry中
__ pushptr(return_from_native_method.addr());调用前的返回地址(这就是上面return返回后的地址)
__ jmp(rax); 调用
*/
}
}
发表评论
-
Java类的初始化过程详解
2010-04-11 17:09 1229java是多线程的,所以类 ... -
jvm 字节码中文含义
2010-04-08 11:31 3627栈和局部变量操作 将常 ... -
诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW
2010-04-08 11:08 1747关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏 ... -
jvm 初始化
2010-04-07 16:01 1181void vm_init_globals() { chec ... -
jvm gc
2010-04-06 23:52 1020jvm gc -
jvm exception
2010-04-06 23:52 851jvm exception -
jvm method invoke
2010-04-06 23:51 1080jvm method invoke -
jvm interpreter
2010-04-06 23:51 1249jvm interpreter 解释器的初始化 JNI_Cr ... -
jvm运行时数据结构
2010-04-06 23:50 909jvm运行时数据结构 -
jvm class与instance运行时结构
2010-04-06 23:49 871jvm class与instance运行时结构 -
jvm dll加载分析
2010-04-06 23:48 1172jvm dll加载分析 -
java class文件格式
2010-04-06 23:43 1424struct ClassFile { u4 magic; ... -
汇编语言与计算机体系结构--使用C++和Java
2010-04-06 15:16 1688第1章数制1 1.1简介1 1.2按位记数制1 1.3各数制的 ... -
JVM内存管理及垃圾回收机制
2010-04-06 09:30 854JAVA在内存中由 Perm 和 He ... -
IBM Java Jvm GC实现内幕 (几年前的老文)
2010-04-05 14:39 839好言归正传,按照Sam Borman的说法IBM java 1 ... -
修复 Java 内存模型,第 1 部分(什么是 Java 内存模型,最初它是怎样被破坏的?)
2010-03-30 14:16 1046Java 平台把线程和多处理技术集成到了语言中,这种集成程度比 ... -
JVM内存结构
2010-03-29 15:25 816(1)类装载子系统 装载 连 ... -
Java轻量级锁原理详解(Lightweight Locking)
2010-03-29 15:21 790Java轻量级锁原理详解(Lightweight Lockin ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:15 1063类的初始化和对象初始 ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:14 745类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要 ...
相关推荐
本篇文章将深入探讨基于给定文件名的JVM异常分析主题,包括socket端口占用问题和内存溢出系统异常,以及如何解决这些问题以防止异常宕机。 首先,让我们关注"623scoket端口占有和内存溢出系统异常分析"这个文件。...
Java虚拟机(JVM)是运行Java应用程序的关键组件,它负责管理内存、执行字节码以及处理线程等任务。当JVM遇到问题,如内存溢出或长时间的垃圾回收,它可能会生成堆栈转储(dump)文件,这些文件包含了JVM在特定时刻...
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。
3. **异常报告**:错误日志会记录导致JVM崩溃的异常类型和消息。例如,"java.lang.OutOfMemoryError: Java heap space"表明是由于堆内存不足导致的问题。 4. **内存使用情况**:日志会包含JVM在崩溃时的内存使用...
"jvmgc日志分析工具"专为解析和可视化JVM生成的GC日志而设计,帮助开发者识别内存瓶颈,调整内存设置,以及诊断可能的性能问题。 GC日志是JVM在运行过程中记录的关于垃圾收集活动的详细信息,包括垃圾收集的起始...
【Jvm 内存分析文档】 Java 虚拟机(JVM)是Java程序的核心运行环境,它负责管理和执行字节码。JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具,尤其适用于Mac OS X平台。这款工具可以帮助开发者诊断和解决Java应用中的内存泄漏问题,提高应用性能。MAT通过深入分析堆转储...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,管理内存,以及优化代码。为了确保应用的高效运行和优化,开发者通常会使用一系列的JVM分析工具。以下是对这些工具的详细介绍: 1. **jmap**: `...
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
通过对JVM执行子系统原理的深入分析,我们不仅了解了Class文件的具体结构和字节码指令的基本概念,还探讨了类加载机制的各个环节以及字节码执行引擎的核心组成部分。这些知识点对于深入理解JVM的工作原理、优化程序...
《JVM堆栈性能分析》PDF是一份深入探讨Java虚拟机(JVM)内存管理和性能优化的专业文档。本文档主要关注JVM中的堆栈部分,尤其是如何理解和优化其性能,对于Java开发者来说具有很高的学习价值。JVM是Java程序运行的...
然后,解压下载的MemoryAnalyzer-1.10.0.20200225.zip文件,运行其中的MAT可执行文件,导入堆转储文件进行分析。 在分析过程中,MAT会计算每个对象的浅堆(Shallow Heap)和保留堆(Retained Heap),前者表示对象...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java虚拟机(JVM)内存分析工具。它主要用于诊断Java应用程序的内存泄漏问题,帮助开发者理解内存消耗情况,优化内存配置,从而提升应用性能。MAT以其易用性和...
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
JVM(Java Virtual Machine)是Java程序运行的核心组件,它负责解释和执行字节码。然而,当JVM出现严重错误或无法恢复的问题时,它可能会崩溃并生成一个崩溃日志,这通常被称为`hs_err_pid.log`文件。这篇内容将深入...
1. **JVM结构与原理**:首先,我们需了解JVM的基本架构,包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。特别是堆内存、栈内存、方法区(元空间)以及垃圾收集机制,它们是理解JVM运行时行为的关键。...
### JAVA文件编译执行与虚拟机(JVM)介绍 #### 关键知识点概述: 1. **JAVA文件的编译与执行**:JAVA程序首先通过编译器转换为中间代码(字节码),然后由JVM解释执行。 2. **JVM的角色与功能**:JVM作为JAVA程序...
首先,JProfiler11是一款专业级别的Java性能分析工具,它能够对JVM进行深入的内存和CPU分析。通过集成到Idea中,开发者可以直接在IDE内部进行性能检测,无需离开熟悉的开发环境。只需下载JProfiler11的安装包,并...
JVM 内存状况查看方法和分析工具 JVM 内存状况查看方法和分析工具是 Java 开发人员不可或缺的技能之一。Java 本身提供了多种丰富的方法和工具来帮助开发人员查看和分析 GC 及 JVM 内存的状况,同时开源界和商业界也...
Java虚拟机(JVM)执行子系统是Java平台的核心组件之一,它的主要功能是加载、链接并执行Java类文件中的字节码。在深入理解JVM执行子系统之前,我们需要了解Java类文件结构,以及JVM如何与这些类文件交互。 ### ...