这里是引用
JVM内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分。
程序计数器:每条线程都有自己独立的程序计数器,线程私有内存,正在执行的java方法,计数器记录的是虚拟机字节码指令的地址,如果是Native方法,计数器则为空;
Java虚拟机栈:也是线程私有内存;每个方法执行的时候都会创建一个栈帧,存储局部变量,操作数,动态链接,方法返回地址;方法从开始执行到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈;通常说的栈一般是指在虚拟机栈中的局部变量部分,局部变量所需要的内存在编译期间都完成分配。StackOverflowError是线程请求的栈深度大于虚拟机所允许的深度;如果虚拟机可以动态扩展,当扩展到无法申请到内存的时候,就会出现OOM;
本地方法栈:也是线程私有,和虚拟机栈类似,主要为虚拟机使用到的Native方法服务,也会抛出StackOverflowError和OOM;
Java堆:被所有线程共享的一块内存区域,在虚拟机启动的时候创建。当无法分配内存的时候会有OOM。
方法区:程序共享,存储已经被虚拟机加载的类信息,常量,静态变量,内存回收目标主要针对常量池的回收和堆类型的卸载。
方法区也被称为永久代,jdk8真正开始废弃永久代,而使用元空间(Metaspace)