jvm内存结构

内存模型粗略划分为:堆和栈

详细划分为:堆,栈,本地方法栈,方法区,程序计数器

存放对象实例

每创建一个线程,都会为他分配内存空间作为他的栈,当方法执行时,会生成对应的栈帧(局部变量表、操作数栈、动态链接、方法出口),每一个方法被调用直至执行完成的过程,就对应着一个栈帧在栈中从入栈到出栈的过程。局部变量表存放了编译期可知的各种基本数据类型和对象引用

ps:动态链接指的是在一个方法中调用另一个方法时,另一个方法的名称属于符号引用,将符号引用转为直接引用称为动态链接

本地方法栈

虚拟机调用本地方法(native关键字修饰的)时使用的内存区域

方法区:(方法区是jvm规范的,而在HotSpot虚拟机中,方法区被实现为元空间,他使用的是物理机的本地内存)

常量池,类的数据结构和静态变量,方法的信息等

程序计数器

为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,持有一个当前正在被执行的指令的引用。各条线程之间的程序计数器互不影响,属于“线程私有”。

 字符串常量池 String pool 实现为哈希表,存的是字符串对象的引用,真正的对象还是存放在堆中

当在方法实例化一个对象时,关联的内存有哪些

“Object obj”这部分的语义将会反映到虚拟机栈的局部变量表中

new Object()”这部分的语义将会反映到Java堆中,形成一块存储了Object 类型所有实例数据值,另外,在Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中

 

new Object( )  对象实例的对象头包含了到Class对象的引用,类的元信息都是通过Class对象找到的

 

原文地址:https://www.cnblogs.com/moris5013/p/10700259.html