首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

jvm 学习笔记与总结

复制代码 虚拟机栈 定义:java 虚拟机栈 是描述Java 方法运行过程的内存模型 压栈出栈过程: 当方法运行过程中需要创建局部变量时,会将局部变量的值存入栈帧中的局部变量表中 java 虚拟机栈的栈顶的栈帧是当前正在执行的活动栈...,也就是当前正在执行的方法,pc寄存器会指向这个地址,只有这个活动的栈帧的本地变量可以被操作数栈使用,当在这个栈帧中调用另一个方法,与之对应的栈帧又会被创建,新创建的栈帧压入栈顶,变为当前的活动栈帧。...方法结束后,当前栈帧被移出,栈帧的返回值变成新的活动栈帧中操作数栈的一个操作数。如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化。...对齐填充(Padding) 对象头:哈希码,gc分代年龄,线程持有的锁,线程id 实例数据:实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。...:分配完内存后,为对象中的成员变量赋上初始值,设置对象头信息,调用对象的构造函数方法进行初始化。

21110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    jvm入门2:3-5运行时数据区+程序技术器+虚拟机栈

    5字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令6唯一一个在java虚拟机规范中没有规定任何outofmemoryerror情况的区域使用pc集群器存储字节码指令地址有什么用...;4当一个实例方法被调用的时候,它的方法参数和方法内部定义的局部变量会按照顺序被复制盗局部变量表的一个slot上;5如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用一个索引即可;6如果当前帧是由构造方法或者实例方法创建的...静态变量表与局部变量的对比1参数表分配完毕后,再根据方法体内定义的变量顺序和作用域分配;2类变量表有两次初始化机会,第一次是在准备阶段,执行系统初始化,对类变量设置零值,另一次是在初始化阶段,赋予程序员在代码中定义的初始值...数据类型,32bit的类型占用一个栈单位深度,64bit的占两位5操作数栈并非采用访问索引的方式来进行数据访问,只能通过标准的入栈和出栈的操作完成一次数据访问6如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中...,并更新pc寄存器中的下一条需要执行的字节码指令7操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,这由编译器在编译期间进行验证,同时在类加载过程中的类检验阶段的数据流分析阶段再次验证8java虚拟机栈的引擎是基于栈的执行引擎

    9010

    深入浅出Java中JVM内存管理

    ⑤ 本地方法栈 (C栈):为JVM提供使用native方法的服务 通过这幅图了解一下 JDK 1.8同JDK 1.7 ,最大的区别是:元数据取代了永久代.元空间的本质和永久代类似,都是对JVM规范中的方法区的实现....其元空间和永久代之间的最大区别在于:元数据空间不在虚拟机中,而是在本地内存中 详细了解一下各个部分 01)程序计数器(PC寄存器) 程序计数器的定义: 程序计数器是一块较小的内存空间,是当前线程正在执行的哪一条字节码指令的地址...压栈出栈过程: 当方法运行过程中需要创建局部变量时,就将局部变量的值存入栈帧的局部变量表中 Java虚拟机栈的栈顶是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向这个地址,只有这个活动的栈帧的本地变量可以被操作数栈操作...,当前这个栈帧中调用另一个方法,与之对应的额栈帧又会被创建,新创建的栈帧压入栈顶,变成当前的活动栈帧,方法结束后,当前栈帧的返回值变成新的活动栈帧的中的操作数栈的一个操作数,如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化...对象的堆内存由成为垃圾回收器的自动内存管理系统回收 非堆内存分配: ①:JVM使用-XX:PermSize 设置非堆内存的初始值,默认物理内存的1/64; ② :由XX:MaxPermSize设置设置最大非堆内存的大小

    49920

    JVM-运行时数据区概述及虚拟机栈

    ,由执行和引擎读取下一条指令 它是程序控制流的指示器,分支、循环跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令...(栈顶栈帧),这个栈帧被称为当前栈帧(Current Frame),与当前栈帧相对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class) 执行引擎运行的所有字节码指令只针对当前栈帧进行操作...) 方法返回地址(Return Address)(或方法正常退出或者异常退出的定义) 一些附加信息 局部变量表 局部变量表也被称之为局部变量数组或本地变量表 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量...64bit的局部变量值,值需要使用前一个索引即可(比如:访问long或double类型变量) 如果当前帧是由构造方法或者实例方法创建的那么改对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序继续排列...,这由编译器在编译器期间进行验证,同时在类的加载过程中类检验阶段的数据流分析阶段要再次验证、 Java虚拟机的解释引擎是基于栈的执行引擎。

    44030

    再次理解java

    执行引用所运行的所有字节码指令都只针对当前栈帧进行操作。 1.局部变量表 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。...局部变量表中的Slot是可重用的,方法体中定义的变量,其作用域并不一定会覆盖整个方法,如果当前字节码PC计算器的值已经超出了某个变量的作用域,那么这个变量对应的Slot就可以交给其它变量使用。...局部变量不像前面介绍的类变量那样存在“准备阶段”。类变量有两次赋初始值的过程,一次在准备阶段,赋予系统初始值;另外一次在初始化阶段,赋予程序员定义的值。...因此即使在初始化阶段程序员没有为类变量赋值也没有关系,类变量仍然具有一个确定的初始值。但局部变量就不一样了,如果一个局部变量定义了但没有赋初始值是不能使用的。...让下栈帧的部分操作数栈与上面栈帧的部分局部变量表重叠在一起,这样在进行方法调用返回时就可以共用一部分数据,而无须进行额外的参数复制传递了,重叠过程如下图: 3.动态连接 每个栈帧都包含一个指向运行时常量池中该栈帧所属性方法的引用

    53320

    JVM GC 那些事(一)- JVM 运行时内存划分

    下面进行一一介绍 程序计数器 是一块比较小的内存区域 用来记录当前线程执行到的字节码行号 由于只是用来记录行号,所以不存在内存溢出情况,是 JVM 内存区域中唯一一个没有定义 OutOfMemoryError...的区域 每个线程都需要一个程序计数器用来记录执行哪行字节码,所以程序计数器是线程私有的 虚拟机栈 每个方法调用时,线程都要为该方法创建一个栈帧,主要用来保存该函数的返回值、局部变量表(用于存放方法参数和方法内部定义的局部变量...)动态连接、操作数栈(保存数据类型)等 当方法被调用时,栈帧在虚拟机栈中入栈,当方法执行完成时,栈帧出栈 一个线程中的方法调用可能会很长,很多方法处于执行状态。...在线程中,只有虚拟机栈顶的栈帧才是有效的,称为当前栈帧,该栈帧所关联的方法称为当前方法 虚拟机栈中,定义了两种异常: StackoverflowError:当线程调用的栈深度大于虚拟机允许的最大深度...、异常类型方面都与虚拟机栈相同,唯一的区别:虚拟机栈是执行 Java 方法的,而本地方法是用来执行 native 方法的(naive 是与 C/C++ 联合开发的时候使用的,使用 naive 关键字说明这个方法是

    26710

    JAVA内存学习总结

    这里细分主要涉及到垃圾回收机制时,后面有GC的详细介绍; Java虚拟机栈(JVM Stack):一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有局部变量表、...局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。...字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。 每个程序计数器只用来记录一个线程的行号,所以它是线程私有(一个线程就有一个程序计数器)的。...如果程序执行的是一个Java方法,则计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是一个本地(native,由C语言编写 完成)方法,则计数器的值为Undefined,由于程序计数器只是记录当前指令地址...,所以不存在内存溢出的情况,因此,程序计数器也是所有JVM内存区 域中唯一一个没有定义OutOfMemoryError的区域。

    42830

    JVM运行时数据区和各个区域的作用

    不是JVM运行时数据区的一部分,也不是JVM虚拟机规范中定义的内存区域。但这部分内存也被频繁的使用。所以放到一起。...所以局部变量需要手工初始化,如果一个局部变量定义了但没有赋初始值是不能使用的。 操作数栈: 所谓操作数是指那些被指令操作的数据。...方法退出的过程实际上等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值(如果有的话)压入调用者栈帧的操作数栈中,调整PC计数器的值以指向方法调用指令后面的一条指令等...这样在下面的栈帧会有部分操作数栈与上面栈帧的部分局部变量表重叠在一起,这样在进行方法调用时就可以有部分数据共享,而无须进行额外的参数复制传递了。...各线程调用的方法,通过堆内的对象,方法区的静态数据,可以共享交互信息。 各线程调用的方法所有参数传递、方法返回值的返回,都是使用栈帧里的操作数栈来完成的。

    1.3K10

    JVM之字节码执行引擎

    其模型示意图大体如下: 局部变量表 局部变量表是变量值的存储空间,由方法参数和方法内部定义的局部变量组成,其容量用Slot作为最小单位。...由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。 在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。...我们知道类变量表有两次初始化的机会,第一次是在“准备阶段”,执行系统初始化,对类变量设置零值,另一次则是在“初始化”阶段,赋予程序员在代码中定义的初始值。...和类变量初始化不同的是,局部变量表不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。...操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,这由编译器在编译器期间进行验证,同时在类加载过程中的类检验阶段的数据流分析阶段要再次验证。

    35520

    粗谈Java虚拟机之内存管理

    总结:它存放的是java方法执行时的所有数据。 由栈帧组成一个栈帧代表一个方法的执行。 Java栈帧 每个方法从调用到执行完成对应一个栈帧在虚拟机中的入栈到出栈。 结构图: ?...image 栈帧由局部变量区、操作数栈和帧数据区组成。当虚拟机调用一个Java方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并根据此分配栈帧内存,然后压入Java栈中。...局部变量区 局部变量区被组织为以字长为单位、从0开始计数的数组。字节码指令通过从0开始的索引使用其中的数据。...该区域同样会报StackOverflowError 方法区 1.3 方法区 用于存储被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。...字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。

    49921

    Java内存区域有哪些构成?

    经常与Java内存模型(JMM)混淆,其定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。...偏硬件概念 由于程序计数器保存了 下一条指令要执行地址,所以在JVM中,执行指令的一般过程:执行引擎会从 程序计数器中获得下一条指令的地址,拿到其对应的操作指令,对其进行执行,当该指令结束,字节码解释器会根据...栈帧在虚拟机栈中入栈到出栈(顺序: 先进后出)的过程,其实就对应Java中方法的调用至执行完成的过程 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素,每个栈帧存储了方法的变量表...方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。...,而全局变量是放在堆的,有两次赋值的阶段,一次在类加载的准备阶段,赋予系统初始值;另外一次在类加载的初始化阶段,赋予代码定义的初始值。

    33020

    【吊打面试,击中要害】JVM内存模型

    每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法。...就像是组成动画的一帧一帧的图片,方法的调用过程也是由栈帧切换来产生结果。...0x04:堆(Heap) Heap是OOM故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用;通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象...0x05:方法区(Method Area) 方法区是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据...在使用到CGLib对类进行增强时,增强的类越多,就需要越大的方法区类存储动态生成的Class信息,当存放方法区数据的内存溢出时,会报OutOfMemoryError异常。

    32120

    【云+社区年度征文】详解JVM运行时数据区

    这是《深入理解Java虚拟机》书籍对程序计数器的介绍,事实上,在此基础应该补充上,程序计数器是线程私有,在执行Java方法时有值,但是在执行native方法时,程序计数器值为空。...由于该方法是通过C/C++而不是java进行实现。那么自然无法产生相应的字节码,并且C/C++执行时的内存分配是由自己语言决定的,而不是由JVM决定的。...每一个方法被调用直至执行完毕的时候,就对应着一个栈帧从入栈到出栈的过程。 看到上面这么长的定义可能有点懵逼,栈帧是个啥,里面存的都是些啥玩意,我学它干啥,搞得挺痛苦的。...来一张图看看 虚拟机栈里存储的是一个个栈帧,栈帧里面包含啥啊?下面,我们下先看一张图来直观感受下 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。...它是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存数据,这些信息是由类加载时从类文件中提取出来的。

    47050

    java内存管理(上)

    虚拟机栈(栈内存) :保存局部变量,基本数据类型以及堆内存中对象的引用变量 本地方法栈  (C栈):为JVM提供使用native方法的服务 通过这幅图了解一下 JDK 1.8同JDK 1.7 最大的区别是...:元数据取代了永久代.元空间的本质和永久代类似,都是对JVM规范中的方法区的实现.其元空间和永久代之间的最大区别在于:元数据空间不在虚拟机中,而是在本地内存中 程序计数器(PC寄存器) 程序计数器的定义...生命周期:随着线程的创建而创建,随着线程的销毁而销毁 是一个唯一不会出现的OutOfMemoryError的内存区域 Java虚拟机栈 定义: 描述Java方法运行过程的内存模型 Java虚拟机栈会为每一个即将运行的...Java方法创建一块叫做”栈帧”的区域,用于存放该方法运行过程中的一些信息,如  局部变量表  /操作数栈  /动态链接 /方法出口信息 压栈出栈过程 当方法运行过程中需要创建局部变量时,就将局部变量的值存入栈帧的局部变量表中...,新创建的栈帧压入栈顶,变成当前的活动栈帧,方法结束后,当前栈帧的返回值变成新的活动栈帧的中的操作数栈的一个操作数,如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化 由于Java虚拟机栈是线程对应的

    69810

    JVM内存模型

    每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法。...就像是组成动画的一帧一帧的图片,方法的调用过程也是由栈帧切换来产生结果。...局部变量表存放了编译器可知的各种基本数据类型(int、short、byte、char、double、float、long、boolean)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针...0x04:堆(Heap) Heap是OOM故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用;通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象...0x05:方法区(Method Area) 方法区是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。

    31450

    001. 深入JVM学习—Java运行流程

    Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存到栈(先进后出)的顶部,方法执行完毕后会自动将此栈帧进行出栈...图介绍 栈帧主要组成成分 局部变量表(Local Variables):方法的局部变量或形参,其以变量曹槽(solt)为最小单位,只允许保存32位长度的变量,如果超过32位则会开辟两个连续的solt...栈因为是运行单位,里面存储的信息都跟当前线程(或程序)相关的信息。包括局部变量、程序运行状态、方法返回值等等; 堆只是保存对象信息。 图解 5....Java程序中可以使用native关键字实现本地C函数的调用。但是这些都属于程序运行的辅助手段,而真正的程序都运行在“运行时数据区”之中。...运行时数据区分为以下几个内存空间: 堆内存:保存所有引用数据类型的真实信息; 栈内存:基本类型、运算、指向堆内存的指针; 方法区:所有定义的方法的信息都保存在此区之中,此区属于共享区; 程序计数器:

    30310

    HART报文详解

    用于潜在的扩展,长度由其实字节指示 命令 1字节 表示这条数据的作用 字节计数 1字节 状态和数据部分的大小...前导码由一系列相同的字节组成,通常是连续的"FF"字节(在二进制中为11111111)。前导码的主要作用包括几个方面:同步:前导码为接收设备提供了同步信号,帮助接收设备确定数据帧的开始位置。...这使得操作者可以更准确地控制设备,同时优化系统的整体性能。改进的诊断能力:扩展字段可以包含有关设备状态和健康的详细信息,使得对设备进行远程监控和诊断成为可能。这有助于提前发现问题,减少系统停机时间。...常用实践34 写主要变量阻尼值 常用实践35 写主要变量量程值使用命令35写入的数据将更新菜单中的4mA和20mA...(没有映射到主变量)超限0x01主变量超出极限 2.2.7 数据数据部分格式取决于命令的不同,均由不同的命令定义。

    35700

    JVM 内存结构

    不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址...压栈出栈过程 当方法运行过程中需要创建局部变量时,就将局部变量的值存入栈帧中的局部变量表中。...只有这个活动的栈帧的本地变量可以被操作数栈使用,当在这个栈帧中调用另一个方法,与之对应的栈帧又会被创建,新创建的栈帧压入栈顶,变为当前的活动栈帧。...方法结束后,当前栈帧被移出,栈帧的返回值变成新的活动栈帧中操作数栈的一个操作数。如果没有返回值,那么新的活动栈帧中操作数栈的操作数没有变化。...它可以通过调用本地方法直接分配 Java 虚拟机之外的内存,然后通过一个存储在堆中的DirectByteBuffer对象直接操作该内存,而无须先将外部内存中的数据复制到堆中再进行操作,从而提高了数据操作的效率

    59520

    20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

    PC寄存器(程序计数器) 这里的寄存器并不是广义上所指的物理寄存器,而是对物理寄存器的抽象模拟,把它称为PC计数器(或指令计数器)更为合适。...每一个操作数栈都会拥有一个明确的栈深度用于存储数据值,其所需要的最大深度在编译期间就定义好了,保存在方法的code属性中,为max_stack的值(与上边局部变量表类似)。...操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,这由编译器在编译期间进行验证,同时在类加载过程中的类检验阶段的数据流分析阶段要再次验证。...同步骤2和3将8先放入操作数栈,然后取出来存到局部变量表中,PC寄存器中的值也由3->5->6; 当执行到地址指令为6、7、8时,将局部变量表中索引位置为1和2的数据重新加载到操作数栈中并进行iadd...加操作,将得到的结果值存到操作数栈中,PC寄存器中的值也由6->7->8->9; 执行操作指令istore_3,将操作数栈中的数据取出存到局部变量表中索引为3的位置,执行return指令,方法结束。

    66240
    领券