JDK1.6到JDK1.7内存划分是将方法区中增加了运行时常量池,JDK1.7到JDK1.8是将方法区放在了本地内存中的元数据区.
线程私有内存空间
程序计数器:一块较小的内存空间,可以看做是记录线程运行到的位置,也就是记录线程运行在哪一行.
jvm虚拟机栈:每一个方法在执行的时候都需要创建一个栈帧,用于存储局部变量,操作数栈,动态链接,方法出口等信息.每个方法调用执行完之后都会消除掉这个栈帧.
此区域一共可能出现两种异常
1.当线程请求的栈深度大于虚拟机栈的时候会出现异常(StackOverFlowError)
2.虚拟机在动态扩展时无法申请到内存的时候会出现00M异常(OutOfMemoryError)
本地方法栈:这个其实和jvm虚拟机栈的作用都是完全相同的,他两去区别无非就是本地方法栈为jvm虚拟机栈使用的Nation方法服务.
线程共享区域:
java堆:所有的对象都缝补在堆内存中的.如果堆内存没有足够的内存空间也会抛出OOM异常.
方法区:用于存储一杯虚拟机加载的类信息,常量,静态常量,及时编译器编译的代码.
运行时常量池:编译期和运行时产生的常量被放在了运行时常量池中.
这里的常量包括:包装类基本数据类型,String.
原文:https://www.cnblogs.com/yuzhenghan/p/13170359.html