深入理解JVM---虚拟机执行子系统

一、类机构

**编译:**本地机器码------->字节码 .class

分派:

同步指令
使用管程 Monitor
方法级同步
方法内部一段字领序列同步

二、类加载

程序执行,需要将字节码文件加载进入内存。
参照之前的jvm内存模型,JVM内存模型与垃圾回收, 应该是先加载进方法区,创建实例对象的时候需要先定位类描述符。

加载可以在编译期进行,也可以在运行期动态加载和动态连接。

1 类加载时机

类的生命周期:
类生命周期
必须初始化的情况:

  1. new,getstatic,putstatic ,invokestatic (new ,读取或者设置一个类的静态变量)
  2. 使用reflect 反射方法对类进行反射调用
  3. 初始化类,要先初始化其父类
  4. jvm启动时,指定执行的主类要先初始化
  5. 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)
自定义

破坏双亲委派模型

  1. JDK1.2之前
  2. JNDI服务,基础类需要回调用户代码 ,线程上下文类加载器
  3. 代码热替换。OSGI

三、执行引擎

解释执行

基于栈的指令集:java,可移植;执行速度稍慢,有频繁的内存访问
基于寄存器的指令集:寄存器由硬件直接提供

四、应用分析

Tomcat
OCGI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值