
内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区、堆、栈、本地方法栈、程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM。下面来分别说明几个区域出现OOM的情况及特征。
1. java堆溢出(heap)
Java堆内存主要用来存放运行过程中所有的对象,该区域OOM异常一般会有如下错误信息:
java.lang.OutofMemoryError:Java heap space
可以通过dump的内存快照就能分析,到底是由于程序原因导致的内存泄露,还是由于没有估计好JVM内存的大小而导致的内存溢出。
2. 栈溢出(stack)
栈用来存储线程的局部变量表、操作数栈、动态链接、方法出口等信息。如果请求栈的深度不足时抛出的错误会包含类似下面的信息: java.lang.StackOverflowError。
由于每个线程占的内存大概为1M,因此线程的创建也需要内存空间。如果申请创建的线程比较多超过剩余内存的时候,也会抛出如下类似错误:java.lang.OutofMemoryError: unable to create new native thread
与栈相关的JVM参数有:
1、 -Xss: 每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.
2、 在相

本文介绍了Java中可能导致内存溢出的区域,包括堆、栈、运行时常量和方法区。堆溢出通常由于内存泄露或分配过大对象引起,栈溢出可能源于递归深度过大,运行时常量溢出与常量池容量有关,而方法区溢出则与动态生成类的数量增加有关。理解这些原因有助于优化Java应用和避免内存问题。
最低0.47元/天 解锁文章
1467

被折叠的 条评论
为什么被折叠?



