1, 程序计数器
它可看作当期那线程所执行的字节码的行号指示器。每个线程都有自己独立的程序计数器,被称为线程私有。
如果执行的时Java的Native方法, 计数器值为空。 程序计数器是虚拟机中唯一一个没有规定OOM异常的区域。
2. Java虚拟机栈
Java虚拟机栈也是线程私有的。 每个方法在执行的同时会创建一个栈帧用来存储局部变量表,操作数栈,动态链接,方法出口信息。虚拟机栈会抛出StackOverFlowError 和OOM异常
3 Java堆
存储在创建的对象,所有的对象都在这里分配内存,也是垃圾回收的主要区域。 所以么,堆是线程之间共享的区域。在垃圾收集的过程中一般是采用不同类型使用不同种类的垃圾回收算法。在堆区分为两部分一部分是新生代,一部分是老年代。堆中的内存没有完成实例分配,并且堆也无法扩展,就会抛出OOM异常。
4 方法区
存放已经被加载的类的信息,常量,静态变量,即时编译器编译之后的代码,各个线程之间共享,跟堆一样。但是如果方法区无法满足内存的分配,就会抛出OOM异常
5 本地方法区
保存native方法中的一些常量
6 运行时常量池:
运行时常量池是方法区的一部分。class文件中除了一些基本的类信息比如字段,方法,接口这些信息以外还有常量池。
常量池是用于编译器生成的各种字面量和符号引用。(虽然不大懂)
7 直接内存
不是虚拟机运行时数据区的一部分,也不是虚拟机定义的内存区域。不过因为它经常使用,而且会引起OOM异常。
总结一下吧:
会引起OOM异常的区域: 大概就是除了程序计数器之外。
线程私有的区域:虚拟机栈,程序计数器