阅读openjdk源代码

http://hllvm.group.iteye.com/group/topic/35385

类加载器子系统是么。楼上的方法是可以的,这里稍微展开点讲。不过不要忘记看代码之前先把相关规范了解一下,毕竟具体实现都是遵循规范的。 

先从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有特殊处理的类、方法、字段等信息的声明。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值