1. 程序计数器

  • 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码执行,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。
  • 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,称这类内存区域为“线程私有”的内存
  • 程序计数器主要的两个作用
      1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。 如:顺序执行、选择、循环、异常处理。
      1. 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候就能知道该线程运行到哪里了。
        线程计数器是唯一不会出现OutOfMemoryError的内存区域,因为它的生命周期随着线程的创建而创建,随着线程的结束而死亡

2.Java虚拟机栈

  • 和程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期跟线程相同,描叙的是java方法执行的内存模型,每次方法调用的数据都是记过栈传递的
  • Java内存可以粗糙的区分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。(实际上,Java虚拟机栈是由一个个栈帧组成,而每一个栈帧中都拥有:局部变量表、 操作数栈、动态链接、方法出口信息等。)
  • 局部变量表主要存放了编译期可知的各种数据类型(boolean、byte、int、char、short、float、double、long)、对象应用(reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或于此对象相关的位置。)。
  • Java虚拟机栈会出现两种错误:StackOverFlowErrorOutOfMemoryError
    • kOverFlowError虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前java虚拟机栈的最大深度时,就会抛出StackOverFlowError异常。
    • tOfMemoryErrorJava虚拟机堆中没有空闲,并且垃圾回收器也无法提供更多内存的话,就会抛出OutOfMemoryError错误。
  • Java虚拟机栈也是线程私有的,每一个线程都有各自的Java虚拟机栈,会随着线程的创建而创建,随着线程的死亡而死亡。

本文地址:https://blog.csdn.net/hash_Delhi/article/details/114248298