深入理解JVM--JVM结构

深入理解JVM--JVM结构

JVM模型:

在这里插入图片描述

  1. 虚拟机栈(JVM Stack):一个线程对应一个JVM Stack,一个JVM Stack中包含一组栈帧(Stack Frame),栈帧是一组数据结构,封装了方法的局部变量表,动态链接信息,方法的返回地址以及操作数栈等信息。每一个方法都是一个对应的“帧”,方法的运行实际上就是入栈和出栈的过程。 栈帧的结构图:在这里插入图片描述
    1. 局部变量表(LocalVariableTable):
      1. 每一个方法都有对应的局部变量表,用于存储方法中的局部变量,局部变量的个数≥1,所有方法都会默认传入this变量
      2. 局部变量的容量以 变量槽(Variable Slot) 为最小单位,每个slot占据32个字节,执行实例方法时,索引为0的slot默认存储this变量,其它变量从1索引处开始存储
      3. 基本数据类型在局部变量表中占据1个 slot,但是大数据类型,long和double占据2个slot
    2. 动态连接: 可以看作不可使用的指针,指向位于常量池中的实例对象,引用访问对象的方式有2种,JVM一般使用第二种
      1. 句柄方式:引用指向堆中的一个句柄,该句柄一部分存储堆中目标实例对象的真实地址,另一部分存储方法区中实例对象的class对象的真实地址
      2. 直接指针方式:该引用指向堆中的一个对象,该对象一部分存储目标实例对象,另一部分依旧存储方法区中实例对象的class对象的真实地址
      3. 与动态连接相对应的是静态解析,即在类的加载阶段即将类中静态变量的符号引用转换为直接引用。值得注意的是:类中的静态变量会在类的加载阶段和类的真实class对象一起存储在方法区中。
    3. 操作数栈: 与我们认知中的栈结构相似,先进后出的数据结构,里面主要通过相关代码(助记符)来操作方法中的局部变量与局部变量表(bytecode/MyTest08)
    4. 返回地址: 方法开始执行后,只有 2 种方式可以退出 :方法返回指令,异常退出。
    5. 栈数据区: 帧数据区的大小依赖于 JVM 的具体实现。
    6. 可以在运行设置中用-Xss指令来指定栈所占用的最大内存,如:-Xss160k
  2. 本地方法栈: 主要用于处理本地方法(即不是由JAVA语言编写,而是由C或C++编写的方法),运行方式与虚拟机栈相似,在一些JVM中,会把本地方法栈和虚拟机栈合为一起。
  3. 程序计数器: 记录着当前线程所执行的字节码的行号指示器
  4. 堆(Heap):
    1. JVM 管理的最大的一块内存空间,主要用于存放Java类的实例对象,其被划分为两个不同的区域:新生代 ( Young )和老年代 ( Old ),其中新生代 ( Young )又被划分为:Eden、From Survivor和To Survivor三个区域
    2. 堆中存储实例对象有2种方式,一般是第二种
      1. 指针碰撞(前提是堆中的空间是连续的且通过一个指针分割,一边是已被占用的内存,另一边是未被占用的内存)
      2. 空闲列表(前提是堆中的内存是不连续的且已被使用的空间和未被使用的空间交织在一起,这时,虚拟机需要通过一个列表来记录
    3. new关键字创建对象的3个步骤
      1. 在堆内存中创建对象实例(new)
      2. 为对象中的实例变量赋值(invokespecial)
      3. 将对象的引用返回(dup)
      4. new语句一共会消耗12个bytes,JVM规定引用占4个bytes,空对象占8个bytes
    4. 可用 -Xms1m -Xmx1m 指定堆的最小内存和最大内存,如上面的指令代表最小内存与最大内存均为1m
  5. 方法区
    1. JDK1.7前的永久代(Permanent Generation)其实是方法区的实现,方法区和永久代是不同的,从JDK 1.8开始,已经废弃永久代。使用元空间(meta space),用于存储静态变量、元数据(class对象)与常量池,元空间深度解析:https://www.infoq.cn/article/Java-permgen-Removed
  6. JVM监视调优相关工具
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值