一:运行时数据区域的划分:
二:程序计数器;较小的内存空间,每一个执行的线程都有一个程序计数器,即线程私有(java虚拟机的多线程通过线程轮流切换并分配处理器执行时间的方式实现的),字节码解释器通过计数器完成取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等。程序计数器不存在OOM问题。
java虚拟机栈:java虚拟机栈同样是线程私有的,生命周期与线程相同,每一个java方法对应一个栈帧,每个栈帧都存储有局部变量表,操作数栈,动态链接,方法出口。方法的从调用到执行完毕,对应着栈帧在虚拟机栈中入栈到出栈的过程。java虚拟机存在两种异常:1.如果线程请求的栈深度大于虚拟机栈的深度,则StackOverflowError异
常;如果虚拟机动态扩展时候无法申请到足够的内存,就会OOM。
本地方法栈:执行native方法的区域,会抛出StackOverflowError和OOM异常。
JAVA堆:所占内存最大的一块,用于存放对象实例,堆可细分为新生代(eden,from,to),老年代;当堆中没有内存完成实例分配并且堆无法再拓展时候会抛出OOM异常。
堆是发生GC的主要区域。
方法区:与java堆一同是线程共享的区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也是发生GC的区域,但不频繁,因此方法区在GC分代收集中被称作永久代。当方法区无法满足内存分配需求时候会发生OOM异常。
运行时常量池:是方法区的一部分,用于存放编译器产生的各种字面量和符号引用,当无法申请到内存时候会发生OOM。
参考:http://blog.csdn.net/kingofworld/article/details/17718587