JVM运行时数据区总结以及对形象的内存布局
来源:互联网 发布:聚游网络散人 编辑:程序博客网 时间:2024/06/08 02:34
一,数据区
1)程序计数器,线程私有,也就是一个线程对应一个程序计数器,它的作用是为线程指示指令的地址,唯一没有规定OutOfMemoeyError的区域。
2)java虚拟机栈,线程私有,也就是一个线程对应一个栈,线程在调用方法和执行完方法的时候分别对应入栈和出栈的过程,因为是栈的数据结构,非常适合方法调用这样的后进先出的方式,每一个方法对应一个栈帧,栈帧主要有局部变量区(保存局部变量和参数)和操作数栈(方法执行运算过程的中间结果)。
3)本地方法栈,线程私有,类似于java虚拟机栈,只是这里对应Native方法的调用。
4)java堆:非线程私有,存放对象实例和数组的数据区,-Xms,-Xmx控制最小和最大。
5)方法区:非线程私有,存放类信息,常量,符号引用,静态变量,JIT编译的代码。
当中方法区包括一个叫做运行时常量池的数据区,对应Class文件的常量池,放字面量(字符串和final定义的常量)和符号引用,一般解析出来的直接引用也存放在运行时常量池。
6)直接内存:在堆保存一个地址,地址指向堆外的内存,javaNIO有可能会用到,能显著提升性能。
二,创建对象
1,是否加载:当线程遇到一个new指令的时候,会在运行时常量池查看这个对象所属类是否被加载,如果没有会执行响应的加载,验证,准备等过程,如果加载了就可以跳过这个步骤。
2,分配内存,这里注意线程先是在实现定好的内存上分配,当不够的时候才进行相应的扩展,这是为了多线程分配内存的安全性,还有就是虚拟机根据内存是否连续来分配,例如老年代串行gc和并行gc采用的标记整理算法,内存是连续的,而并发gc是标记清楚gc,内存是不连续的。
3,将分配的内存空间初始化零值。
4,执行紧跟在new指令后面的init指令进行字段的初始化。
三,对象的内存布局
对象包含(运行时数据和类型指针(表示属于哪个类)),对象头,对象数据,对齐填充。
hotspot的对象定位:先冲栈上的reference数据指向堆中的对象,对象的对象头中的类型指针指向方法区中的对象类型数据。
0 0
- JVM运行时数据区总结以及对形象的内存布局
- JVM--运行时数据区以及对象的创建,内存布局、访问
- JVM运行时内存布局
- jvm内存模型(运行时数据区)
- jvm 运行时内存数据区
- JVM运行时数据区总结分享
- JVM运行时内存数据区结构及内存参数
- JVM的内存分区----运行时的数据区域
- java JVM的内存区域(运行时数据区域)
- java JVM的内存区域(运行时数据区域)
- java JVM的内存区域(运行时数据区域)
- java JVM的内存区域(运行时数据区域)
- 【jvm】JAVA运行时数据区与内存分配
- Java内存区域 JVM运行时数据区
- JVM内存管理-运行时数据
- JVM运行时的数据区
- JVM运行时的数据区
- jvm的运行时数据区
- 菜鸟写给菜鸟的 ——LeetCode解题笔记 Easy-题目1:292. Nim Game
- postgresql 安装
- Java多态
- 【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding
- [leetcode] 【链表】83. Remove Duplicates from Sorted List
- JVM运行时数据区总结以及对形象的内存布局
- Hdu-5335 Walk Out (BFS+贪心)
- latex 调整文本与公式之间的距离
- linux重启mysql
- nginx+tomcat+redis集群环境搭建
- poj3181 Dollar Dayz (DP+大数)
- 多个Button绑定监听事件,简化代码方法
- Java Annotation 必须掌握的特性
- WSUCSTAT