
Java 虚拟机在运行时有如下区域 除了图片中的内存区域 Jdk1.4 新加入的NIO为虚拟机运行时分配内存提供了实现

线程私有的
程序计数器
作用简述:
记录正在执行的虚拟机字节码指令地址。
一个很小的内存空间 ,通过改变该计数器用来选取下一条需要执行的字节码指令,分支、循环、跳转、线程恢复等都依赖该计数器。
记录正在执行的字节码指令地址。
可能发生的异常:
没有OOM异常
java虚拟机栈
作用简述:
每个方法在执行时都会创建一个栈帧用于存储局部变量、操作数栈、动态链接、方法出入口。
局部变量 3种类型:
基本数据类型 long 和 double 占用两个空间 其他基本数据类型只有占一个。
对象引用 指向对象起始地址的引用指针。
returnAddress 指向一条字节码的指令地址。
可能产出的异常:
栈深度大于虚拟机所允许的深度 会抛出 StackOverflowError
栈的内存不足 OutOfMemoryError
本地方法栈
作用简述:
与java虚拟机栈类似 执行Native方法。
有的虚拟机将本地方法栈与虚拟机栈合二为一。
可能产出的异常:
栈深度大于虚拟机所允许的深度 会抛出 StackOverflowError
栈的内存不足 OutOfMemoryError
线程共有的
Java堆
作用简述:
在虚拟机启动的时候创建,最大内存块,存放对象实例与数组,“几乎”所有对象的存放地址。
Java中垃圾收集的主要管理区域,基于分代的回收算法新生代和老年代。
可能划分出线程私有的分配缓存区 TLAB。
通过 -Xmx 和 -Xms 控制堆的内存大小。
可能产出的异常:
内存不足 OutOfMemoryError
方法区

作用简述:
用于存储虚拟机加载的类信息,比如类有哪些字段有哪些方法, 常量、 静态变量 (这个区域可以不实现垃圾收集)。在jdk1.8以后将方法区移动到元空间去,使用本地内存。
可能产出的异常:
内存不足 OutOfMemoryError
运行时常量池

作用简述:
方法区的一部分 用于存放各种字面量和符号引用。
通常运行时常量池都是在编译时产出的,不过String的intern方法可以在运行时放入常量池。
可能产出的异常:
内存不足 OutOfMemoryError
直接内存
计算机内存 可以在运行时直接分配,进行存取 NIO就是通过直接内存实现的
不受堆的大小限制 只受计算机内存的限制
jdk1.8 以后方法区从堆内存移动到本地内存中去