阅读openjdk源代码

chenchuan 2012-12-30
进来因为需求需要阅读相关的openjdk源代码,但是可能我只需要关注其中的一个点,比如类的加载这方面的源代码,但是由于openjdk源代码过于庞大,不知如何下手,而且由于没什么好的工具,也不怎么好读,希望有经验的朋友指教一下
chenk818 2013-01-02
这样应该好办了,直接从classloader的源码往jni代码里面读就行哈。
RednaxelaFX 2013-01-02
类加载器子系统是么。楼上的方法是可以的,这里稍微展开点讲。不过不要忘记看代码之前先把相关规范了解一下,毕竟具体实现都是遵循规范的。

先从java.lang.ClassLoader开始看,它的Java代码的实现在:
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip/src/share/classes/java/lang/ClassLoader.java

其中,这个链接的前半段我是选了JDK7 update的开发分支的代码仓库做例子:
http://hg.openjdk.java.net/jdk7u/jdk7u

这是的代码仓库森林(repo forest),下面有hotspot、jdk等目录,也就是OpenJDK里各子项目的代码仓库,例如jdk的就是在:
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk

这些目录的意义…回头再更新这帖来回复(待续)
hotspot目录是OpenJDK里包含的JVM,HotSpot VM所在的目录。其中的目录结构请参考我之前回复的另一帖:http://hllvm.group.iteye.com/group/topic/26998#193368

继续补完上面的链接解释。要在页面上浏览hg(Mercurial)管理的代码仓库的文件,就要在代码仓库地址后面舔上“/file/<version>”,其中“tip”是一个特别的版本标识,表示最新版。于是要看jdk目录里的文件就是:
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip

(直接下载完整的OpenJDK源码包也可以,那就可以忽略上面提到的链接的前半段,只参考后半段相对路径即可。)

接下来里面就是jdk子项目(也就是OpenJDK里的大部分类库的实现)的内容了。其中
src/
  share/       平台无关的实现
    classes/     平台无关的Java代码实现
    native/      平台无关的native代码实现(主要是C)

classes与native目录的结构就跟Java的包(package)目录结构一样,两边是对应的。知道这个关系就能很快找到JDK类库里Java一侧声明为native的方法在C里的实现函数。
这么一来就可以拼接出java.lang.ClassLoader的native函数的实现文件的链接:
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/tip/src/share/native/java/lang/ClassLoader.c
留意到这跟最初的链接差别就是classes换成了native,.java换成了.c。
JDK里大部分native实现都满足这对应关系, 只有少量例外。

顺带一提,平台相关的代码里的目录结构也基本上跟share是一样的。看目录名就能知道是啥意思了。另外大部分Linux平台相关代码是在solaris目录里的,要注意。

在这ClassLoader.c文件里,可以看到这两种调用:
1、形如“(*env)->SomeFunction(env, ...)”这样的。这种是JNI规范暴露出来的函数,真正的实现在JVM里;
2、函数名有“JVM_”前缀的,例如“JVM_DefineClassWithSource”。这个是HotSpot VM与JDK类库之间的私有接口,真正的具体实现当然也在JVM里。

从前面给的另外一帖可以看到,HotSpot VM的JNI实现和与JDK之间的私有接口实现都在prims目录里。具体说,
1、JNI的实现的入口在jni.cpp里,也就是
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/prims/jni.cpp
2、与JDK类库之间的私有接口的实现的入口在jvm.cpp里,也就是
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/prims/jvm.cpp

在这里面要进一步探索HotSpot VM的内部实现,就请参考前面说的另一帖吧。

============================================================

TL;DR版介绍HotSpot VM的类加载子系统:
最核心的组件大致有:
1、SystemDictionary,这个用来记录所有已加载的 (类型名, 类加载器) -> 类型 的映射关系,是最重要的中央结构;
2、ClassLoader,这个是HotSpot VM所实现的bootstrap class loader;
3、ClassFileParser,这个用来解析(parse)Class文件的内容,将其转换为HotSpot VM内部的形式;
4、上一条提到的内部形式(如klassOop、methodOop、symbolOop等)。这些在JDK7及之前的HotSpot VM里都主要存在所谓“PermGen”里,而从JDK8开始则在native memory里另外找了块地方存;
5、Verifier,类校验器;
6、vmSymbols,这是HotSpot VM有特殊处理的类、方法、字段等信息的声明。
chenchuan 2013-01-04
谢谢RednaxelaFX的指导,看来需要下点功夫了
lvwenwen 2013-01-29
谢谢RednaxelaFX的指导
shjgiser 2015-01-22
看ClassLoader.c里面有这样的引用
#include "java_lang_ClassLoader.h"
#include "java_lang_ClassLoader_NativeLibrary.h"
不知道这些头文件是在那定义的呢?
Global site tag (gtag.js) - Google Analytics