1. 程序计数器

记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本中央法令为空)。每条线程都须要一个独立的程序计数器。

2. Java虚拟机栈


与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stacks)也是线程公有的,它的生命周期与线程雷同。

每个 Java 办法在执行的同时会创立一个栈帧用于存储局部变量表、操作数栈、常量池援用等信息。从办法调用直至执行实现的过程,对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

局部变量表所需内存空间在编译期间实现调配,寄存了:

  1. 根本数据类型(boolean、byte、char、shrot、int、float、long、double)
  2. 对象援用(指向对象起始地址的援用指针)

两种异样:
StackOverflowError:线程申请栈深度大于虚拟机所容许深度
OutofMemoryError: 无奈申请到足够空间

3. 本地办法栈

本地办法栈与 Java 虚拟机栈相似,它们之间的区别只不过是本地办法栈为本地办法服务。

4. Java 堆

是被所有线程共享的一块内存区域,所有对象都在这里分配内存,是垃圾收集的次要区域("GC 堆")。
异样 OutofMemoryError:Java堆中没有内存实现实例调配时抛出该异样。

5. 办法区

与Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、动态变量、即时编译器编译后的代码缓存等数据。

对这块区域进行垃圾回收的次要指标是对常量池的回收和对类的卸载,然而个别比拟难实现。

异样 OutofMemoryError:办法区无奈满足新的内存调配要求时。

6. 运行时常量池

运行时常量池是办法区的一部分。

Class 文件中的常量池表(寄存编译器生成的字面量和符号援用)会在类加载后被放入办法区的运行时常量池中。

动态性: 解决编译器产生常量,运行期间也能够将新的常量放入池中,例如String类的intern()办法.

异样 OutofMemoryError:收到办法区内存的限度,常量池无奈再申请到内存时抛出该异样。

7. 间接内存

在 JDK 1.4 中新引入了 NIO 类,它能够应用 Native 函数库间接调配堆外内存,而后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的援用进行操作。这样能在一些场景中显著进步性能,因为防止了在堆内存(Java堆)和堆外内存(Native堆)来回拷贝数据。

异样 OutofMemoryError:本机间接内存的调配会受到本机总内存大小以及处理器寻址空间的限度。

参考资料

  1. https://github.com/CyC2018/CS...
  2. https://www.cnblogs.com/czwbi...