jvm
2021-03-08 21:05:47 63 举报
jvm原理
作者其他创作
大纲/内容
栈(线程)
打包
栈帧2(方法2)
直接内存
JVM由三部分组成:运行时数据区,类装载子系统,字节码执行引擎运行时数据区,也就是jvm的内存模型,分为堆,栈,方法区,本地方法区,程序计数器5个部分栈,即线程栈,每个线程各有一线程栈,由一系列栈帧组成,一个方法就是一个栈帧,栈帧中存储有:局部变量,操作数栈,方法出口,动态连接程序计数器,用于记录线程执行的字节码行号,每个线程都有自己的程序计数器本地方法栈,为native方法栈空间,与栈类似,存储了native方法的局部变量,操作数栈等信息堆:主要是存储对象方法区:在1.8之前的实现是持久区,在1.8及以后的实现是元空间,用于存储一些常量,静态变量和类元信息。使用的是程序之外的直接内存。
程序计数器,栈,本地方法栈都是每个线程独享的。栈中有一系列栈帧,每个栈帧都对应了一个方法。在栈帧中,有局部变量,操作数栈,动态连接和方法出口局部变量:定义在方法内部的变量,只在方法内部有效。如果变量存储的数据是引用类型,,数据存储在堆中,栈中变量只是记录了数据在堆中的内存地址。操作数栈:对每个字节码指令操作的数据进行压栈弹栈。比如执行int a=2的操作的代码。用javap -c *.class可以查看字节码文件的字节码指令0: iconst_2 将常量2压栈到操作数栈1: istore_1 将压栈的int数据存储到局部变量1,同时数据会被弹出操作数栈方法出口:每个栈帧都对应了一个方法,栈器是就是一系列方法的调用链,方法是在其他方法中调用入栈的。方法出口主要是记录了该栈帧对应的方法的结束位置动态连接:连接其实就是一些符号引用,动态连接是在程序运行期间才将其转成直接引用的符号引用。静态连接是在类加载的解析阶段转换的。
User.class
解析
程序计数器
记录指令行号
堆结构
Eden(8/10)
本地方法栈
栈
运行时数据区(内存模型)
加载
survivor
老年代(2/3)
栈帧1(方法1)
字节码执行引擎
验证
类加载过程
局部变量
方法出口
执行字节码
年轻代(1/3)
操作数栈
动态连接
线程1
线程2
to(1/10)
Math.javaUser.javaMain.java*.java
初始化
类装载子系统
JVM
准备
堆
java -jar Main.java main()
*.class
方法区(元空间)常量+静态变量+类元信息
from(1/10)
使用
收藏
收藏
0 条评论
下一页