码迷,mamicode.com
首页 > 其他好文 > 详细

JVM调优系列:(三)类加载机制

时间:2015-07-02 10:18:07      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:java   jvm   

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

每个ClassLoader加载Class的过程是:

1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2

2.如果parent classloader不存在(没有parent,那parent一定是bootstrap),到4

3.请求parent classloader载入,如果成功到8,不成功到5

4.请求jvm从bootstrap classloader中载入,如果成功到8

5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.

6.从文件中载入Class,到8.

7.抛出ClassNotFoundException.

8.返回Class.

 

 

类执行机制

JVM的指令是从操作数栈中取得操作数,是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区,操作数栈和帧数据区组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。局部变量区和操作数栈的大小,编译器在编译时就确定了存放在class文件中.而帧数据区大小依赖于具体实现,这些信息用来支持常量池解析,正常方法返回以及异常派发机制.

 

32位HotSpot上要求64位/8字节对齐,HotSpot在C++代码中用instanceOopDesc类来表示Java对象,而该类继承oopDesc,oopDesc保存了java class的元数据信息,而Klass保存了java class的实际数据。klass就是用于描述GC堆上的对象的对针;如果一个对象的大小、域的个数与类型等信息不固定的话,它就需要特定的klass对象来描述。

instanceOopDesc用于表示Java对象,instanceKlass用于描述它,HotSpot并不把instanceKlass暴露给Java,而会另外创建对应的java.lang.Class对象,两者之间互相持有引用,如果自身却又有些不固定的信息需要被描述,因而又有instanceKlassKlass,如此下去会没完没了,所以有个klassKlass作为这个描述链上的终结符。

通过直接指针访问对象,klass的关系图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

JVM调优系列:(三)类加载机制

标签:java   jvm   

原文地址:http://blog.csdn.net/opensure/article/details/46715705

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!