jvm内存结构
内存模型粗略划分为:堆和栈
详细划分为:堆,栈,本地方法栈,方法区,程序计数器
堆:
存放对象实例
栈:
每创建一个线程,都会为他分配内存空间作为他的栈,当方法执行时,会生成对应的栈帧(局部变量表、操作数栈、动态链接、方法出口),每一个方法被调用直至执行完成的过程,就对应着一个栈帧在栈中从入栈到出栈的过程。局部变量表存放了编译期可知的各种基本数据类型和对象引用
ps:动态链接指的是在一个方法中调用另一个方法时,另一个方法的名称属于符号引用,将符号引用转为直接引用称为动态链接
本地方法栈:
虚拟机调用本地方法(native关键字修饰的)时使用的内存区域
方法区:(方法区是jvm规范的,而在HotSpot虚拟机中,方法区被实现为元空间,他使用的是物理机的本地内存)
常量池,类的数据结构和静态变量,方法的信息等
程序计数器:
为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,持有一个当前正在被执行的指令的引用。各条线程之间的程序计数器互不影响,属于“线程私有”。
字符串常量池 String pool 实现为哈希表,存的是字符串对象的引用,真正的对象还是存放在堆中
当在方法实例化一个对象时,关联的内存有哪些
“Object obj”这部分的语义将会反映到虚拟机栈的局部变量表中
new Object()”这部分的语义将会反映到Java堆中,形成一块存储了Object 类型所有实例数据值,另外,在Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中
new Object( ) 对象实例的对象头包含了到Class对象的引用,类的元信息都是通过Class对象找到的