1.内存区1.1程序计数器线程是私有的,内存小字节码解释器通过改变这个计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基本功能需要依靠计数器来完成。多线程切换时,使用程序计数器明确线程执行到哪里。如果线程执行了一个java方法,程序计数器记录的是字节码指令的地址。native方法执行完,程序计数器为空(Undefined)1.2Java虚拟机栈Thread私有虚拟机栈由栈帧组成,每个方法从虚拟机开始执行到结束对应一个栈帧machine入栈出栈的过程一个栈帧包括局部变量表、操作数栈、动态链接、方法返回地址等信息方法无限递归调用会抛出StackOverflowError局部变量表:存放已知的各种基本信息给编译器数据类型,对象引用类型地址,returnAddress类型(指向一个字节码指令的地址),局部变量表的大小可以由编译器决定,所以运行时内存大小不会改变操作数栈:javavirtual机器栈中用于计算的临时数据存储区1.3NativeMethodStackThreadprivate。与Java虚拟机栈不同的是,Java虚拟机栈是为虚拟机执行Java方法(即字节码)服务的,而本地方法栈是为虚拟机使用的Native方法服务的。HotSpotJVM将本地方法栈和虚拟机栈合并为一个1.4堆线程共享。堆是内存区域中最大的部分,也是JVM垃圾回收的主要区域,也称为GC堆。它主要存储对象实例和数组。根据GC分代垃圾回收算法,堆分为新生代(Eden区、FromSurvivor区、ToSurvivor区)和老年代。1.5方法区线程共享。主要存放虚拟机加载的类信息、常量、静态变量、实时编译器编译的代码等数据。在编译、运行时,可以通过String类的intern()方法动态放入池的方法区。),区别在于元空间不在虚拟机中,而是使用本地内存方法区的演化过程,见下图2。对象访问位置2.1句柄访问Java堆会分配一块内存作为句柄池。引用存储句柄的地址。具体见图2.2直接指针访问引用直接存储对象实例数据和类信息地址2.3优缺点使用句柄最大的优点是引用存储了一个稳定的句柄地址,只需要在调用时改变指针即可对象被移动(GC)地址和引用不需要改变。直接指针访问的最大优点是速度快,节省了指针访问和定位的时间开销。所以如果对象被频繁访问,直接指针更好,如果对象频繁GC,句柄访问更好
