运行java程序时出现oom怎么办
一、OOM简介
OOM是出现了java.lang.OutOfMemoryError问题,有两种情况:
1、内存泄漏:
内存用完没有被释放。大量的内存泄漏就会导致OOM,也就是内存溢出。
2、内存溢出,原因是:分配的太少;用的太多;用完没释放。
我的理解是:程序需要的内存空间大于系统分配的内存空间,但是我们没有给符合的空间,所以会导致出现问题。
二、OOM会导致什么
OOM会导致程序crash,因为程序申请内存过大,虚拟机无法满足,就崩溃了。
三、几种oom情况
1、HeapSize OOM(堆空间内存溢出)
关键字:java.lang.OutOfMemoryError:java heap space
这是堆空间溢出。老年代区域剩余的内存,已经无法满足将要晋升到老年代区域的对象大小,会报此错。
2、PermGen OOM(永久代内存溢出)
关键字:java.lang.OutOfMemoryError:PermGen space
永久代(PermGen space)是JVM实现方法区的地方,因此该异常主要设计到方法区和方法区中的常量池。永久代存放的东西有class和一些常量。perm是放永久区的。如果一个系统定义了太多的类型,那永久区可能会溢出。jdk1.8中,被称为元数据区。
3、DirectBuffer OOM(直接内存内存溢出)
关键字:OutOfMemoryError: Direct buffer memory
Java中普通I/O用输入/输出流方式实现,输入流InputStream(终端—>直接内存->JVM),输出流(JVM->直接内存->终端),这一过程中有kenel与JVM之间的拷贝(很多次),为了使用直接内存,Java是有一块区域叫DirectBuffer,不是JavaHeap而是cHeap的一部分。
四、总结
导致OOM问题的原因:
1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
我出现的是上面第一种情况,后面具体更新如何排查与解决。