当前位置:首页 > 内存 > 正文

java heap space 内存溢出

  • 内存
  • 2024-05-26 14:49:51
  • 232

一、内存溢出怎么解决Java中一些常见的内存溢出【场景一】:
emoryError:Javaheapspace:这是因为Java堆内存不够原因之一就是实在不够用(比如递归层数太多等)),另一个原因是程序存在死循环;
如果java堆内存不够,可以通过调整如下JVM配置来解决:
​-Xms3062m
-Xmx3062m
【情况2】
​emoryError:GCoverheadlimitexceeded
​【解释】:JDK6出现了一个新类型的错误,就是抛出大量的时间释放一小块空间为一般是因为堆太小,导致异常的原因是内存不足。
【解决办法】:
<1.检查系统是否有使用大内存或无限循环的代码;
<2.通过添加JVM配置限制内存使用:
<-XX:-UseGCOverheadLimit
[情况3]:
emoryError:PermGenspace:这是因为P区内存不够可以调整JVM配置:
-XX:MaxPermSize=128m
-XXermSize=128m
【注意】:
[情况4]:
emoryError:Directbuffermemory
调整-XX:MaxDirectMemorySize=参数,如添加JVM配置:
-XX:MaxDirectMemorySize=128m
emoryError:unabletocreatenewnativethread
[原因]:没有足够的Stack空间来创建额外的线程,要么创建太多线程,要么Stack空间太小。
【解决办法】:由于JVM没有提供设置总堆栈空间大小的参数,但可以设置单线程堆栈大小,因此系统总用户空间为3G,除Text/外;DataSegment/BSS/MemoryMapping另外,Heap和Stack空间总量是有限的,并且正在减少。因此,如果遇到这个错误,可以通过两种方式解决:1、通过-Xss启动参数减小单线程的堆栈大小,这样就可以开启更多的线程(当然也不能太小,太小了会导致h-两个Xms-Xmx参数都会减少堆大小并将内存提交到堆栈(前提是有足够的堆空间)。
[情况6]:
verflowError
[原因]:这也是内存溢出错误的一种,即线程堆栈溢出或者方法调用层次过多(比如有无限递归调用),或者线程的阶数太小。
【解决办法】:优化程序设计,减少方法调用次数-Xss,增加线程数组大小。