Java 的内存区域被分为:

  • 方法区
  • 程序计数器
  • 虚拟机栈
  • 本地方法栈

# 方法区

方法区存储的是被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。JDK8 之前,是用永久代的方法来实现方法区的,在物理存储上,堆和方法区的地址是连续的,无论谁满了,都会触发老年代和永久代的 GC。在 JDK7 时,方法区中的字符串常量池和静态变量移到了堆中,JDK8 用元空间来存储方法区剩余的东西。元空间使用本地内存,内存大小不再受限于虚拟机内存。

# 程序计数器

程序计数器占用的内存比较小,它记录了每个线程当前执行的位置。这个区域是唯一一个没有 OOM 的区域。

#

堆是所有线程公有的,代码运行时生成的对象等,都会放在堆中。堆中的对象,需要虚拟机进行清理,至于要清理哪些,会根据一些算法来扫描垃圾,然后再用一定的策略进行清理。

# 虚拟机栈

虚拟机栈是线程相关的,栈中的内容会随着方法或者线程的结束而消失,所以不需要进行垃圾回收。

# 本地方法栈

本地方法栈和虚拟机栈是类似的,不同的是,它使用的是本地方法服务。