图解 Java 内存区域及内存溢出异常

名词解释
线程共享数据区域
线程隔离数据区域
Note
图解 Java 内存区域及内存溢出异常
为了加深对 Java 内存区域的印象及理解,特意做成了思维导图
图解 Java 内存区域及内存溢出异常
名词解释

线程共享数据区域

直接内存
并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区。NIO 中使用 Native 函数直接分配堆外内存
方法区 Method Area
用于存放已被虚拟机加载的类信息、常量、静态变量、JIT 编译后的代码等
也称作 永久代,在这块容易遇到 OOM 问题
堆 Heap
Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
目的:存放对象实例,几乎所有的对象实例都在堆中分配。
GC 也主要发生在这里,所以也称 GC 堆
运行时常量池
在运行时期能动态地将常量放入常量池中,例如 String.intern() 方法
线程隔离数据区域

虚拟机栈 VM Stack
描述 Java 方法执行的内存模型,为虚拟机运行 Java 提供服务:
每个方法在执行的时候都会创建一个栈帧(Stack Frame),用来存放局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法的调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表
即常说的 堆栈的栈
存放编译可知的各种基本数据类型、对象引用、returnAddress类型
程序计数器 PCR
每条线程都有一个独立的程序计数器,以便线程切换后能回到正确的位置
不存在任何 OOM
本地方法栈 Native Method Stack
为本地方法 Native 提供服务
Note

该图中的方法区,也称为永久代,在 Jdk 1.8 中,已经不存在【永久代】了,改为【本地内存】来实现方法区,参考 Java永久代去哪儿了
如果有写错的,欢迎留言指正。