base - 什么是JVM运行时数据区?

74 阅读2分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

  1. 运行时数据区是JVM能够管理的内存区域,划分为5部分,如下图所示:
    在这里插入图片描述
  2. 各区域
  • 什么是方法区?
    方法区主要存储类的信息,以及常量、静态变量等。同时可以存储动态常量。
  • 什么是堆?
    存储对象,垃圾收集器管理的区域。
    方法区和堆都是线程共享的。为了提高访问效率,在堆中会为每个线程分配本地缓冲区。
  • 什么是虚拟机栈和本地方法栈?
    虚拟机栈主要作用是运行方法。
  • 什么是程序计数器?
    程序计数器用来记录每个线程执行的字节码的位置。
    虚拟机栈、本地方法栈和程序计数器都是线程独占的,生命周期与线程的生命周期一致。
    程序计数器是JVM中很小的一块内存,主要用来记录虚拟机执行的字节码的地址。在虚拟机概念模型中,字节码解释器通过改变程序计数器的值来决定执行哪一条命令。java中的分支、循环、跳转、异常处理、线程恢复等基本操作都是通过程序计数器完成的。尤其是在多线程中,线程是通过CPU分配时间片来执行的,在单核情况下,某个时刻只有一个线程获取到了时间片执行,当时间片到期时会切换到其他线程,那么如果下一次再分配到时间片时,如果从原来执行到的位置继续执行呢,这就需要程序计数器来记录,每个线程都有一个对应的程序计数器来记录它执行的位置,以便线程恢复。每个程序计数器都是单独的内存空间,它们相互之间没有影响。并且其生命周期随着其所对应的线程的生命周期而创建和销毁。我们把这种内存称为线程私有的。当虚拟机执行java方法时,程序计数器的值为当前执行的字节码地址,如果虚拟机执行本地方法,程序计数器的值为0.