openJdk学习

    学习openJdk,主要是学习c++的面向对象思想,及开发大程序的思路。这段时间浏览了不少其中的代码,还是只能管中窥豹,没能从总体上领悟。在此想起曾在www.jdon.com上面看到有人大力鼓吹什么模式思维,宣扬什么数据库已死,算法什么不重要,大力排斥数据结构,感觉按他说的懂模式便懂了计算机。偶自认为略懂模式,模式只不过是软件公理(增加间接层解决问题)的招式提炼,用这么大力鼓吹吗?采用间接层解决问题的思路由来已久,在openjdk中模式也应用很多,但偶懂模式还是看不懂其总体思路,为何?偶的功力不够也,对计算机的底层、算法认识不足,没能领悟大师们的思路。不打好基础而追逐模式,有些舍本逐末,此乃题外话。

     openjdk在new javaThread()时候对线程的执行环境进行了初始化JavaThread::initialize(),里面重要的是jni_functions,此是本地环境(*env)的主要入口。通过jni.cpp里面jni_NativeInterface函数指针数组设置好了jvm的本地方法环境。本地方法的大多实现在hotspot/src/share/vm/prims/jni.cpp文件内。其中使用了大量的宏定义,看起来比较费劲。调用类里面的main方法便是通过jni_invoke_static来实现。从字面理解jni应该是已经编译成本地代码了,在这调用和解释器的调用应该略有不同。只看到了解释器的初始化,没看到何处让解释器解释字节码。

     程序通过JavaCalls::Call调用JavaCalls::call_helper,回调这样的用法在openJdk用得很多。真正调用的方法StubRoutines::call_stub(),这中间通过函数指针调用generate_call_stub返回值,如果每次generate_call_stub返回不同值,就是调用了不同的函数了(sun的这个应该是和jit有关,已经编译成本地方法,在这选用stubGenerator_x86_32.cpp),generate_call_stub返回__ pc()值,其中__采用宏定义表示_masm->,里面采用类汇编的写法,到Assembler::call方法调用真正的java方法,将一个地址转换为函数指针的技巧在有些地方还是有用的。

     上面stubRoutinds初始化在init_globals里面stubRoutines_init1()进行。

你可能感兴趣的:(jvm,多线程,算法,浏览器,jni)