JVM中的内存溢出详解

本文涉及:JVM各区域的内存溢出的原因及解决办法。堆溢出、栈溢出、方法区溢出、直接内存溢出

除了程序计数器外,JVM中的其他区域都可能会发生内存溢出


堆溢出
java.lang.OutOfMemoryError: Java heap space
这个异常是由于堆中存在大量的对象,这些对象无法通过垃圾回收进行收集从而导致的堆内存溢出,堆溢出呢,分为两种情况:
  • 内存泄露(大量无用的对象与根节点还具有管理,无法被回收)

  • 对象过多


如何解决?
  • 内存泄露情况可以通过工具找出泄露的具体代码然后进行优化

  • 对象太多可以适当根据机器的性能使用-Xms -Xmx等参数调整堆的大小

  • 优化数据结构,避免内存浪费


直接内存溢出
OutOfMemoryError

直接内存并不属于运行时数据区的一部分。但是也需要占用内存,如果我们在分配内存时把本机的总内存都分配给运行时数据区的各个部分而忽略了直接内存的话就会容易引起直接内存溢出。Java中使用直接内存最多的就是NIO。

如何解决?
  • 使用-XX:MaxDirectMemorySize属性指定直接内存的大小

方法区溢出
java.lang.OutOfMemoryError: PermGen space
因为方法区主要是负责存放类的相关信息,而且因为gc的次数也不像堆来的频繁,所以当class越来越多的时候就会引起此异常

如何解决?
  • 使用-XX:PermSize参数调整方法区的大小

栈溢出
 
 
 
 
如何解决?
  • 使用-Xss参数调整栈的大小

 
 
当创建的线程多到栈的内存不足以支撑时就会引起此异常

如何解决?

  • 使用-Xss参数调整栈的大小

640?wx_fmt=jpeg

万水千山总是情,点个 “在看” 行不行!!!

640?wx_fmt=png 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值