速成网站建设,微网站缺点,济南网站设计公司排名,wordpress 文章过滤一、分类
OOM:java.lang.OutOfMemoryError
1.1 堆内存溢出
堆内存#xff08;Heap Space#xff09;没有足够空间存放新创建的对象
java.lang.OutOfMemoryError:Javaheap space原因#xff1a; 请求创建一个超大对象#xff0c;通常是一个大数组。 超出预期的访问量/数…一、分类
OOM:java.lang.OutOfMemoryError
1.1 堆内存溢出
堆内存Heap Space没有足够空间存放新创建的对象
java.lang.OutOfMemoryError:Javaheap space原因 请求创建一个超大对象通常是一个大数组。 超出预期的访问量/数据量通常是上游系统请求流量飙升常见于各类促销/秒杀活动可以结合业务流量指标排查是否有尖状峰值。 过度使用终结器Finalizer该对象没有立即被 GC。 内存泄漏Memory Leak大量对象引用没有释放JVM 无法对其自动回收常见于使用了 File 等资源没有回收。
方案 针对大部分情况通常只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如果仍然没有解决可以参考以下情况做进一步处理 如果是超大对象可以检查其合理性比如是否一次性查询了数据库全部结果而没有做结果数限制。 如果是业务峰值压力可以考虑添加机器资源或者做限流降级。 如果是内存泄漏需要找到持有的对象修改代码设计比如关闭没有释放的连接。
1.2 GC投入产出比低
应用程序已经基本耗尽了所有可用内存 GC 也无法回收。 当 Java 进程花费 98% 以上的时间执行 GC但只恢复了不到 2% 的内存且该动作连续重复了 5 次:
java.lang.OutOfMemoryError:GC overhead limit exceeded1.3 永久代或元空间 JDK1.8溢出
永久代Permanent Generation或Metaspace JDK1.8已用满通常是因为加载的 class 数目太多或体积太大。
永久代存储对象
加载/缓存到内存中的 class 定义包括类的名称字段方法和字节码常量池对象数组/类型数组所关联的 classJIT 编译器优化后的 class 信息。
方案 程序启动报错修改 -XX:MaxPermSize 启动参数调大永久代空间。 应用重新部署时报错很可能是加载了多份 class 信息只需重启 JVM 即可解决。 运行时报错应用程序可能会动态创建大量 class而这些 class 的生命周期很短暂但是 JVM 默认不会卸载 class可以设置 -XX:CMSClassUnloadingEnabled 和 -XX:UseConcMarkSweepGC这两个参数允许 JVM 卸载 class。
如果上述方法无法解决可以通过 jmap 命令 dump 内存对象 jmap-dump:formatb,filedump.hprof 然后利用 Eclipse MAT https://www.eclipse.org/mat 功能逐一分析开销最大的 classloader 和重复 class。
1.4 无法创建一个新native线程
每个 Java 线程都需要占用一定的内存空间当 JVM 向底层操作系统请求创建一个新的 native 线程时如果没有足够的资源分配就会报此类错误。
java.lang.OutOfMemoryError:Unableto createnewnativethread原因 线程数超过操作系统最大线程数 ulimit 限制 线程数超过 kernel.pid_max只能重启 native 内存不足
方案 升级配置为机器提供更多的内存 降低 Java Heap Space 大小 修复应用程序的线程泄漏问题 限制线程池大小 使用 -Xss 参数减少线程栈的大小 调高 OS 层面的线程最大数执行 ulimia-a 查看最大线程数限制使用 ulimit-u xxx 调整最大线程数限制。ulimit -a … 省略部分内容 … max user processes (-u) 16384
1.5 虚拟内存溢出
可用的虚拟内存已被耗尽。 虚拟内存Virtual Memory由物理内存Physical Memory和交换空间Swap Space两部分组成。 当运行时程序请求的虚拟内存溢出时就会报错。
Out of swap space原因
地址空间不足物理内存已耗光应用程序的本地内存泄漏native leak例如不断申请本地内存却不释放。执行 jmap-histo:live 命令强制执行 Full GC如果几次执行后内存明显下降则基本确认为 Direct ByteBuffer 问题。
方案 升级地址空间为 64 bit 使用 Arthas 检查是否为 Inflater/Deflater 解压缩问题如果是则显式调用 end 方法。 Direct ByteBuffer 问题可以通过启动参数 -XX:MaxDirectMemorySize 调低阈值。 升级服务器配置/隔离部署避免争用。