首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

Java内存区域与内存溢出异常 运行时数据区 方法区(Method Area) 虚拟机栈(VM Stack) 本地方法栈(Native Method Stack) 堆(Heap) 程序计数器(PC) ?...(存储局部变量表[基本数据类型、对象引用]) 方法的调用和执行对应栈帧再虚拟机栈中入栈和出栈的过程 这个内存区域内规定的两类异常状况: StackOverflowError(栈深度溢出) 我的理解:...OutofMenoryError(栈扩展失败) 我的理解:假设栈帧里面的方法是死循环,导致栈帧耗光了JVM栈的容量,此时产生OOM异常。...,TLAB 提升对象分配时的效率) 不要求物理上连续的内存空间 可扩展(通过参数-Xmx和-Xms设定) 这个内存区域可能产生的异常状况: OutofMenoryError **产生原因:**Java堆中没有内存完成实例分配...,在类加载后将这些数据存放到运行时常量池 直接内存(不了解) 总结 掌握java内存区域布局,以及每一块的作用,知道每个内存区域时干什么的

2.2K60

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

[JVM] Java 内存区域与内存溢出异常 @TOC 手机用户请 横屏获取最佳阅读体验, REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。...此内存区域是Java虚拟机规范中唯一一个没有规定任何 OutOfMemoryError情况的区域。 Java 虚拟机栈 虚拟机栈描述的是Java方法执行的内存模型。和程序计数器一样,也是 线程私有的。...虚拟机规范中,定义了两种异常情况: 线程请求的栈深度大于虚拟机匀速的深度,将抛出 StackOverflowError 如果虚拟机栈可以动态扩展,但是扩展时无法申请到足够内存,将会抛出 OutOfMemoryError...该区域和虚拟机栈抛出的异常情况一样。 JavaJava 堆是Java虚拟机所管理的内存中最大的一块。被所有线程共享的一块区域,几乎所有的对象实例都在这里分配内存。...既然属于方法区的一部分,异常抛出和方法区一致。 直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。

1.7K30
您找到你想要的搜索结果了吗?
是的
没有找到

Java内存区域与溢出异常

运行时数据区 ◆ ◆ ◆ ◆ Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。...字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。...此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。 Java虚拟机栈 ◆ ◆ ◆ ◆ 线程私有,生命周期和线程一致。...有StackOverflowError 和 OutOfMemoryError 异常Java堆 ◆ ◆ ◆ ◆ 对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。...直接内存 ◆ ◆ ◆ ◆ 非虚拟机运行时数据区的部分,也不是Java虚拟机规范中定义的内存区域。

66110

Java常见内存溢出异常分析

下面我们通过一段代码来模拟一下此种情况的内存溢出 import java.util.*; import java.lang.*; public class OOMTest{     public void...:6) 堆溢出(OutOfMemoryError:java heap space) 堆内存溢出的时候,虚拟机会抛出java.lang.OutOfMemoryError:java heap space,出现此种情况的时候...如果出现了内存溢出问题,这往往是程序本生需要的内存大于了我们给虚拟机配置的内存,这种情况下,我们可以采用调大-Xmx来解决这种问题。...gc的输出可以看出,gc以后old区使用率为134K,而字节数组为10M,加起来大于了old generation的空间,所以抛出了异常,如果调整-Xms21M,-Xmx21M,那么就不会触发gc操作也不会出现异常了...通过上面的实验其实也从侧面验证了一个结论:当对象大于新生代剩余内存的时候,将直接放入老年代,当老年代剩余内存还是无法放下的时候,出发垃圾收集,收集后还是不能放下就会抛出内存溢出异常了 持久带溢出(OutOfMemoryError

1.2K70

Java 内存溢出(OOM)异常完全指南

当应用程序试图向堆空间添加更多的数据,但堆却没有足够的空间来容纳这些数据时,将会触发java.lang.OutOfMemoryError: Java heap space异常。...需要注意的是:即使有足够的物理内存可用,只要达到堆空间设置的大小限制,此异常仍然会被触发。...: Java heap space异常。...所以使用以上配置时,请配合: -XX:+UseConcMarkSweepGC 如果你已经确保 JVM 可以卸载类,但是仍然出现内存溢出问题,那么你应该继续分析dump文件,使用以下命令生成dump文件:...你可以通过修改各种启动参数来“快速修复”这些内存溢出错误,但你需要正确区分你是否只是推迟或者隐藏了java.lang.OutOfMemoryError的症状。

3.5K13

JVM学习笔记——Java内存区域与内存溢出异常

Java虚拟机栈 描述的是一个java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量,操作数栈,动态链接,方法出口等信息。...这个区域有两种异常情况:线程请求的栈深度>JVM允许的深度,导致stackoverflow错误; 扩展时无法获取足够的内存,导致OutOfMemoryError错误。...本地方法栈 与java虚拟机栈类似,不同的是存储的是本地方法。 java堆 线程共享的内存区域,在虚拟机启动时创建,用来存放对象实例。...直接内存 这部分并不是虚拟机运行数据区的一部分,也不是JVM规范中定义的内存区域。虽然本机直接内存的分配不会受到java堆的影响,但是还会受到本机总内存以及处理器寻址空间的限制。...有两种解决方案: 对分配内存空间的动作进行同步处理 把内存分配的动作按照线程划分到不同的空间中进行,即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB) 对象的内存布局 对象中的内存布局可以分为三个区域

63240

Java虚拟机内存分区域与内存溢出异常

这类伴随线程存储的内存区域,称为线程私有的内存。 ⅡJavax虚拟机栈:很多刚学Java的学生通常会把Java内存区域分为堆和栈,这种分法比较粗糙,其中所指的栈就是现在所看的虚拟机栈。...举个例子说就是,在Java虚拟机运行一个方法时,方法内部的变量就是存储在Java虚拟机栈这个内存区域中,当然也是伴随这个方法的结束,其中的内存就释放了,也就是伴随着线程的内存区域,时线程私有的。...Ⅲ本地方法栈:与上面所看的Java虚拟机栈作用时一样的,这个内存区域时为虚拟机使用到的Native方法而服务的,显然易见,Java虚拟机栈是为虚拟机执行Java方法而服务,也就是字节码服务。...重点说下,关于这里的内存溢出问题,Java堆空间扩展方法, 通过-Xmx 和-Xms 控制,最好时设置成最小的和最大空间一样,并且为物理内存的四分之一。显而易见,对象实例存放的内存时线程共享的。...目的就是与Java堆区分开来。 主要的内存区域就是这么几块。关于内存异常(OOM) 会放在下篇内容说明。

54720

简述JVM基础(二):Java内存区域与内存溢出异常

一、概述 我们在进行Java开发的时候,很少关心Java内存分配等等,因为这些活都让JVM给我们做了。不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用。...但是我们经常面临的一个问题就是内存泄漏,JVM无法完成回收工作,导致内存占用暴涨,最后可能让程序奔溃。本章主要了解下运行时数据区域分布情况以及溢出异常。...程序计数器是唯一一个JVM没有规范OutOfMemoryError的区域 2、Java虚拟机栈(java方法) 线程私有 Java方法执行的内存模型,即方法执行时会创建一个栈帧,保存了需要的局部变量表...,报OutOfMemoryError异常 三、 直接内存 非运行时数据区域内存 Native函数分配堆外内存,堆内的DirectByteBuffer作为这块内存的引用 性能显著提高,避免了Java堆和native...句柄信息不变,相对稳定; 指针: 直接存储了上述的对象地址 优势:速度快 五、OOM 堆溢出:举例一直new新的实例对象 栈溢出:举例无限循环调用执行某个方法 方法区和运行时常量池溢出: String.intern

64310

深入理解Java中的内存溢出内存溢出内存溢出的几种情况(OOM 异常)导致内存溢出的原因内存溢出的解决方法

内存溢出的几种情况(OOM 异常) OutOfMemoryError 异常: 除了程 序计数器外 , 虚拟机内 存的其他几 个运行时区 域都有发生OutOfMemoryError(OOM)异常的可能。...2.堆溢出 一般的异常信息: java.lang.OutOfMemoryError:Java heap spaces。...如果不存在泄漏, 那就应该检查虚拟机的参数(-Xmx 与-Xms)的设置是否适当 3.方法区溢出 异常信息: java.lang.OutOfMemoryError:PermGen space。...4.运行时常量池溢出 异常信息: java.lang.OutOfMemoryError:PermGen space。...第二步, 检查错误日志, 查看“OutOfMemory” 错误前是否有其它异常或错误。 第三步, 对代码进行走查和分析, 找出可能发生内存溢出的位置。

2.7K10

Java内存溢出

Java内存溢出溢出 大量对象占据了堆空间,而且这些对象是强引用,导致无法回收 直接内存溢出 Java的NIO支持直接内存使用,从堆外获得内存空间,由于直接内存没有被Java虚拟机完全托管,若使用不当...,容易触发直接内存溢出。...多线程导致内存溢出 线程的栈空间也是在堆外分配的,和直接内存相似,线程过多,会导致内存溢出。 永久区溢出 永久区是存放元数据的区域。如果定义了太多类型,那么永久区有可能溢出。...如果系统堆空间太小,那么GC所占的时间就会较多,并且回收所释放的内存就会较少, 根据GC所占用的系统时间,以及释放的内存大小,虚拟机会评估GC的效率,一旦认为GC的效率过低,就会抛出内存溢出异常。...关于String的内存溢出 java.lang.String主要由3部分组成:代表字符数组的Value、偏移量offset和长度count.

2.6K20

OutOfMemoryError异常----Java溢出

Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下面都叫OOM)异常的肯能,下面就通过一些实例来验证异常发生的场景。...Java溢出 ---- 堆是用来存储对象实例的,当我们不断的创建对象,并且保证GC Roots和对象之间有相互的引用关系(GC Roots指垃圾回收器的对象,GC会手机那些不是GC Roots且没有被...GC Roots引用的对象),当对象数量达到最大堆的容量的时候,就会产生内存溢出异常。...堆的大小为20MB,不可扩展(将堆的最小值-Xms 参数与最大值-Xmx参数设置为一样就可以避免堆自动扩展),通过-XX:+HeapDumpOnOutOfMemoryError当虚拟机出现内存溢出的时候...后边就可以判断产生内存溢出的代码的位置。

58520

异常、堆内存溢出、OOM的几种情况

1、堆内存溢出 【情况一】:   java.lang.OutOfMemoryError: Java heap space:这种是java内存不够,一个原因是真不够,另一个原因是程序中有死循环;   ...【情况六】:   java.lang.StackOverflowError   【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。...OOM 1, OutOfMemoryError异常 除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能, Java Heap 溢出 一般的异常信息...,就会在对象数量达到最大堆容量限制后产生内存溢出异常。...异常信息:java.lang.OutOfMemoryError:PermGen space 方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。

76210

异常、堆内存溢出、OOM的几种情况

内存溢出 【情况一】:    java.lang.OutOfMemoryError: Java heap space:这种是java内存不够,一个原因是真不够,另一个原因是程序中有死循环; ...【情况六】:    java.lang.StackOverflowError    【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小...OOM 1, OutOfMemoryError异常 除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能, Java Heap 溢出 一般的异常信息...,就会在对象数量达到最大堆容量限制后产生内存溢出异常。...异常信息:java.lang.OutOfMemoryError:PermGen space 方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。

1.4K40

JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】

Java溢出 前置操作 为了更加方便的制造出内存溢出的错误,我们需要通过JVM提供的参数来设置虚拟机启动参数,因为我们是使用的IDE,设置如下 -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError...(ArrayList.java:440) at com.artisan.memory.HeapOOM.main(HeapOOM.java:16) 当java应用程序出现堆内存溢出的时候,异常堆栈信息为...关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常 如果虚拟机在扩展栈时无法申请到最够的内存空间...---- 本机直接内存溢出 DirectMemory容量可通过 -XX:MaxDirectorySize指定,如果不指定,这默认和Java堆最大内存(-Xmx指定)一样。...由于DirectMemory导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见明显的异常,如果发现OOM之后Dump很小,而程序中又直接或者间接的使用了NIO,那就可以考虑下是不是这个方面的原因

42920
领券