运行java程序时出现oom怎么办

运行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)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

我出现的是上面第一种情况,后面具体更新如何排查与解决。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值