做网站运营需要注意哪些问题,html转换器,wordpress打开html文件下载,wordpress+标签消失Java内存区域与内存溢出异常 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 实例堆溢出栈溢出 运行时数据区域 根据《Java虚拟机规范的规定》#xff0c;Java虚拟机所管理的内存将会包含已下架几个运行时数据区域。 程序计数器
在Java虚… Java内存区域与内存溢出异常 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 实例堆溢出栈溢出 运行时数据区域 根据《Java虚拟机规范的规定》Java虚拟机所管理的内存将会包含已下架几个运行时数据区域。 程序计数器
在Java虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令它是程序控制流的指示器分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。
Java虚拟机栈
Java虚拟机栈也是线程私有的它的生命周期和线程相同。虚拟机描述的是Java方法执行的线程内存模型每个方法被执行的时候Java虚拟机都会同步一个栈帧用于存储局部变量表、操作书栈、动态连接、方法出口等信息。
在《Java虚拟机规范》中对这个内存区域规定了两类异常情况如果线程请求的栈深度大于虚拟机所运行的深度将抛出StackOverflowError异常如果Java虚拟机栈容量可以动态扩展当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。
本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的其区别只是虚拟机栈为虚拟机执行Java方法也就是字节码服务而本地方法栈则是为虚拟机使用的本地Native方法服务。
与虚拟机栈一样本地方法栈也会抛出StackOverflowError异常和OutOfMemoryError异常。
Java堆
对于Java应用程序来说Java堆是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域在虚拟机启动是创建。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的内存区域因此一些资料中它也被称作“GC堆”。
Java堆既可以被实现成固定大小的也可以是可扩展的不过当前主流的Java虚拟机都是按照可扩展来实现的通过参数-Xmx和-Xms设定。如果在Java堆中没有内存完成实例分配并且堆也无法扩展时Java虚拟机会抛出OutOfMemoryError异常。
方法区
方法区和Java堆一样是各个线程共享的内存区域它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编编译后的代码缓存等数据。
根据《Java虚拟机规范》的规定如果方法区无法满足新的内存分配需求时将抛出OutOfMemoryError异常。
运行时常量池
运行时常量池是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述信息外还有一项信息是常量池表用于存放编译期生成的各种字面量与符号引用这部分内容将在类加载后存放到方法区的运行时常量池中。
常量池无法满足新的内存分配需求时将抛出OutOfMemoryError异常。
直接内存
直接内存并不是数据区的一部分但是这部分内存也被频繁使用而且可能导致OOM异常。
在JDK1.4中新加入的NIO类引入可基于通道与缓冲区的I/O方式他可以使用Native函数库直接分配堆外内存。
实例
堆溢出
package jvm.dir01;import java.util.ArrayList;
import java.util.List;public class HeapOOM {static class OOMObject{}public static void main(String[] args) {ListOOMObject list new ArrayList();while (true) {list.add(new OOMObject());}}
}Exception in thread main java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.util.ArrayList.grow(ArrayList.java:267)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233)at java.util.ArrayList.add(ArrayList.java:464)at jvm.dir01.HeapOOM.main(HeapOOM.java:14)
栈溢出
package jvm.dir01;public class JavaVMStackSOF {int count 1;public void stackLeak() {count;stackLeak();}public static void main(String[] args) {JavaVMStackSOF javaVMStackSOF new JavaVMStackSOF();try {javaVMStackSOF.stackLeak();}catch (Exception e){System.out.println(length javaVMStackSOF.count);throw e;}}
}Exception in thread main java.lang.StackOverflowErrorat jvm.dir01.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)at jvm.dir01.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)