专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
51好读  ›  专栏  ›  ImportNew

JVM 源码分析之 Java 类的加载过程

ImportNew  · 公众号  · Java  · 2017-02-27 20:40

正文

请到「今天看啥」查看全文



  • 方法区分成PermGen和CodeCache:PermGen存放Java类的相关信息,如静态变量、成员方法和抽象方法等;CodeCache存放JIT编译之后的本地代码;


  • 更详细的相关内容可以阅读《JVM内存的那些事》(http://www.importnew.com/23629.html)。


    HotSpot对象模型


    HotSpot JVM并没有根据Java对象直接通过虚拟机映射到新建的C++对象,而是设计了一个oop/klass model,其中oop为Ordinary Object Pointer,用来表示对象的实例信息;klass用来保存描述元数据。


    Klass



    关于为何要设计oop/klass这种二分模型的实现,一个原因是不想让每个对象都包含vtbl(虚方法表),其中oop中不含有任何虚函数,虚函数表保存于klass中,可以进行method dispatch。


    oop



    oopDesc对象包含两部分数据:_mark 和 _metadata;


    1. _mark是markOop类型对象,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致,更具体的实现可以阅读 《 java对象头的HotSpot实现分析 》(http://www.importnew.com/23605.html)。


    2. _metadata是一个结构体,wideKlassOop和narrowOop都指向InstanceKlass对象,其中narrowOop指向的是经过压缩的对象;


    3. _klass字段建立了oop对象与klass对象之间的联系;


    HotSpot如何加载并解析class文件


    class文件在虚拟机的整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载7个阶段,通过ClassLoader.loadClass方法可以手动加载一个Java类到虚拟机中,并返回Class类型的引用。



    这里并没有自定义类加载器,而是利用ClassLoaderCase的类加载器进行加载类AAA。


    loadClass方法实现








    请到「今天看啥」查看全文