成都网站seo推广,上海十大公关公司排名,黑龙江专业网站建设,崆峒区建设局网站这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区 java内存区域
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域#xff1a;
程序计数器虚拟机栈本地方法栈堆方法区
程序计数器
记录下一条需要执行的虚拟机字节码指令… 这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区 java内存区域
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域
程序计数器虚拟机栈本地方法栈堆方法区
程序计数器
记录下一条需要执行的虚拟机字节码指令的地址
字节码解释器通过改变程序计数器来依次读取指令从而实现代码的流程控制如顺序执行、选择、循环、异常处理。在多线程的情况下程序计数器用于记录当前线程执行的位置从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
虚拟机栈
虚拟机栈是描述java方法执行的线程内存模型是线程私有生命周期同线程一样。
方法调用的数据需要通过栈进行传递每一次方法调用都会有一个对应的栈帧被压入栈中每一个方法调用结束后都会有一个栈帧被弹出。
栈由一个个栈帧组成而每个栈帧中都拥有局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似两者都是先进后出的数据结构只支持出栈和入栈两种操作。 局部变量表 主要存放了编译期可知的各种数据类型boolean、byte、char、short、int、float、long、double、对象引用reference 类型它不同于对象本身可能是一个指向对象起始地址的引用指针也可能是指向一个代表对象的句柄或其他与此对象相关的位置 操作数栈主要作为方法调用的中转站使用用于存放方法执行过程中产生的中间计算结果。另外计算过程中产生的临时变量也会放在操作数栈中。 动态链接 主要服务一个方法需要调用其他方法的场景。当一个方法要调用其他方法需要将常量池中指向方法的符号引用转化为其在内存地址中的直接引用。动态链接的作用就是为了将符号引用转换为调用方法的直接引用。
Java 方法有两种返回方式一种是 return 语句正常返回一种是抛出异常。不管哪种返回方式都会导致栈帧被弹出。也就是说 栈帧随着方法调用而创建随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。
这个内存区域规定了两类异常状态
一是StackOverFlowError 异常这个在方法出现无无限递归是就会出现原因是线程请求栈的深度超过当前 Java 虚拟机栈的最大深度二是OutOfMemoryError异常如果栈的内存大小可以动态扩展 如果虚拟机在动态扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError异常
本地方法栈
和虚拟机栈作用类似区别是虚拟机栈为虚拟机执行 Java 方法 也就是字节码服务而本地方法栈则为虚拟机使用到的本地方法服务
堆
虚拟机中所管理的内存最大的一块区域作用是为java对象分配内存。
Java 堆是垃圾收集器管理的主要区域因此也被称作 GC 堆Garbage Collected Heap。从垃圾回收的角度由于现在收集器基本都采用分代垃圾收集算法所以 Java 堆还可以细分为新生代和老年代再细致一点有Eden、Survivor、Old 等空间。进一步划分的目的是更好地回收内存或者更快地分配内存。这个后面讲垃圾回收时会细讲。
堆这里最容易出现的就是 OutOfMemoryError 错误并且出现这种错误之后的表现形式还会有几种比如
java.lang.OutOfMemoryError: GC Overhead Limit Exceeded当 JVM 花太多时间执行垃圾回收并且只能回收很少的堆空间时就会发生此错误。java.lang.OutOfMemoryError: Java heap space :假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发此错误
方法区