本文由Scarb发表于金甲虫的博客,转载请注明出处

JVM Runtime Data Area | JVM运行时数据区

PC(Program Counter)

  • 存放指令位置
  • 虚拟机的运行,类似于这样的循环
1
2
3
4
5
while(not end) {
取PC中的位置,找到对应位置的指令;
执行该指令;
PC++;
}

JVM Stacks

JVM管理的栈

Java运行时每个线程对应一个栈

每个方法对应一个栈帧

栈帧 Frame

存储数据和中间结果、执行动态链接,返回方法结果值,分发异常

  • Local Variables
  • Operand Stacks
  • Dynamic Linking
  • Return Address
    • a() -> b(),方法a调用了方法b,b方法的返回值存放的位置

Native method stacks

调用C/CPP写的方法时的栈

Direct Memory

JVM可以直接访问的内核空间的内存(OS管理的内存)

NIO,提高效率,实现零拷贝

Method Area

JVM所有线程共享,存储每个class的结构

  • 不同版本的Method Area实现:
    • Perm Space 永久区 (<1.8)
      • 字符串常量位于Perm Space
      • FGC不会清理
    • Meta Space 元数据区 (>=1.8)
      • 字符串常量位于堆
      • 会触发FGC处理
Run-Time Constant Pool

包含于Method Area

是每个类或每个接口的运行时常量池表示

Heap

堆在所有JVM线程中共享,是所有类实例和数组的运行时内存区。