简述jvm结构

jvm结构:


1.程序计数器,每个线程都有自己的计数器,用于记录字节码指令的执行位置


2.虚拟机栈,用于存放栈帧,栈帧中包含,局部变量表 、操作数栈、动态链接、方法出口.每个线程都有自己的虚拟机栈.调用执行任何方法的时候,都会给方法创建栈帧,然后入栈


3.堆内存,对象信息存放其中,栈帧中的局部变量指向堆内存中的对象


4.方法区 / Metaspace,主要还是存放我们自己写的各种类相关的信息

5.本地方法栈,存储结构与虚拟机栈类似,用于jdk底层相关的局部变量之类的信息

6.堆外内存,不属于JVM的,可以在Java堆外分配内存空间。通过虚拟机的DirectByteBuffer来引用.可以提升性能

总结

最后做一点总结,我们的Java代码通过JVM来运行时:

首先一定会一行一行执行编译好的字节码指令

然后在执行的过程中,对于方法的调用,会通过Java虚拟机栈来为每个方法创建栈帧来入栈和出栈,而且栈帧里有方法的局部变量表

接着对于对象的创建,会分配到Java堆内存里去

对于类信息的存储,会放在方法区 / Metaspace这样的区域里。

另外有两块特殊的区域:

本地方法栈,是执行native方法时候用的栈,跟Java虚拟机栈是类似的

堆外内存,可以在Java堆外分配内存空间来存储一些对象

OOM的四种情况

1.Java堆溢出:heap

java.lang.OutofMemoryError:Java heap space

2.栈溢出:stack

java.lang.StackOverflowError

3.运行时常量溢出   constant

java.lang.OutofMemoryError: PermGen space

4.方法区溢出   directMemory

java.lang.OutofMemoryError: PermGen space

你可能感兴趣的:(简述jvm结构)