Java 运行时数据区域

时间:2022-12-24 23:44:21

1. 整体分类

程序计数器

虚拟机栈

本地方法栈

Java 堆

方法区

运行时常量池

直接内存

2. 程序计数器

  1. 每个线程一个计数器,线程的私有内存
  2. 指向的是字节码的内存地址?
    1. 如果线程执行的是 Java 方法,指向的是虚拟机字节码的内存地址
    2. 如果线程执行的是本地方法,计数器值为空
  3. 不会抛出 OutOfMemoryError

3. 虚拟机栈

  • 线程私有
  • 会抛出 *Error 和 OutOfMemoryError
  • 是指 java 方法执行时的内存占用

4. 本地方法栈

  • 本地方法执行时的内存占用
  • 会抛出 *Error 和 OutOfMemoryError

5. Java 堆

  • 几乎所有的对象实例都在 Java 堆中分配
  • -Xmx -Xms
  • 会抛出 OutOfMemoryError 异常
  • Java 堆细分
    • 新生代
      • Eden 空间
      • From Survivor 空间
      • To Survivor 空间
    • 老年代

6. 方法区

  • 被各个线程共享
  • 存放类信息,常量,静态变量
  • 对 HotSpot 来说是永久代
  • 抛出 OutOfMemoryError

7. 直接内存

  • 受本机直接内存的影响
  • 并非 jvm 运行时数据区的一部分
  • 也会抛出 OutOfMemoryError