Java 内存溢出有以下三种
(
1
)
java.lang.OutOfMemoryError: Java heap space —-JVM Heap
(堆)溢出 JVM 在启动的时候会自动设置
JVM Heap
的值,其初始空间(即
-Xms
)是物理内存的
1/64
,最大空间(
-Xmx
)不可超过物理内存。可以利用
JVM
提供的
-Xmn -Xms -Xmx
等选 项可进行设置。Heap
的大小是
Young Generation
和
Tenured Generaion
之和。在
JVM
中如果
98
% 的时间是用于
GC
,且可用的
Heap size
不足
2
% 的时候将抛出此异常信 息。
解决方法:手动设置
JVM Heap
(堆)的大小。
(
2
)
java.lang.OutOfMemoryError: PermGen space —- PermGen space
溢出。 PermGen space 的全称是
Permanent Generation space
,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被
JVM
存放
Class
和
Meta
信息的,
Class 在被 Load
的时候被放入
PermGen space
区域,它和存放
Instance
的
Heap
区域不同,
sun
的
GC
不会在主程序运行期对
PermGen space
进行清理,所以如果你的
APP
会载 入很多 CLASS
的话,就很可能出现
PermGen space
溢出。
解决方法: 手动设置
MaxPermSize
大小
(
3
)
java.lang.StackOverflowError —-
栈溢出
栈溢出了,
JVM
依然是采用栈式的虚拟机,这个和
C
与
Pascal
都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的
“
层
”
太多了,以致于把栈区溢出了。通常 来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K
的空间(这个大约相当于在一个
C
函数内声明了
256
个
int
类型的变 量),那么栈区也不过是需要 1MB
的空间。通常栈的大小是
1
-
2MB
的。 通常递归也不要递归的层次过多,很容易溢出。
解决方法:修改程序。