Jvm内存分布
-
程序计数器:线程私有,选择下一条要执行的字节码指令,如果执行本地方法,则计数器为空,不会出现任何OutOfMemoryError异常。
-
JAVA虚拟机栈:线程私有,用于存储局部变量表,操作数栈,动态连接,方法出口等信息,局部变量表中存放了8个基础数据类型,对象引用,和returnAddress类型。该区域会出现StackOverflowError和OutOfMemoryError异常。
-
本地方法栈:线程私有,为本地方法服务,会出现StackOverflowError和OutOfMemoryError异常。
-
堆:线程共享,存放对象实例,对象实例和数组都在堆上分配,会出现OutOfMemoryError异常。
-
方法区:线程共享,存储已被JVM加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存。JDK8以前用永久代实现方法区,JDK8改为元空间,并存放在本地内存中。会出现OutOfMemoryError异常。
- 运行时常量池:存放编译期生成的各种字面量与符号引用
直接内存:受本机内存及处理器寻址空间限制。