虚拟机知识总结

虚拟机知识总结_第1张图片
方法区、堆为线程共享;虚拟机栈、本地方法栈、程序计数器为线程私有,生命周期与线程相同

程序计数器(Program Couter Register):

较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。java虚拟机是线程轮流切换,该内存是为了切换线程时定位到上次线程执行的位置。

虚拟机栈(VM Stack):

虚拟机栈就是我们平时所经常说的“栈内存”。

它是java方法执行的内存模型,每个方法被执行时都创建一个“栈帧”,栈帧是方法运行期的基础数据结构,用于存储局部变量表、操作栈、动态链接、方法出口等信息。

方法执行从开始到结束,即栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量表存放了编译期可知的基本数据类型和对象引用类型。

本地方法栈(Native Method  Stack):

与虚拟机栈类似,虚拟机栈为虚拟机执行java方法服务,本地方法栈是为虚拟机使用到的Native方法服务。

native修饰的方法说明不是用java实现的,而是来源于本地库。

(Heap):

java虚拟机所管理的内存中最大的一块。在虚拟机启动时创建,作用是存放对象实例。

java堆是垃圾收集器管理的主要区域,用于内存回收。

方法区(Mether Area):

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

相对于堆来说,垃圾收集、内存回收行为是特别少的。

虚拟机栈、本地方法栈、方法区内存是可扩展的,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError内存溢出的异常。除了程序计数器,别的内存区域都可能出现此异常。

“直接内存”不是虚拟机内存中的一部分,但是也被频繁使用,也可能造成内存溢出。

你可能感兴趣的:(虚拟机知识总结)