一、类机构
**编译:**本地机器码------->字节码 .class
分派:
同步指令
使用管程 Monitor
方法级同步
方法内部一段字领序列同步
二、类加载
程序执行,需要将字节码文件加载进入内存。
参照之前的jvm内存模型,JVM内存模型与垃圾回收, 应该是先加载进方法区,创建实例对象的时候需要先定位类描述符。
加载可以在编译期进行,也可以在运行期动态加载和动态连接。
1 类加载时机
类的生命周期:
必须初始化的情况:
- new,getstatic,putstatic ,invokestatic (new ,读取或者设置一个类的静态变量)
- 使用reflect 反射方法对类进行反射调用
- 初始化类,要先初始化其父类
- jvm启动时,指定执行的主类要先初始化
- MethodHandle 动态语言,REF_getStatic,REF_putStatic,REF_invokeStatic方法句柄对应的类要初始化
-XX:+TraceClassLoading
2 类加载过程
2.1 加载
加载完会有Class对象(未明确规定在堆内存),静态存储结构会在方法区,文件二进制字节流会按jvm需要的格式存在方法区。
2.2 验证
-Xverify:none 可以关闭大部分验证,缩短jvm验证时间
2.3 准备
为类变量分配内存并设置类变量初始值(通常为0)。 方法区
static
2.4 解析
常量池(方法区)中的符号引用替换为直接引用
2.5 初始化
. 类的初始化是线程安全的,只会执行一次
3 类加载器
双亲委派模型
启动 BootStrap <JAVA_HOME>\lib. or -Xbootclasspath
扩展 Extension <JAVA_HOME>\lib\ext
应用程序 Application getSystenClassLoader() 返回值 用户类路径(ClassPath)
自定义
破坏双亲委派模型
- JDK1.2之前
- JNDI服务,基础类需要回调用户代码 ,线程上下文类加载器
- 代码热替换。OSGI
三、执行引擎
解释执行
基于栈的指令集:java,可移植;执行速度稍慢,有频繁的内存访问
基于寄存器的指令集:寄存器由硬件直接提供
四、应用分析
Tomcat
OCGI