在一般的模型中,两个不同的栈帧的内存区域是独立的,但是大部分的 JVM 在实现中会进行一些优化,使得两个栈帧出现一部分重叠(主要体现在方法中有参数传递的情况),让下面栈帧的操作数栈和上面栈帧的部分局部变量重叠在一起,这样做不但节约了一部分空间,更加重要的是在进行方法调用时就可以直接公用一部分数据,无需...
注意,在JVM规范中,程序计数器不会发生OOM(就记个数,能用多少内存)。 1.2虚拟机栈 线程私有,与线程生命周期相同。 栈描述的是Java执行方法的内存模型。线程是进程创造的(例如服务器的每个请求可以看做是一个线程,举例ThreadLocal),由多个方法间的调用组成,每个方法在执行时会创建一个栈帧,栈帧内存储的是局部变量...
既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OOM 异常。 7. 直接内存 直接内存(Direct Memory) 并不是JVM 运行时数据区的一部分,也不是 JVM 规范中定义的内存区域,但是这部分内存也被频繁的使用,而且也可能导致 OOM。 在JDK 1.4 中新加入了 NIO 类,引用了...
程序计数器是唯一一个没有规定任何OutOfMemoryError情况的内存区域,意味着在该区域不可能发生OOM异常,GC不会对该区域进行回收! 1.2 虚拟机栈 虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,生命周期和线程相同。 虚拟机栈描述的是Java方法执行的内存模型,JVM要执行一个方法时,首先会创建一个栈帧(Stack Fra...
按照JVM规范,除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM。 最常见的OOM情况有以下三种: java.lang.OutOfMemoryError: Java heap space --->java堆内存溢出 此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。 对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过...
JVM即Java虚拟机,是一种抽象计算机,它有一个指令集,在运行时操作各种内存区域。虚拟机有很多种,不同厂商提供了不同实现,只要遵循虚拟机规范即可,目前我们所说的虚拟机一般指的是Hot Spot。JVM对Java语言一无所知,只知道一种特定的二进制格式,即类文件格式,我们写好的程序最终交给JVM执行的时候会被编译成二进制格...
下图是 JVM 整体架构,中间部分就是 Java 虚拟机定义的各种运行时数据区域。 Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。
程序计数器内存区域是唯一一个在JVM规范中没有规定任何OOM(内存溢出)情况的区域!Java虚拟机栈(线程私有)虚拟机栈描述的是Java方法执行的内存模型 : 每个方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中...
2、内存模型 A、程序计数器 一块较小的内存空间、记录的是每个线程当前执行字节码指令位置,(普通Java 存字节码位置,Native 方法是空的),因为里面没有动态数据扩增的情况,所以不会有OOM 的情况发生。 B、栈 栈帧:线程执行方法字节码,会创建一个栈帧:里面放的是局部变量表(方法名啊,局部变量啊,基本类型啊等等...