1. 首页
  2. IT资讯

JVM 发生内存溢出的 8 种原因、及解决办法

“u003Cpu003EJava后端,选择 u003Cu002Fpu003Eu003Cpu003E技术博文,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRelVn4tG7zucng” img_width=”535″ img_height=”10″ alt=”JVM 发生内存溢出的 8 种原因、及解决办法” inline=”0″u003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E来自:割肉机 | 责编:乐乐u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E链接:cnblogsu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fwilliamjieu002Fpu002F11164572.htmlu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Colu003Eu003Cliu003Eu003Cpu003EJava 堆空间u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EGC 开销超过限制u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E请求的数组大小超过虚拟机限制u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EPerm gen 空间u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EMetaspaceu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E无法新建本机线程u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E杀死进程或子进程u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E发生 stack_trace_with_native_methodu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E1. Java 堆空间u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:5颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E无法在 Java 堆中分配对象u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E吞吐量增加u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E应用程序无意中保存了对象引用,对象无法被 GC 回收u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线程的处理能力无法跟上结束队列的增长u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E使用 -Xmx 增加堆大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E修复应用程序中的内存泄漏u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E2. GC 开销超过限制u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:5颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003EJava 进程98%的时间在进行垃圾回收,恢复了不到2%的堆空间,最后连续5个(编译时常量)垃圾回收一直如此。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E使用 -Xmx 增加堆大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E使用 -XX:-UseGCOverheadLimit 取消 GC 开销限制u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E修复应用程序中的内存泄漏u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E3. 请求的数组大小超过虚拟机限制u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:2颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E应用程序试图分配一个超过堆大小的数组u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E使用 -Xmx 增加堆大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E修复应用程序中分配巨大数组的 bugu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E4. Perm gen 空间u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:3颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003EPerm gen 空间包含:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E类的名字、字段、方法u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E与类相关的对象数组和类型数组u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EJIT 编译器优化u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E当 Perm gen 空间用尽时,将抛出异常。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E使用 -XX: MaxPermSize 增加 Permgen 大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E不重启应用部署应用程序可能会导致此问题。重启 JVM 解决u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E5. Metaspaceu003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:3颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E从 Java 8 开始 Perm gen 改成了 Metaspace,在本机内存中分配 class 元数据(称为 metaspace)。如果 metaspace 耗尽,则抛出异常u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E通过命令行设置 -XX: MaxMetaSpaceSize 增加 metaspace 大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E取消 -XX: maxmetsspacedizeu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E减小 Java 堆大小,为 MetaSpace 提供更多的可用空间u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E为服务器分配更多的内存u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E可能是应用程序 bug,修复 bugu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E6. 无法新建本机线程u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:5颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E内存不足,无法创建新线程。由于线程在本机内存中创建,报告这个错误表明本机内存空间不足u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E为机器分配更多的内存u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E减少 Java 堆空间u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E修复应用程序中的线程泄漏。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E增加操作系统级别的限制u003Cu002Fpu003Eu003Cu002Fliu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eulimit -au003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E用户进程数增大 (-u) 1800u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cliu003Eu003Cpu003E使用 -Xss 减小线程堆栈大小u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E7. 杀死进程或子进程u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:1颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E内核任务:内存不足结束器,在可用内存极低的情况下会杀死进程u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E将进程迁移到不同的机器上u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E给机器增加更多内存u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E与其他 OOM 错误不同,这是由操作系统而非 JVM 触发的。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E8. 发生 stack_trace_with_native_methodu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E发生频率u003Cu002Fstrongu003E:1颗星u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E造成原因u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E本机方法(native method)分配失败u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E打印的堆栈跟踪信息,最顶层的帧是本机方法u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E解决方案u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E使用操作系统本地工具进行诊断u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003E”

原文始发于:JVM 发生内存溢出的 8 种原因、及解决办法

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17874.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code