java运行时的内存分布与对象的内存布局
2018-02-26 21:00
155 查看
理解java虚拟机时,一个重要的内容就是了解虚拟机在运行时如何为对象分配内存。根据内存是线程私有的,还是公共的,可以分为两部分。一部分是公共的,包括:堆,方法区。另一部分是线程私有的,包括:虚拟机栈,本地方法栈,程序计数器。
虚拟机栈是线程私有的,保存一些局部变量,线程在进行函数调用时,采用先进后出的栈帧。程序计数器用来指示当前程序执行到哪里,是java中唯一一个不会抛OutOfMemoryError的区域。本地方法栈与虚拟机栈比较类似,只不过虚拟机栈用来执行java方法,而本地方法栈用来执行本地方法(与平台相关)。
堆是java虚拟机中用的最多的内存,也是进行垃圾回收的区域。每个对象实例和数组,都分配在堆里面。方法区存放着类信息,static修饰的类静态变量,常量池以及编译后的代码。
还有一部分内存不属于虚拟机运行时的内存,即直接内存。直接内存是jdk1.4引入NIO后,基于通道和缓存使用native本地库函数直接操作堆外内存的方式,避免了java堆内存和native堆内存的复制,提高了效率。
对象在内存中的布局主要分为三部分:对象头(Mark Word和类型指针),实例数据,对齐填充。
虚拟机栈是线程私有的,保存一些局部变量,线程在进行函数调用时,采用先进后出的栈帧。程序计数器用来指示当前程序执行到哪里,是java中唯一一个不会抛OutOfMemoryError的区域。本地方法栈与虚拟机栈比较类似,只不过虚拟机栈用来执行java方法,而本地方法栈用来执行本地方法(与平台相关)。
堆是java虚拟机中用的最多的内存,也是进行垃圾回收的区域。每个对象实例和数组,都分配在堆里面。方法区存放着类信息,static修饰的类静态变量,常量池以及编译后的代码。
还有一部分内存不属于虚拟机运行时的内存,即直接内存。直接内存是jdk1.4引入NIO后,基于通道和缓存使用native本地库函数直接操作堆外内存的方式,避免了java堆内存和native堆内存的复制,提高了效率。
对象在内存中的布局主要分为三部分:对象头(Mark Word和类型指针),实例数据,对齐填充。
相关文章推荐
- java 虚拟机运行时内存分布分析
- JAVA中对象的创建、对象的内存布局、对象的访问定位
- java的对象、对象句柄、变量等在内存的分布
- JAVA对象内存布局 以及对象定位
- Java 对象的内存布局
- Java对象内存布局 - 小分析
- Java虚拟机一:Java运行时内存区域及对象的创建
- [深入理解JVM] Java对象的创建、内存布局、访问定位
- 深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式
- java对象的内存布局
- 读 - 深入理解java虚拟机 - 笔记(七-2) - Java内存区域(2章)-对象的内存布局和访问定位
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
- 关于Class对象、类加载机制、虚拟机运行时内存布局的全面解析和推测
- JAVA 对象内存布局
- Java对象创建的过程及对象的内存布局与访问定位
- Java基础学习19(String类型对象在内存中的分布以及与包装类之间的转换)
- Java虚拟机14:Java对象大小、对象内存布局及锁状态变化
- Java对象的内存布局
- Java对象内存布局
- java对象在内存中存储的布局