OOM 错误
1:OutOfMemoryError
- 堆内存溢出,这种情况是最常见的,一般是由于内存泄漏或者是堆设置过小造成的。堆的大小可以通过Xms,Xmn进行调节。
- PermGen溢出,也就是方法区溢出了产生了大量的class对象在方法区,这种情况可以更改方法区的大小来解决。过多的常量尤其是字符串也会造成方法区溢出
- 栈溢出,即StackOverFolw,一般是由于死循环或者是深度调用造成的,或者是栈过小。一般设置Xss来设置栈的大小。
2:为什么会有OOM
- 内存分配的少了,自身本来就少。
- 应用用的太多,用完没有释放,白白的浪费了
- 内存泄露
- 申请使用完的内存没有释放,导致系统不能再次使用这段内存
- 内存溢出
- 申请的内存超出了JVM所能够提供的内存,此时就是溢出
3:JVM的内存模型
-
PC,程序计数器
-
虚拟机栈
- Java方法执行的内存模型
- 每一个Java方法的调用都有入栈和出栈的过程
-
本地方法栈
- 为native 方法提供内存环境
-
堆
- 对象分配的地方,内存垃圾回收的主要区域
-
方法区
- 用于存储已经被JVM加载的类信息,常量信息,静态变量。Hotspot中的永久代
- JDK8 中完全的移除了永久代
- 字符串存在永久代中,容易出现性能问题和内存的溢出
- 永久代的大小不容易确定,常常出现OOM
- 永久代会为垃圾回收带来不必要的复杂度,而且回收的效率偏低
- 元空间使用的是本地内存,而永久代使用的是JVM内存
-
运行时常量池
- 方法区的一部分,存储各种的常量,比如各种的字面量,