JVM(完成度95%,不断更新) (4)

HotSpot是使用指针的方式来访问对象:
Java堆中会存放访问类元数据的地址(方法区)
reference存储的就直接是对象的地址 

image.png


image.png


image.png


常见错误产生原因 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.实例变量存在堆内存中,和方法区无关


方法区内存的数据类型

image.png


八、堆空间

一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。

内存结构 Young Generation Space 新生区                    Young/New         (新生区还分伊甸区、幸存者0、1区)
Tenure generation space   养老区                    Old/Tenure  
MetaSpace/Permanent Space   元空间/永久区         MetaSpace/Perm     (元空间JDK8出来后替代永久区)  

逻辑上划分:新生区+养老区+元空间

物理上划分:新生区+养老区

元空间存在堆内存外的物理内存空间中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsdps.html