- 浏览: 99911 次
- 性别:
- 来自: 武汉
最新评论
-
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 891在java里面使用动态 ... -
小议偏向锁
2009-02-02 22:18 1960java SE6采用偏向锁以提高性能。 个人理解,偏向 ... -
java中调用接口及调用继承类效率区别
2009-01-19 22:34 5087都说调用接口要比调 ... -
hotsphot中的ResourceArea
2008-11-09 21:38 1289在ClassLoader::load_cla ... -
athrow程序执行代码
2008-10-10 14:38 986看看openjdk中的athrow处理流程 { ... -
Object中notify方法
2008-10-08 10:48 2223Object.java类中notify调用的是shar ... -
Object中wait方法
2008-09-18 10:59 3593Object.wait调用 ... -
自定义类加载器loadClass
2008-09-17 15:43 1409自定义类加载器继承ClassLoader类,使用自定义类加载器 ... -
openjdk中的同步代码
2008-09-16 15:24 1717在java虚拟机中的方法同步synchroni ... -
java栈帧中的对象引用
2008-09-12 11:14 3896openjdk中的java栈帧是如何布置的呢, ... -
System.gc初步分析
2008-09-11 09:48 4223openjdk中的垃圾回收是一个庞大的课题,如何标记 ... -
openjdk的周期线程
2008-09-10 10:04 1281openjdk中周期 ... -
java线程启动代码
2008-09-09 11:24 1950上次写了个《Th ... -
InterpreterRuntime::_new阅读
2008-09-05 14:52 1309InterpreterRuntime::_new为解释 ... -
JavaCalls::call代码阅读
2008-09-04 10:34 2785JavaCalls::call为hotspot调用j ... -
ClassFileParser::parseClassFile阅读
2008-09-02 11:29 1919instanceKlassHandle ClassF ... -
hotspot中的OO对象分析
2008-08-30 23:03 2139hotspot中的OO对象,涉 ... -
类的加载
2008-08-20 16:00 1235类通过(*env)->FindClass,也就是 ... -
Thread的调用
2008-08-19 11:03 2081在java里面创建线程new Thread().sta ... -
openJdk学习
2008-07-15 11:05 3533学习openJdk,主要 ...
相关推荐
轻巧的Java解释器。 用法: > jr yourclass.class
软件工程专业必修课程编译原理课程解释器构造Java源码
设计模式之解释器模式的Java版本实现和UML类图设计
国际软件学院解释器构造作业,语法分析器。java版,下载后自己改一下名字什么的。
详细描述使用Java实现语言解释器.doc
基于antlr的java解释器的源码,C++源码
java设计模式之解释器模式,自己根据理解还有参考弄的,看不懂的可以细聊
一个java的辅助工具,旨在编写java时,能适时的解释代码段作用.
一个lambda interpreter主要由一下几个方面构成: 1.词法分析器(Lexer):将字符流分解为符号流(token流) 2....语法解释器/语法制导的翻译(Interpreter):遍历处理AST,进行对语法树进行求值。
采用Java语言编写的Linux简单命令解释器。可输入的Linux命令有:pwd、list、cd、mkdir、rmdir、rename、copy、find。
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
(支持完整CMM语言,有语法高亮,和目录树,界面友好)
本人用java写的一个c语言的子集语言C--语言的解释器,与编辑器绑定在一起,大学编译原理课会学到的,有兴趣的话大家一起交流。
魔王语言解释器的Java实现。这个是jar文件,项目源代码请看我的另一个资源分享 http://download.csdn.net/source/2846501 (主界面使用 Netbeans IDE 6.9.1 的可视化GUI设计)
beanshell和jdom的jar包 BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法
CMM解释器java版 CMM 解释器 词法分析 语法分析 java public class CMM { }
MuJS:C中可嵌入的Java解释器。关于MuJS是一种轻量级的Java解释器,旨在嵌入其他软件中,以利用脚本功能对其进行扩展。 许可权MuJS版权所有2013-2017 Artifex Softwar MuJS:C语言中的可嵌入Java解释器。关于MuJS是...
虎书 第一章 直线型语言解释器 java实现
23种设计模式(15)java解释器模式.docx
这是一款用java编写的,android手机版PDF阅读器. 可以读取android手机内的PDF文件.纯java写的,有详细注释,不过是英文的.可适用于android高手学习.若是菜鸟就不要看了.以免误人子弟,呵呵..