您的位置:首页 > 编程语言 > Java开发

java运行时的内存分布与对象的内存布局

2018-02-26 21:00 155 查看
        理解java虚拟机时,一个重要的内容就是了解虚拟机在运行时如何为对象分配内存。根据内存是线程私有的,还是公共的,可以分为两部分。一部分是公共的,包括:堆,方法区。另一部分是线程私有的,包括:虚拟机栈,本地方法栈,程序计数器。
        虚拟机栈是线程私有的,保存一些局部变量,线程在进行函数调用时,采用先进后出的栈帧。程序计数器用来指示当前程序执行到哪里,是java中唯一一个不会抛OutOfMemoryError的区域。本地方法栈与虚拟机栈比较类似,只不过虚拟机栈用来执行java方法,而本地方法栈用来执行本地方法(与平台相关)。

        堆是java虚拟机中用的最多的内存,也是进行垃圾回收的区域。每个对象实例和数组,都分配在堆里面。方法区存放着类信息,static修饰的类静态变量,常量池以及编译后的代码。

        还有一部分内存不属于虚拟机运行时的内存,即直接内存。直接内存是jdk1.4引入NIO后,基于通道和缓存使用native本地库函数直接操作堆外内存的方式,避免了java堆内存和native堆内存的复制,提高了效率。

        对象在内存中的布局主要分为三部分:对象头(Mark Word和类型指针),实例数据,对齐填充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: