OutOfMemoryError的原因有哪些?怎么解决?
OutOfMemoryError 分为多种不同的错误:
- Java heap space
原因:JVM 中 heap 的最大值不满足需要
解决:
调高 heap 的最大值,-Xmx 的值调大
如果程序存在内存泄漏,增加 heap 空间也只是推迟该错误出现的时间而已,要检查程序是否存在内存泄漏
- GC overhead limit exceeded
原因:JVM 在 GC 时,对象过多,导致内存溢出
解决:调整 GC 的策略,在一定比例下开始GC而不使用默认的策略,或将新代和老代设置合适的大小,可以微调存活率。如在老代 80% 时就是开始GC,并且将 -XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)设置的更合理
- Java perm space
原因:JVM 中 perm 的最大值不满足需要,perm 一般是在 JVM 启动时加载类进来
解决:调高 heap 的最大值,即 -XX:MaxPermSize 的值调大解决。如果 JVM 运行较长一段时间而不是刚启动后溢出的话,很有可能是由于运行时有类被动态加载,此时可以用 CMS 策略中的类卸载配置解决如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
- unable to create new native thread
原因:当 JVM 向系统请求创建一个新线程时,系统内存不足无法创建新的 native 线程
解决:JVM 内存调的过大或者可利用率小于 20%,可以将 heap 及 perm 的最大值下调,并将线程栈内存 -Xss 调小,如:-Xss128k
- Requested array size exceeds VM limit
原因:应用程序试图分配一个大于堆大小的数组
解决:
检查 heap 的 -Xmx 是不是设置的过小
heap 的 -Xmx 已经足够大,检查应用程序是不是存在 bug 计算数组的大小时存在错误,导致数组的 length 很大,从而导致申请巨大的数组
- request XXX bytes for XXX. Out of swap space
原因:从 native 堆中分配内存失败,并且堆内存可能接近耗尽,操作系统配置了较小的交换区,其他进程消耗所有的内存
解决:检查操作系统的 swap 是不是没有设置或者设置的过小;检查是否有其他进程在消耗大量的内存,导致 JVM 内存不够分配
- Java 自学经历
- Java 面试题 H5
- Java 面试题小程序
相关文章
- redirect_uri 參数错误的解决的方法
- 【Vue】 错误:Already included file name ‘××ב differs from file name ‘××ב only in casing的解决方法
- 【react】什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行
- 面试题:Mysql除了串行化怎么解决幻读
- MQ怎么解决消息堆积的问题
- testflight无法载入app该怎么解决
- nginx: [emerg] bind() to 0.0.0.0:443 failed(98:Address already in use)解决方法
- failed to create process怎么解决
- 【AGC】如何解决事件分析数据本地和AGC面板中显示不一致的问题?
- 从本机到vmware win7虚拟机传输文件卡顿问题的解决
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果
- 打开的IE网页不是最大化的解决方法
- 身份认证协议攻击怎么解决
- 浅析SQL的窗口函数是什么,怎么使用,为什么需要使用窗口函数以及利用窗口函数解决TopN问题
- Gmail将利用AI技术解决人为因素造成的被钓鱼问题
- 【AGC】马甲包怎么解决agconnect-services.json的问题
- 数据库使用truncate清理非常多表时碰到外键约束时怎么高速解决
- HP ProCurve为企业客户提供融合网络解决方
- 红外摄像机经常起雾该怎么解决
- loss=nan是什么意思?解决方法? Not a Number