- 浏览: 103070 次
- 性别:
- 来自: 武汉
最新评论
-
hatedance:
这个bytecodeInterpreter应该已经被遗弃了,现 ...
openjdk中的同步代码 -
Mr_lee_2012:
是啊,好文章,谢过。
java栈帧中的对象引用 -
ZangXT:
有些性能要求比较高的系统会考虑这一点的,典型的如JPC,尽量避 ...
java中调用接口及调用继承类效率区别 -
tinywind:
你有没有注意到load_classfile开始定义了个Reso ...
hotsphot中的ResourceArea -
qianli-2010:
java中调用接口及调用继承类效率区别
前面已经提到了java的方法入口是Interpreter::entry_for_method,此处就将cpu控制权交给了java的解释器。
上面的entry_for_method为这个AbstractInterpreterGenerator::generate_method_entry函数的返回值,在此还是以X86机器为例,普通的方法由InterpreterGenerator::generate_normal_entry返回。
address InterpreterGenerator::generate_normal_entry(bool synchronized) {
.......
//调用真正解释器的地方
RuntimeAddress normal(CAST_FROM_FN_PTR(address, BytecodeInterpreter::run));
RuntimeAddress checking(CAST_FROM_FN_PTR(address, BytecodeInterpreter::runWithChecks));
__ call(JvmtiExport::can_post_interpreter_events() ? checking : normal);
__ popl(rax); // discard parameter to run
}
在执行到上面的call时,就会调用了BytecodeInterpreter::run方法。此方法在BytecodeInterpreter.cpp里面,用#ifdef这些包含,不容易找到。这也是一个硕大的方法。挑选进行字节码解释部分分析一下。
while (1){
opcode = *pc;
switch (opcode){
...........
CASE(_new): {
u2 index = Bytes::get_Java_u2(pc+1);
constantPoolOop constants = istate->method()->constants();
if (!constants->tag_at(index).is_unresolved_klass()) {
// Make sure klass is initialized and doesn't have a finalizer
oop entry = (klassOop) *constants->obj_at_addr(index);
assert(entry->is_klass(), "Should be resolved klass");
klassOop k_entry = (klassOop) entry;
assert(k_entry->klass_part()->oop_is_instance(), "Should be instanceKlass");
instanceKlass* ik = (instanceKlass*) k_entry->klass_part();
if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
size_t obj_size = ik->size_helper();
oop result = NULL;
// If the TLAB isn't pre-zeroed then we'll have to do it
bool need_zero = !ZeroTLAB;
if (UseTLAB) {
result = (oop) THREAD->tlab().allocate(obj_size);
}
if (result == NULL) {
need_zero = true;
// Try allocate in shared eden
retry:
HeapWord* compare_to = *Universe::heap()->top_addr();
HeapWord* new_top = compare_to + obj_size;
if (new_top <= *Universe::heap()->end_addr()) {
if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) {
goto retry;
}
result = (oop) compare_to;
}
}
if (result != NULL) {
// Initialize object (if nonzero size and need) and then the header
if (need_zero ) {
HeapWord* to_zero = (HeapWord*) result + sizeof(oopDesc) / oopSize;
obj_size -= sizeof(oopDesc) / oopSize;
if (obj_size > 0 ) {
memset(to_zero, 0, obj_size * HeapWordSize);
}
}
if (UseBiasedLocking) {
result->set_mark(ik->prototype_header());
} else {
result->set_mark(markOopDesc::prototype());
}
result->set_klass(k_entry);
SET_STACK_OBJECT(result, 0);
UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
}
}
}
// Slow case allocation
CALL_VM(InterpreterRuntime::_new(THREAD, METHOD->constants(), index),
handle_exception);
SET_STACK_OBJECT(THREAD->vm_result(), 0);
THREAD->set_vm_result(NULL);
UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
}
//上面挑选一段new字节码的解释过程,整个run函数用到太多的宏,看起来太费劲,个人感觉宏难以理解,还是少用为好
................
if (!THREAD->has_pending_exception()) {
CONTINUE;
}
/* We will be gcsafe soon, so flush our state. */
DECACHE_PC();
goto handle_exception;
}
do_continue: ;
}
.........
//下面是些处理异常的操作
由上面的代码可以看到,整个解释过程就是不断读入字节码,和系统预先定义好的字节码进行匹配(也就是上面的case处理)的过程。解释所用到的java栈、栈桢、本地方法栈等,还有待于慢慢阅读分析。
发表评论
-
java动态代理
2009-11-19 16:21 933在java里面使用动态 ... -
小议偏向锁
2009-02-02 22:18 2034java SE6采用偏向锁以提高性能。 个人理解,偏向 ... -
java中调用接口及调用继承类效率区别
2009-01-19 22:34 5186都说调用接口要比调 ... -
hotsphot中的ResourceArea
2008-11-09 21:38 1343在ClassLoader::load_cla ... -
athrow程序执行代码
2008-10-10 14:38 1044看看openjdk中的athrow处理流程 { ... -
Object中notify方法
2008-10-08 10:48 2283Object.java类中notify调用的是shar ... -
Object中wait方法
2008-09-18 10:59 3663Object.wait调用 ... -
自定义类加载器loadClass
2008-09-17 15:43 1454自定义类加载器继承ClassLoader类,使用自定义类加载器 ... -
openjdk中的同步代码
2008-09-16 15:24 1825在java虚拟机中的方法同步synchroni ... -
java栈帧中的对象引用
2008-09-12 11:14 3948openjdk中的java栈帧是如何布置的呢, ... -
System.gc初步分析
2008-09-11 09:48 4315openjdk中的垃圾回收是一个庞大的课题,如何标记 ... -
openjdk的周期线程
2008-09-10 10:04 1328openjdk中周期 ... -
java线程启动代码
2008-09-09 11:24 2004上次写了个《Th ... -
InterpreterRuntime::_new阅读
2008-09-05 14:52 1379InterpreterRuntime::_new为解释 ... -
JavaCalls::call代码阅读
2008-09-04 10:34 2853JavaCalls::call为hotspot调用j ... -
ClassFileParser::parseClassFile阅读
2008-09-02 11:29 2008instanceKlassHandle ClassF ... -
hotspot中的OO对象分析
2008-08-30 23:03 2194hotspot中的OO对象,涉 ... -
类的加载
2008-08-20 16:00 1288类通过(*env)->FindClass,也就是 ... -
Thread的调用
2008-08-19 11:03 2149在java里面创建线程new Thread().sta ... -
openJdk学习
2008-07-15 11:05 3584学习openJdk,主要 ...
相关推荐
轻巧的Java解释器。 用法: > jr yourclass.class
在这个“编译原理课程解释器构造Java源码”中,我们可以推测这是一个基于Java编程语言实现的解释器项目。Java是一种广泛应用的面向对象的编程语言,它的跨平台特性使得它成为构建各种软件工具的理想选择,包括解释器...
在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。这个模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的计算器或者SQL查询的简化版本。 ...
本项目名为“CMM解释器java版语法分析器”,是国际软件学院的一次作业,目的是让学生掌握如何使用Java语言实现一个语法分析器。在这个过程中,学生将深入理解编程语言的内部工作原理,以及如何解析并执行代码。 ...
通过这个过程,Java解释器将逐行读取并执行SmallBASIC程序,提供一个交互式的环境,允许程序在运行时暂停、恢复,并在错误发生时进行调试。 总的来说,本章旨在通过构建一个简单的语言解释器,让读者深入理解解释器...
在构建一个Java解释器的过程中,我们需要关注以下几个关键知识点: 1. **词法分析**:这是编译器和解释器的第一步,它将源代码分解成一个个称为“标记”(tokens)的最小单位。这个过程通常由词法分析器(lexer)...
在本主题“基于ANTLR的Java解释器”中,我们将深入探讨如何利用ANTLR来构建一个能够理解和执行Java代码的解释器。 ANTLR的核心功能是生成解析器和词法分析器。词法分析器负责将输入的字符流分解成一系列的标记...
在Java解释器中,这可能涉及到获取并打印Java的`System.getProperty("user.dir")`来获取当前工作目录。 4. **list命令**:`list`通常对应于Linux的`ls`命令,用于列出目录中的文件和子目录。Java实现可能需要遍历...
《Java实现的CMM语言解释器详解》 在编程领域,理解并掌握编译器和解释器的工作原理是至关重要的。本项目是一个基于Java实现的C语言子集——CMM语言的解释器,旨在帮助学习者深入理解编译原理及其实践应用。下面,...
Java编程语言以其跨平台的能力和高效执行闻名,这主要得益于其独特的执行机制,包括Java编译器、Java虚拟机(JVM)以及Java解释器。本文将深入探讨这些组件的作用和交互。 首先,Java编译器是开发过程中的关键部分...
**标题:“ha-textpad java解释器”** **正文:** `ha-textpad` 是一个文本编辑器,特别针对编程人员设计,支持多种编程语言,包括Java。它以其简洁的界面和丰富的代码编辑功能受到程序员的喜爱。在Java开发环境中...
一个java的辅助工具,旨在编写java时,能适时的解释代码段作用.
Beanshell 是一个轻量级的Java源码解释器,它允许你在运行时执行Java代码片段或者完整的脚本。这个工具非常适用于快速测试、调试、以及动态编程任务,因为它的语法接近于标准Java,同时又引入了一些脚本语言的便利...
Java解释器是将Java源代码转换为机器可执行指令的关键组件。在这个初步的Java解释器中,重点在于词法分析,这是编译器设计过程中的第一步。词法分析,也称为扫描,是从源代码中识别出有意义的符号,即标记(tokens)...
CMM解释器是一种用于执行CMM(一种特定的编程语言)程序的软件。在这个Java实现中,我们将深入探讨如何...通过阅读和理解这些代码,你可以深入了解解释器的工作原理,以及如何使用Java来实现一个完整的编程语言解释器。
一个lambda interpreter主要由一下几个方面构成: 1.词法分析器(Lexer):将字符流分解为符号流(token流) 2....语法解释器/语法制导的翻译(Interpreter):遍历处理AST,进行对语法树进行求值。
Java解释器是Java虚拟机(JVM)的一个组成部分,它负责将编译好的Java字节码转换为特定平台上的机器码来执行。在Java程序的生命周期中,解释器起到了至关重要的作用。当Java代码被编译器编译成字节码后,这些字节码...
在桂浩的解释器项目中,使用Java作为实现语言是很常见的选择,因为Java具有良好的跨平台性,且其标准库提供了丰富的工具和支持。"国软"可能指的是该解释器项目是中国软件行业的产物,或者特别针对中国开发者设计的。...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...