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
网友评论