没有合适的资源?快使用搜索试试~ 我知道了~
java内存结构分析java内存结构java栈结构分析:栈帧局部变量表操作数栈动态连接返回地址运行时常量池对象的创建过程类加载的执行流程图对象创建的过程:对象内存分配方式指针碰撞空闲列表栈上分配:内存逃逸:对象结构分析对象的内存引用分析直接引用图解句柄池引用 java内存结构 我们根据线程是否共享将java内存结构分成两部分: 线程共享区域 堆 方法区(1.8成为元区间) 线程独占区域 栈 本地方法栈 PC寄存器(程序执行到的位置) java栈结构分析: 我们先看一下栈的结构图 接下来我们详细看一下每一个部分具体作用 栈帧 每一个方法的执行就是一个栈帧,而且在栈内存中
资源推荐
资源详情
资源评论
【【jvm】】01- java内存结构分析内存结构分析
java内存结构分析内存结构分析java内存结构java栈结构分析:栈帧局部变量表操作数栈动态连接返回地址运行时常量池对象的创建过程类加载的执行流程图对象创建的过程:对象内存分配方式
指针碰撞空闲列表栈上分配:内存逃逸:对象结构分析对象的内存引用分析直接引用图解句柄池引用
java内存结构内存结构
我们根据线程是否共享将java内存结构分成两部分:
线程共享区域
堆
方法区(1.8成为元区间)
线程独占区域
栈
本地方法栈
PC寄存器(程序执行到的位置)
java栈结构分析:栈结构分析:
我们先看一下栈的结构图
接下来我们详细看一下每一个部分具体作用
栈帧栈帧
每一个方法的执行就是一个栈帧,而且在栈内存中遵循先进后出的原理。听到这里,是不是感觉不是很懂(大佬直接忽略)?
我们来看一个示例:
这里先提一个小的概念:
每一个方法就是一个栈帧
入栈:方法执行的时候就会入栈,放的栈的底部。
出栈:方法执行结束就会出栈。
1.,当main方法开始执行,就会进行入栈(压栈)操作,main方法就在整个栈结构的最底部
2. main方法里调用add方法,add方法也是一个栈帧,进行了入栈操作
3. 当add方法执行结束,add方法会执行出栈(弹栈)操作。
4. add方法执行结束,main方法也会执行完毕
5. 这样就可以印证了栈的先进后出原理
局部变量表局部变量表
用户存放方法参数和方法运行途中生成的变量
操作数栈操作数栈
当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。例如,在做算术运算的时候
是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。
动态连接动态连接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。
返回地址返回地址
当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇见异常,并且这个异常没有在方法体内得到处理。
这里我们运用反汇编指令查看目录结构这里我们运用反汇编指令查看目录结构
类文件进行编译
javac StackStructure.java
类文件进行反汇编编译
javap -c StackStructure
然后截图看下反汇编后的add方法
public static void add();
Code:
0: bipush 100
2: istore_0
3: bipush 100
5: istore_1
6: iload_0
7: iload_1
8: iadd
9: istore_2
10: return
我们将相应的汇编指令放在这里
bipush 将一个8位带符号整数压入栈 (这里的栈指的是操作数栈)
istore_0 将int类型值存入局部变量0
istore_1 将int类型值存入局部变量1
iload_0 从局部变量0中装载int类型值
iload_1 从局部变量1中装载int类型值
iadd 执行int类型的加法
istore_2 将int类型值存入局部变量2
我们通过反汇编指令来分析一下栈的各个结构的作用,我们对比上面的汇编指令进行相应的翻译
将100整数压入操作数栈
0: bipush 100
2. 将int类型的100存入局部变量表的a中
2: istore_0
剩余12页未读,继续阅读
资源评论
weixin_38597889
- 粉丝: 12
- 资源: 987
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功