JVM内存区域和内存溢出异常

来源:互联网 发布:瓦楞纸箱设计软件 编辑:程序博客网 时间:2024/05/16 15:26

程序计数器

程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。

该区域是唯一一个在java虚拟机规范中没有任何OutOfMemoryError情况的区域。

java虚拟机栈

该区域和程序计数器区域一样是线程私有的区域。虚拟机栈表示的是java方法执行的内存模型:每个方法在执行的时候会创建一个栈帧,用于存储方法的局部变量表,操作数栈,动态链表,方法出入口信息。

其中局部变量表存放各种基本的数据类型对象引用

一般该区域有StackOverflowError(线程请求的栈深度超过虚拟机允许的深度)和OutOfMemoryError(虚拟机栈进行动态扩容失败)

本地方法栈

本地方法栈和java虚拟机栈其实是一样的,只是两者服务的对象不一样,本地方法栈是正对native方法而言,java虚拟机栈是针对程序运行的java方法。

出现的错误也和java虚拟机栈一样,StackOverflowError和OutOfMemoryError。

堆区是jvm管理的最大一片区域,该区域是线程共享的,主要是对象实例和数组分配的区域。

堆区分为新生代和老年代,其中新生代分为Eden区、From Survivor区和To Survivor区。

当堆无法分配的时候会抛出OutOfMemoryError错误。

方法区

方法区也是和堆区一样式线程共享的,该区域主要存储加载的类信息、常量、静态变量、即时编译以后的代码。

该区域也经常被称为永久区。针对该区域的回收主要是对常量池回收和类的卸载。

当该区域不足的时候会抛出OutOfMemoryError错误。

运行时常量池

该区域是方法区的一部分。

直接内存

直接内存是不是虚拟机的运行时数据区的一部分,也不是JVM规范中定义的内存区域。

该区域主要在NIO使用,避免在java堆和native堆中来回拷贝,也就是经常所说的零拷贝策略。

原创粉丝点击