正文
方法区分成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;
-
_mark是markOop类型对象,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致,更具体的实现可以阅读 《 java对象头的HotSpot实现分析 》(http://www.importnew.com/23605.html)。
-
_metadata是一个结构体,wideKlassOop和narrowOop都指向InstanceKlass对象,其中narrowOop指向的是经过压缩的对象;
-
_klass字段建立了oop对象与klass对象之间的联系;
HotSpot如何加载并解析class文件
class文件在虚拟机的整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载7个阶段,通过ClassLoader.loadClass方法可以手动加载一个Java类到虚拟机中,并返回Class类型的引用。
这里并没有自定义类加载器,而是利用ClassLoaderCase的类加载器进行加载类AAA。
loadClass方法实现