jvm内存溢出原因及解决方案

内存溢出的原因及解决办法:参考:https://wenku.baidu.com/view/02e3040c0366f5335a8102d276a20029bd64630f.html
1.堆栈溢出
    报错信息:java.lang.OutOfMemoryError:...java heap space...
    造成原因:要么是代码问题(引用不当、一次从数据库中取的数据太多、或申请大对象导致),要么是访问量太多并且每个访问的时间太长或数据太多,导致数据释放不掉。
    解决方法:排查代码,若代码没问题适当调整-Xmx和-Xms。
    注:这个在溢出之前可能会报 java.lang.OutOfMemoryError:GC over head limit exceeded ,系统处于高频的GC状态。

2.PermGen溢出或PermGen满了
    报错信息:java.lang.OutOfMemoryError:PermGen space
    造成原因:系统代码非常多或使用第三方包非常多、代码中使用大量的常量,或通过动态代码加载等方法;
    解决方法:增加 -XX:PermSize 和 -XX:MaxPermSize 的大小。
    注:PermGen又称永久代,是为长期对象保留的空间。

3.使用ByteBuffer中的allocateDirect()的时候
    报错信息:java.lang.OutOfMemoryError:Direct buffer memory
    造成原因:在直接或间接使用 ByteBuffer 的 allocateDirect() 时,不做clear的操作,就会出现此问题。
    解决方法:设置参数 -XX:MaxDirectMemorySize 。
    注:很多javaNIO框架中会把 ByteBuffer 中的 allocateDirect()封装成其他的方法。

4.线程内存不足
    报错信息:java.lang.StackOverflowError
    造成原因:-Xss 太小了,代码中申请了很多局部调用的栈针内容存放在当前用户线程中。
    解决方法:增加 -Xss 的大小。
    注:线程在jdk1.4以前是256K,1.5以后是1M。

5.第五类错误
    报错信息:java.lang.OutOfMemoryError:unable to create new native thread
    造成原因:这个错误是无法为线程分配一块内存区域造成的;要么是本身内存就不够,要么是heap的空间设置的太大,导致剩余的内存不够。
    解决方法:增加内存或适当设置 -Xmx 和 -Xms 的大小。
    注:线程基本只占 heap 以外的内存区域。

6.地址空间不够
    报错信息:java.lang.OutOfMemoryError:request {} byte for {}out of swap
    造成原因:一般是由于地址空间不够导致的。

以下是一些参数的含义:
    -Xmx:为Heap区域的最大值;
    -Xms:为Heap区域的初始值;注:线上环境需要与 -Xmx 一致,否则 capacity 的值会来回飘动。
    -Xss(或-ss):指一个线程的native空间;注:还有个参数 -XX:ThreadStackSize ,这两个参数会冲突,一般谁在后面谁生效。
    -XX:PermSize与-XX:MaxPermSize:指class装载空间或者说是方法区(但不是本地方法区);注:只有Hotspot可以设置这块区域。


__EOF__

本文作者masy
本文链接https://www.cnblogs.com/masy-lucifer/p/16093395.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   masy  阅读(1329)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示