1 java虚拟机构成
类加载系统 执行引擎 运行时数据区
运行时数据区包括 堆、栈、方法区、本地方法区、pc寄存器。其中堆、方法区是多线程共享的,其它的是线程安全的。
2 java虚拟机链接模型
装载 连接 初始化
装载的产物:
一个堆上的class实例:是连接类实例与方法区数据结构的桥梁,通过class实例,类的实例能够知道类本身的详细构成信息
方法区上的一个数据结构:用来描述一个类的的构成信息。包括:
所有方法的描述(参数,返回类型等等);所有超类的描述(如果有的话);所有实现了的接口列表(如果有的话);所有属性的描述;类加载器的索引。
虚拟机中的类,全路径构成是:类加载器名称+类的全路径
类加载器分为
启动类加载器:java核心api
系统类加载器:classpath下寻址
用户自定义类加载器:
类 加载器可以用来区分类,比如经常出现这种情况:在WEB-INF/lib下有两个jar包a.jar和b.jar,两个jar包中都包含 com.baidu.test.A.class,加载后就不知道虚拟接加载的是哪个类,这说明tomcat设置者用同一个类加载器来管理WEB- INF/lib下的class
连接:
分为验证、准备和解析。连接后,常量池中符号引用已经被替换为直接引用,
每个属性已经被分配了内存,整个类的信息已经被验证是合法的。
初始化:
只有类被主动使用时,才会触发初始化。主动使用的场景包括:
调用了类的main方法
通过反射构建了类的对象
调用了类的静态方法
访问了类的静态属性:如果直接访问父类的静态属性,那么只能导致父类被初始化,子类不会被初始化。
通过new关键字直接构建对象
还有一个忘了。
其它情况都是被动调用,不会触发类的初始化。