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