jvm虚拟机笔记<一> 内存区域
运行时数据区域:
程序计数器:字节码的行号指示器。
虚拟机栈:为每个方法创建一个栈帧(存放方法中的局部变量,变量引用等)。
本地方法栈:存放本地方法。
-------------------------------------------以上是线程独立的----------------------------------------------------
堆:存放对象实例
方法区:存放类的版本,字段,方法,接口和常量池(运行时常量池)。
------------------------------------------------线程共享------------------------------------------------------------
1、创建对象,在堆中开辟内存时是如何分配内存的?
两种方式:指针碰撞和空闲列表。我们具体使用的哪一种,就要看我们虚拟机中使用的是什么了。
指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存度放一边,空闲的内存放另一边,中间放着一个指针作为分界点的指示器,所分配内存就仅仅是把哪个指针向空闲空间那边挪动一段与对象大小相等的举例,这种分配方案就叫指针碰撞
空闲列表:有一个列表,其中记录中哪些内存块有用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,然后更新列表中的记录。这就叫做空闲列表
2、对象的内存布局:
对象头:自身运行时数据(哈希值,锁状态,持有的锁)+类型指针(确定其为哪个类的数据)
实例数据:各类型字段内容
对齐填充
3、对象引用是如何找到我们在堆中的对象实例的?
这个问题也可以称为对象的访问定位问题,也有两种方式。句柄访问和直接指针访问。 画两张图就明白了。
句柄访问:Java堆中会划分出一块内存来作为句柄池,引用变量中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息
直接指针访问:引用变量中存储的就直接是对象地址了,如图所示
使用句柄来访问的最大好处就是引用变量中存储的是稳定的句柄地址,对象被移动(在垃圾收集时移动对象是很普通的行为)时就会改变句柄中实力数据指针,但是引用变量所指向的地址不用改变。
而使用直接指针访问方式最大的好处就是速度更快,节省了一次指针定位的时间开销,但是在对象被移动时,又需要改变引用变量的地址。
最新文章
- 【Android】Android如何一进入一个activity就弹出输入法键盘
- 初入网络系列笔记(2)TCP和UDP
- PE440
- 关于启动ubuntu中的nfs启动问题
- ODATA 云驱动 http://www.cdata.com/cloud/
- Daily Scrum 10.30
- C#高级进阶--重写函数
- css3过渡transition
- oracle 删除表、表空间、用户时,如何释放磁盘空间
- ubuntu为Python添加默认搜索路径
- Android 从java字节码告诉你 为什么Handler会造成内存泄露
- Helpers\Document
- 【转载】高性能I/O设计模式Reactor和Proactor
- 通过 Composer Github Packagist制作发布共享PHP包
- python中基本类型的连接组合和互相转换
- 前端异步的一种方法库:axios
- asp.net core mvc 中在C# 代码中写 js 或html 文本
- java新的语法糖:Java 8 Lambda表达式
- [Jmeter]Xpath获取元素某个属性的值,以及获取最后一个元素某个属性的值
- Autofac创建实例的方法总结[转]
热门文章
- css设置使文字显示2行多余的为省略号。。。
- 如何";快准狠";找到内存相关的问题
- 面试连环炮系列(十四): HTTP状态码302的跳转逻辑
- 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析
- C#线程学习笔记七:Task详细用法
- linux 删除.svn文件
- mysql-5.7.21-winx64安装教程
- CSDN不限积分代下载,知网、万方、sci、IEEE论文代下载,智慧树、超星尔雅刷课
- javax.servlet.ServletException: Could not resolve view with name &#39;order/list&#39; in servlet with name &#39;dispatcherServlet&#39;
- Centos 下安装 Nginx(新)