openjdk学习
文章平均质量分 75
iteye_16780
这个作者很懒,什么都没留下…
展开
-
java中调用接口及调用继承类效率区别
都说调用接口要比调用继承类要慢,但慢在何处? 先看byteCodeInterpreter.cpp里面对这invokevirtual和invokeInterface的区别。 CASE(_invokeinterface): { //调用接口 u2 index = Bytes::get_native_u2(pc+1); ConstantPoolCac...2009-01-19 22:34:14 · 365 阅读 · 0 评论 -
openjdk的周期线程
openjdk中周期线程为WatcherThread,在 jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { ............ if (PeriodicTask::num_tasks() > 0) { ...2008-09-10 10:04:19 · 207 阅读 · 0 评论 -
System.gc初步分析
openjdk中的垃圾回收是一个庞大的课题,如何标记活动的对象,就涉及到了堆栈的、常量池的跟踪标记等,非常复杂。在此先做一个初步的分析。 先从System.java中的gc方法开始阅读。 public static void gc() { Runtime.getRuntime().gc(); } 跟踪进去,其实调用到了jvm.cpp里面...2008-09-11 09:48:52 · 109 阅读 · 0 评论 -
java栈帧中的对象引用
openjdk中的java栈帧是如何布置的呢,在java栈中如果确定变量是一个引用呢,先复习《深入java虚拟机第二版》有关栈帧的内容。 “栈帧由三部分组成:局部变量区、操作数栈和栈数据区。局部变量区和操作数栈要视对应的方法而定,他们是按字长计算的。编译器在编译时就确定了这些值并放在class文件中,而栈数据区的大小依赖于具体实现。 当虚拟机调用...2008-09-12 11:14:54 · 388 阅读 · 0 评论 -
openjdk中的同步代码
在java虚拟机中的方法同步synchronized,是通过使用monitorenter和monitorexit这两个操作码,当虚拟机遇到monitorenter的时候,它会获得栈中objectref所引用的对象的锁。如果线程已经拥有那个对象的锁,锁的计数器加1,线程中每个monitorexit会引起计数器减1,当计数器为0时候,监视器就释放了。 先看看openj...2008-09-16 15:24:18 · 172 阅读 · 0 评论 -
自定义类加载器loadClass
自定义类加载器继承ClassLoader类,使用自定义类加载器是通过loadClass方法实现。 protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // 查找类是否已经加载 Class c = fi...2008-09-17 15:43:17 · 180 阅读 · 0 评论 -
Object中wait方法
Object.wait调用的是share/vm/prims/jvm.cpp中的JVM_MonitorWait。 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms) { Handle obj(THREAD, JNIHandles::resolve_no...2008-09-18 10:59:17 · 258 阅读 · 0 评论 -
Object中notify方法
Object.java类中notify调用的是share/vm/prims/jvm.cpp中的JVM_MonitorNotify。 void JVM_MonitorNotify(JNIEnv* env, jobject handle) { Handle obj(THREAD, JNIHandles::resolve_non_null(handle)...2008-10-08 10:48:13 · 232 阅读 · 0 评论 -
java动态代理
在java里面使用动态代理,一般有以下流程 定义接口 public interface ISample{ public void test(); } 定义实现类 public class SampleImple implements ISample{ public void test(){ ...2009-11-19 16:21:57 · 96 阅读 · 0 评论 -
athrow程序执行代码
看看openjdk中的athrow处理流程 { oop except_oop = STACK_OBJECT(-1); //从栈中弹出异常的引用 CHECK_NULL(except_oop); //检查异常引用是否为空 THREAD->set_pending_exception(except_oo...2008-10-10 14:38:57 · 461 阅读 · 1 评论 -
java线程启动代码
上次写了个《Thread的调用》过于简单,在这以javaThread的启动过程做一个详细分析。 先从java/lang/Thread.java看起 public synchronized void start() { ..... start0(); // start0为本地方法 private nat...2008-09-09 11:24:49 · 409 阅读 · 0 评论 -
InterpreterRuntime::_new阅读
InterpreterRuntime::_new为解释器查找常量池后,发觉需要resolve类时候调用。方法在interpreterRuntime.cpp里面。 void InterpreterRuntime::_new(JavaThread* thread, constantPoolOopDesc* pool, int index){ klassOop k...2008-09-05 14:52:04 · 374 阅读 · 0 评论 -
小议偏向锁
java SE6采用偏向锁以提高性能。 个人理解,偏向锁能提高性能,其理论基础是建立在绝大部分时间内,需要同步的代码其实只是一个线程在运行,正因为是单个线程在运行,所以尽量采用轻量的代码以提高性能,原子操作那是肯定需要的,但不需要采用切换上下文这类的重型操作。如果是很多线程同时运行到同步代码地方,同步代码稍长的话,采用偏向锁反而影响性能。 如果是我设计锁,首先会考虑在内存内放置锁的标...2009-02-02 22:18:05 · 210 阅读 · 0 评论 -
学习起航
openJdk文件数众多,在那先入手?我是从java.c开始,我采用的sourceInside阅读器,由于这是学习,本着能看懂多少是多少的态度,不必拘泥于各个细节,先从os/linux/laucher/java.c看起。 在java.c的main函数内调用LoadJavaVm,具体创建vm的函数为JNI_CreateJavaVM,其采用函数指针,而不采用直接调用,没看出来有什么好处,为什么...2008-07-14 17:22:15 · 123 阅读 · 0 评论 -
openJdk学习
学习openJdk,主要是学习c++的面向对象思想,及开发大程序的思路。这段时间浏览了不少其中的代码,还是只能管中窥豹,没能从总体上领悟。在此想起曾在www.jdon.com上面看到有人大力鼓吹什么模式思维,宣扬什么数据库已死,算法什么不重要,大力排斥数据结构,感觉按他说的懂模式便懂了计算机。偶自认为略懂模式,模式只不过是软件公理(增加间接层解决问题)的招式提炼,用这么大力鼓吹吗?采用间接...2008-07-15 11:05:14 · 251 阅读 · 0 评论 -
Thread的调用
在java里面创建线程new Thread().start(),在这里面先调用Thread.java的init()进行了初始化,然后调用了本地方法 start0(),这个方法实际上调用了hotspot\src\share\vm\prims\jvm.cpp文件里的JVM_StartThread方法。 在上面方法里new JavaThread(),这是jvm里面区分的线程类型。创建时候传进入一...原创 2008-08-19 11:03:37 · 365 阅读 · 0 评论 -
类的加载
类通过(*env)->FindClass,也就是hotspot/src/share/vm/prims/jni.cpp的jni_FindClass来执行,在里面首先找到loader实例,之后进入find_class_from_class_loader,通过SystemDictionary::resolve_or_fail来解释类文件。在里面区分两种情况FieldType::is_arr...2008-08-20 16:00:48 · 94 阅读 · 0 评论 -
hotspot中的OO对象分析
hotspot中的OO对象,涉及到类的加载、gc等,相当复杂。 class oopDesc是基类。为Object header class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metad...2008-08-30 23:03:29 · 121 阅读 · 0 评论 -
ClassFileParser::parseClassFile阅读
instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name, Handle class_loader, H...2008-09-02 11:29:39 · 431 阅读 · 0 评论 -
JavaCalls::call代码阅读
JavaCalls::call为hotspot调用java方法的实现之一。其调用os::os_exception_wrapper(call_helper, result, &method, args, THREAD);这个还是比较好看懂,通过传入call_helper函数指针,在call_helper上面封装了异常的处理,典型的回调函数用法。call_helper的实现里面的具体...2008-09-04 10:34:28 · 822 阅读 · 0 评论 -
java解释器的阅读
前面已经提到了java的方法入口是Interpreter::entry_for_method,此处就将cpu控制权交给了java的解释器。上面的entry_for_method为这个AbstractInterpreterGenerator::generate_method_entry函数的返回值,在此还是以X86机器为例,普通的方法由InterpreterGenerator::gene...2008-09-05 10:09:47 · 173 阅读 · 1 评论 -
hotsphot中的ResourceArea
在ClassLoader::load_classfile中,下面的代码引起了我的注意。 ClassFileStream* stream = NULL; int classpath_index = 0; { PerfTraceTime vmtimer(perf_accumulated_time()); ClassPathEntry* ...2008-11-09 21:38:30 · 398 阅读 · 0 评论