JVM基础(二)数据区

5 篇文章 0 订阅

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方法,则这个计数器为空,因为这为本地方法,所以就需要一个本地方法栈来执行本地方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值