JVM--Java内存区域与内存溢出异常

来源:互联网 发布:java设置日期格式 编辑:程序博客网 时间:2024/05/22 16:05

Java虚拟机针对Java程序运行的时候,将内存分成不同的区域,这些区域对于不同的数据的存储分工明确,Java虚拟机将运行时区域分成以下六个区域。

一、程序计数器

定义:程序计数器是记录当前线程执行的虚拟机字节码的行号指示器。

特点:程序计数器是每个线程所特有的,并且程序计数器是Java虚拟机分区中唯一一块没有OutOfMemoryError的区域。

二、Java虚拟机栈

定义:用于存放方法局部变量表、操作数栈、动态链接、方法出口,所谓局部变量表就是方法的各种基本类型和对象引用。

特点:Java虚拟机栈也是各个线程所独有的,其生命周期和线程相同。

异常信息:如果线程请求的栈深度大于虚拟机的栈深度那么将抛出StackOverFlowError,由于Java虚拟机栈是可以扩展的,当扩展已经无法满足申请的栈空间的时候,将会抛出OutOfMemoryError异常。

三、本地方法栈

定义:本地方法栈是使用到native方法而产生的类似Java虚拟机栈的一块内存地址,在很多虚拟机中,通常将本地方法栈和Java虚拟机栈划分在一起。

异常信息:和java虚拟机栈类似,本地方法栈也会产生StackOverFlowError和OutOfMemoryError两个异常。

四、Java堆

定义:Java堆是用来存放对象实例的,与前面的Java虚拟机栈对比,我们可以发现,针对对象的引用,我们存放在Java虚拟机栈中,而针对对象的实例我们存放在Java堆中。

特点:Java堆是所有线程共享的,并且是垃圾回收的主要地点。

异常信息:如果对象实例没有被完全存储,而且Java堆已经无法再进行扩展了,那么这个时候就会产生OutOfMemoryError异常。

五、方法区

定义:方法区是用来存放Java虚拟机加载的类信息、静态数据、常量、即时编译器编译后的代码信息。

特点:这个区域是所有线程所共享的。这个区域很多人也喜欢称其为永久代,但是这就并不意味着这个区域不进行垃圾回收了,这个区域的垃圾回收主要是针对常量池和类型卸载进行的。

异常信息:当方法去无法满足内存分配需求的时候,将发生OutOfMemoryError异常。

六、运行时常量池

定义:在类文件中不仅仅有类的版本,字段、方法、接口等信息的描述,还有字面量和符号引用。针对类的版本、接口、字段和方法这些信息存放在方法区中,我们可以从上面看出来。而针对字面量和符号引用,是存放在常量池中的。

特点:常量池属于方法区的一个部分。

异常信息:从上面的描述,我们可以看出常量池属于方法区的一个部分,那么常量池肯定也受到方法区的限制,从而当常量池无法申请到它所需要的内存的时候就会产生OutOfMemoryError异常。




原创粉丝点击