HotSpot是使用指针的方式来访问对象:
Java堆中会存放访问类元数据的地址(方法区)
reference存储的就直接是对象的地址
常见错误产生原因 StackOverFlowError 线程请求的栈深度大于虚拟机允许的深度时则报此错
OutOfMemoryError 如果虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存则报此错
_
本地方法栈:****线程私有
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
因此具体的虚拟机可以根据需要自由实现它,甚至有的Java虚拟机(譬如Hot-Spot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。
与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常。
本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法,在Execution Engine 执行时加载native libraies。 目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用 Socket通信,也可以使用Web Service等等
本地方法接口:****线程共享
它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。
线程共享(有少量GC)
1.它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。
2.方法区是规范,在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metaspace)。
3.实例变量存在堆内存中,和方法区无关
方法区内存的数据类型
八、堆空间
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。
Tenure generation space 养老区 Old/Tenure
MetaSpace/Permanent Space 元空间/永久区 MetaSpace/Perm (元空间JDK8出来后替代永久区)
逻辑上划分:新生区+养老区+元空间
物理上划分:新生区+养老区
元空间存在堆内存外的物理内存空间中。