JAVA虚拟机管理的内存区域分为六个部分:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池。如图。
1、程序计数器
一块较小的线程私有的内存区域,记录程序下次执行的字节码指令的地址,如果执行的是native方法,此区域为空。
2、java虚拟机栈
每个方法执行时创建一个栈帧用于保存局部变量表,动态链接,方法出入口等信息,每个方法从调用到执行完对应一个栈帧在虚拟机栈中的入栈和出栈。会抛出StackOverflow异常(当执行方法深度超过阈值时),如果申请不到更多的栈空间,会抛出OutOfMemoryError异常。
3、本地方法栈
这部分区域用途与java虚拟机栈一样,区别是本地方法栈运行的是native方法
4、java堆
堆是java虚拟机管理的最大的一部分内存区域,垃圾回收也是发生在这块内存;对象都在堆中创建。
5、方法区
线程公有的内存区域,其中保存了虚拟机加载的类信息、常量、静态变量等,又称非堆、永久代(虽称永久代,但其不是java堆的一部分);这部分区域也会发生GC,但是其回收条件非常苛刻。
6、运行时常量池
方法区的一部分,其中存放了虚拟机在编译期产生的各种字面量和符号引用,或者是方法运行期间产生的常量;比如:方法内部产生的String对象值。