JVM内存模型

类装载系统在这里插入图片描述

  1. 加载
    1. Bootstrap类加载器:加载$JAVA_HOME/jre/lib/rt.jar 里面所有的class文件
    2. Extension类加载器:加载一些扩展的jar包,包括$JAVA_HOME/jre/lib/*.jar或者-Djava指定目录下的jar
    3. Application类加载器: 加载classpath中指定的jar包及目录中的class
    4. Custom类加载器:应用程序自定义的类加载器,如tomcat、jboss都会根据j2ee规范自定义classLoader
  2. 连接
    1. 验证:字节码验证会校验生成的字节码是否正确,如果校验失败则会验证错误
    2. 准备:对所有的静态变量分配内存空间和设置默认值
    3. 解析:解析是从运行时常量池的符号引用动态确定具体值的过程。即:符号引用转换为直接引用。符号引用:字面上是引用 但是并没有真正指向内存地址
  3. 初始化
    执行Clinit方法,初始化静态变量的值,初始化静态代码块;初始化当前类的父类
运行时数据区

在这里插入图片描述

  1. 方法区
    存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。
    JDK8已经使用Metaspace(元空间)完全替代永久代(方法区),且元空间不在JVM中,是使用的本地内存,受操作系统内存限制

  2. 堆空间
    存放对象实例,几乎所有的对象实例都在这里分配内存。堆和常量池内存不足的时候,会报OutOfMemoryError

  3. 虚拟机栈
    对于每一个线程,JVM 都会在线程被创建的时候,创建一个单独的栈。也就是说虚拟机栈的生命周期和线程是一致,并且是线程私有的。

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。所有的局部变量都在栈内存中被创建,栈区域是线程安全的。

    栈内存用光了,会触发StackOVerFlowError

  4. 本地方法栈
    与虚拟机栈功能类似,只不过虚拟机栈为java方法服务,本地方法栈为native方法服务

  5. 程序计数器
    记录栈帧运行的位置。

Java执行引擎

通过类装载器装载的,被分配到JVM的运行时数据区的字节码会被执行引擎执行,执行引擎以指令为单位读取Java字节码,它像CPU一样一条一条
的执行指令,每个指令由一个字节的操作码和附加的字节操作数组成,执行引擎取得一个操作码,然后根据操作数来执行任务,完成一个,就执行下一个操作码。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值