JVM内存区域划分以及句柄访问和指针访问的区别

JVM内存区域有哪些?为什么这么划分?

程序计数器,栈,本地方法栈,堆,方法区;
各个内存区域存储各种数据,使内存分配占用更加合理,查询效率高;
简单说说程序各个内存区域存储了哪些数据:
程序计数器:代码运行的行数 无 O O M 情 况 的 区 域 \color{red}{无OOM情况的区域} OOM
栈:对象的引用 基 本 数 据 类 型 , 栈 帧 , 局 部 变 量 表 , 操 作 数 栈 , 方 法 出 口 \color{red}{基本数据类型,栈帧,局部变量表,操作数栈,方法出口}
本地方法:native方法
堆:对象的存储空间
方法区:类对象, 常 量 池 ( j a v a 8 ) 静 态 变 量 \color{red}{常量池(java8)静态变量} java8,编译后的代码

上面属于基本要答到的点,可以延伸的内容:
1.什么是栈帧?栈里面存放的元素叫栈帧,每个方法从调用到执行结束,其实是对应一个栈帧的入栈和出栈。
2.StackOverflowError什么情况会产生?递归。栈是否会OOM?会的,栈的存储空间的动态扩展
3.对象是如何访问的?各有什么优劣势?
在这里插入图片描述

在这里插入图片描述

句柄访问:栈中存储的reference指向堆中的句柄池地址,句柄中存储了到对象数据的指针,该指针再指向对应的对象数据(堆中)和对象类型数据(方法区中)。
直接指针访问:栈中存储的reference直接指向堆中存储的对象数据(包含对象类型数据的指针)。
优劣势分析:使用句柄来访问的最大好处就是引用变量中存储的是稳定的句柄地址,对象被移动(在垃圾收集时移动对象是很普通的行为)时就会改变句柄中实力数据指针,但是引用变量所指向的地址不用改变。
而使用直接指针访问方式最大的好处就是速度更快,节省了一次指针定位的时间开销,但是在对象被移动时,又需要改变引用变量的地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值