JVM基础数据区
Posted 烟锁迷城
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM基础数据区相关的知识,希望对你有一定的参考价值。
1、方法区(Method Area)
- 方法区是各个线程共享的内存区域,在虚拟机启动时创建,因此在方法区内的数据线程不安全。
- 用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
- java虚拟机规范把方法区描述为堆的一个逻辑部分,但它别名非堆(Non-Heap),目的是与java堆区分开。
- 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError
- 方法区在Java8中被称为Meta Space(元空间),在Java7,6中被称为Perm Space(永久代)
- Run-Time Constant Pool(运行时常量池)在方法区分配。
2、堆(Heap)
- 堆是java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。
- java对象实例,基本类型变量,数组都在堆上分配
- 当堆无法满足内存分配需求时,将抛出OutOfMemoryError
3、虚拟机栈(Java Virtual MachineStacks)
- 虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随线程创建而创建。
- 每一个被线程执行的方法,为该栈中的栈帧,即每一个方法对应一个栈帧。
- 调用一个方法,就会向栈中压入一个栈帧,一个方法调用完成,就会把该栈帧从栈中弹出。
- 在调用过多,栈的深度不够的时候,会抛出StackOverflowError
- 因为栈为每一个线程独有,所以是线程安全的。
- 每一个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。
- 每一个栈帧中包括局部变量表(Local Variables),操作数栈(Operand Stack),指向运行时常量池的引用(a reference to the run-time constant pool),方法返回地址(Return Address),动态链接和附加信息。
- 动态链接将数据的符号引用转换为直接引用。上一节中类加载过程的第二步,链接的解析是将固定的符号引用转换为直接引用,动态链接的转换是非固定的,动态的。
4、程序计数器(PC Register)
一个JVM进程中有多个线程在执行,而线程中的内容是否能够拥有执行权,是根据CPU调度决定的。假如线程在执行方法的过程中,忽然发生线程切换,当它再次获取到执行权时,就需要记录上次执行到的位置。
- 程序计数器占用的内存空间很小,由于JAVA虚拟机的多线程是通过线程轮流切换并分配执行时间来实现,在任意时刻,一个CPU只会执行一个线程中的指令,因此为了线程切换后能正确继续执行,每个线程都需要一个独立的程序计数器。
- 如果线程正在执行java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址。
- 如果正在执行的是Native方法,则这个计数器为空。
5、本地方法栈
如果正在执行的是Native方法,则这个计数器为空,因为这为本地方法,所以就需要一个本地方法栈来执行本地方法。
以上是关于JVM基础数据区的主要内容,如果未能解决你的问题,请参考以下文章