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