如下内容为个人总结,如有错误,欢迎评论区指正;
-
运行时数据区域
-
程序计数器
-
线程私有,记录程序执行步骤;
如果线程执行的是一个Java方法,则记录的是虚拟机字节码指令的地址;
如果线程执行的是一个Native方法,则为空;
是唯一没有规定任何OOM的内存区域;
-
-
虚拟机栈
-
线程私有,虚拟机栈描述的是Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息;每个方法从调用到执行完成,对应着一个栈帧在虚拟机中入栈到出栈的过程;
人们常说的栈内存,一般仅指的是局部变量表,局部变量表存储了编译器可知的各种基本数据类型(byte、short、int、long、double、float、boolean、char)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。
会抛出StackOverflowError和OOM。
-
-
本地方法栈
-
线程私有,调用Native方法
会抛出StackOverflowError和OOM。
-
-
Java堆
-
所有线程共享
大部分对象实现和数组都在堆上分配(如果对象不会逃逸出方法,那么可能在栈上分配;还有可能在TLAB线程缓冲区中分配);
垃圾回收(待补充)
会抛出OOM
-
-
方法区
-
线程共享
用于存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码
会抛出OOM
-
-
*直接内存
-
参考《深入理解Java虚拟机》