①Java虚拟机栈描述的是Java方法执行时的内存模型,每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,JVM通过控制出栈和入栈来控制方法的执行。局部变量表存放了编译期可知的各种基本数据类型和对象引用,其中long和double类型会占用两个局部变量空间,其他类型都占用一个空间。存放在栈中的数据所需的内存空间在编译空间就完全确定并完成分配,在方法运行期间不会再改变。
②程序计数器是一块较小的空间,它可以看作是当前线程所执行字节码的行号指示器,字节码解释器通过改变计数器的值来执行下一条字节码指令,分支,循环等非顺序执行代码段基本都要依赖这个计数器来完成
③本地方法栈与虚拟机栈非常类似,它们之间的区别是虚拟机栈为Java方法服务,本地方法栈为Native方法服务
以上三个都是线程私有的,其他线程不能访问,它们与线程的生命周期相同
④堆是JVM管理内存中最大的一块,它唯一的作用就是用来存储对象实例,它在JVM启动时就被创建。堆是垃圾收集器管理的主要区域,因此很多时候也被称为”GC堆“(Garbage Collected Heap)
注:成员变量作为对象的一部分,存在堆中
⑤方法区存储已被JVM加载的类信息、常量、静态变量、编译器编译的代码等代码数据。运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一个常量池(和运行时常量池不同),用于存放编译期生成的各种字面量和符号引用,当类被加载时就将其存入运行时常量池中
以上两个都是线程共享的
对象的创建:《JVM》44页
对象的访问:《JVM》48页
地址与哈希值相当于姓名与学号的关系。物理地址是不能给你的,如果地址让你改了,该地址正好是系统进程怎么办。所以有了哈希值