Java 中(堆溢出、内存溢出、栈溢出)

 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.*Error —- 栈溢出 栈溢出了, JVM 依然是采用栈式的虚拟机,这个和 C 与 Pascal 都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 “ 层 ” 太多了,以致于把栈区溢出了。通常 来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K 的空间(这个大约相当于在一个 C 函数内声明了 256 个 int 类型的变 量),那么栈区也不过是需要 1MB 的空间。通常栈的大小是 1 - 2MB 的。 通常递归也不要递归的层次过多,很容易溢出。 解决方法:修改程序。
上一篇:Golang Heap 源码剖析


下一篇:最短路径算法