JVM基础数据区

Posted 烟锁迷城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM基础数据区相关的知识,希望对你有一定的参考价值。

1、方法区(Method Area)

  1. 方法区是各个线程共享的内存区域,在虚拟机启动时创建,因此在方法区内的数据线程不安全。
  2. 用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
  3. java虚拟机规范把方法区描述为堆的一个逻辑部分,但它别名非堆(Non-Heap),目的是与java堆区分开。
  4. 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError
  5. 方法区在Java8中被称为Meta Space(元空间),在Java7,6中被称为Perm Space(永久代)
  6. Run-Time Constant Pool(运行时常量池)在方法区分配。

2、堆(Heap)

  1. 堆是java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。
  2. java对象实例,基本类型变量,数组都在堆上分配
  3. 当堆无法满足内存分配需求时,将抛出OutOfMemoryError

3、虚拟机栈(Java Virtual MachineStacks)

  1. 虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态。一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈肯定是线程私有的,独有的,随线程创建而创建。
  2. 每一个被线程执行的方法,为该栈中的栈帧,即每一个方法对应一个栈帧。
  3. 调用一个方法,就会向栈中压入一个栈帧,一个方法调用完成,就会把该栈帧从栈中弹出。
  4. 在调用过多,栈的深度不够的时候,会抛出StackOverflowError
  5. 因为栈为每一个线程独有,所以是线程安全的。
  6. 每一个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。
  7. 每一个栈帧中包括局部变量表(Local Variables),操作数栈(Operand Stack),指向运行时常量池的引用(a reference to the run-time constant pool),方法返回地址(Return Address),动态链接和附加信息。
  8. 动态链接将数据的符号引用转换为直接引用。上一节中类加载过程的第二步,链接的解析是将固定的符号引用转换为直接引用,动态链接的转换是非固定的,动态的。

4、程序计数器(PC Register)

一个JVM进程中有多个线程在执行,而线程中的内容是否能够拥有执行权,是根据CPU调度决定的。假如线程在执行方法的过程中,忽然发生线程切换,当它再次获取到执行权时,就需要记录上次执行到的位置。

  1. 程序计数器占用的内存空间很小,由于JAVA虚拟机的多线程是通过线程轮流切换并分配执行时间来实现,在任意时刻,一个CPU只会执行一个线程中的指令,因此为了线程切换后能正确继续执行,每个线程都需要一个独立的程序计数器。
  2. 如果线程正在执行java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址。
  3. 如果正在执行的是Native方法,则这个计数器为空。

5、本地方法栈

如果正在执行的是Native方法,则这个计数器为空,因为这为本地方法,所以就需要一个本地方法栈来执行本地方法。

以上是关于JVM基础数据区的主要内容,如果未能解决你的问题,请参考以下文章

Java -----JVM运行时数据区

Jvm,运行时数据---jvm运行时数据总览

Jvm(14.2),运行时数据---堆,栈,方法区

深入理解JVM虚拟机:JVM运行时数据区

JVM学习--JVM运行时数据区图文详解

一文搞懂 JVM 架构和运行时数据区 (内存区域)