[转帖]一次操作系统报错OutOfMemory Error的处理记录
在启动公司内嵌的tomcat容器时出现报错, 如下:
-
# There is insufficient memory for the Java Runtime Environment to continue.
-
# Native memory allocation (malloc) failed to allocate 160088 bytes for AllocateHeap
-
# An error report file with more information is saved as:
-
# /users/xxx/hs_err_pidxxxx.log
然后查看/users/xxx/hs_err_pidxxxx.log
内容:
-
#
-
# There is insufficient memory for the Java Runtime Environment to continue.
-
# Native memory allocation (mmap) failed to map 357564416 bytes for committing reserved memory.
-
# Possible reasons:
-
# The system is out of physical RAM or swap space
-
# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
-
# Possible solutions:
-
# Reduce memory load on the system
-
# Increase physical memory or swap space
-
# Check if swap backing store is full
-
# Decrease Java heap size (-Xmx/-Xms)
-
# Decrease number of Java threads
-
# Decrease Java thread stack sizes (-Xss)
-
# Set larger code cache with -XX:ReservedCodeCacheSize=
-
# JVM is running with Unscaled Compressed Oops mode in which the Java heap is
-
# placed in the first 4GB address space. The Java Heap base address is the
-
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
-
# to set the Java Heap base and to place the Java Heap above 4GB virtual address.
-
# This output file may be truncated or incomplete.
-
#
-
# Out of Memory Error (os_linux.cpp:2749), pid=4252, tid=0x00007f3f38bb5700
-
#
-
# JRE version: (8.0_201-b09) (build )
-
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode linux-amd64 compressed oops)
-
# Core dump written. Default location: /users/ems/core or core.4252 (max size 521000 kB). To ensure a full core dump, try "ulimit -c unlimited" before starting Java again
-
#
-
...
翻译过来就是本地内存分配失败, 可能的原因有两种
- 系统物理内存或虚拟内存不足
- 程序在压缩指针模式下运行, Java堆会阻塞本地堆的增长
然后使用free -m
命令查询, 发现内存足够:
-
total used free shared buffers cached
-
Mem: 7983 5415 2568 0 170 1460
-
-/+ buffers/cache: 3784 4199
-
Swap: 15257 71 15186
那么尝试按第二个问题进行解决, 可能的方案有两种:
- 禁止使用压缩指针模式
- 方法: 在catalina.sh中
JAVA_OPTS
的值后面添加-XX:-UseCompressedOops, 再重启tomcat
- 方法: 在catalina.sh中
- 将Java堆的起始地址设置成使Java堆大小+起始地址大于4G,
- 原因: 请参考 https://blogs.oracle.com/poonam/running-on-a-64bit-platform-and-still-running-out-of-memory,
- 方法: 在这里我将起始地址简单直接的设为4G即4294967296
在尝试过这两种方法后发现依然报同样的错误
这时我在想会不会是堆内存过大, 导致系统无法分配内存, 于是进行尝试: 把堆内存减少一半, 看看效果.
- 方法: 在在catalina.sh中
JAVA_OPTS
的值中把原来的-Xms1024m -Xmx2048m
改为-Xms512m -Xmx1024m
, 再重启tomcat
结果JVM启动成功, 问题解决.
后续思考: 为什么在可用内存充足的情况下系统无法分配给JVM更多内存? 一直没有想到完美的解释, 如果有明白的兄弟可以指教一下.
尝试对后续思考进行解答: 原因应该还是内存不足, 可能操作系统会预留一些内存, 而我的机器上默认的启动参数是-Xms1024m -Xmx2048m
, 可能已经超过了系统允许分配的最高值, 因此无法分配内存. 当我使用java -Xms10m -Xmx20m
可以启动成功, java -Xms500m -Xmx2000m
会失败, 因此, 应该还是内存不足的问题
对后续思考的最终解答及该问题的完美解决方案:
这个问题是由于/proc/meminfo
下的vm.overcommit_memory
被设置成不允许overcommit
造成的
首先了解一下overcommit
的意思: 用户进程申请的是虚拟地址, 而这个虚拟地址是不允许任意申请的, 因为虚拟内存需要物理内存做支撑, 如果分配太多虚拟内存, 会对性能参数影响. overcommit
就是对虚拟内存的过量分配
vm.overcommit_memory
的用处: 控制过量分配的策略. 这个参数一共有3个可选值:
0
: Heuristic overcommit handling. 就是由操作系统自己决定过量分配策略1
: Always overcommit. 一直允许过量分配2
: Don't overcommit. 不允许过量分配
在这个案例里面, 使用sysctl vm.overcommit_memory
来查看, 发现vm.overcommit_memory = 2
, 即采用的是不允许过量分配的设置. 而在错误日志中也证明了这一点:
-
CommitLimit: 15951192 kB
-
Committed_AS: 15837036 kB
Committed_AS: OS会预测启动这个程序时, 所有的进程可能会用到多少的内存, 如果超过了CommitLimit, 就会报错
解决方案是sudo sysctl vm.overcommit_memory=0
, 即vm.overcommit_memory = 0
, 允许系统自己决定过量分配策略
原文地址:https://www.jianshu.com/p/3f8692eb3660
转载于:https://www.cnblogs.com/jpfss/p/11052535.html
[转帖]一次操作系统报错OutOfMemory Error的处理记录的更多相关文章
- 一次操作系统报错OutOfMemory Error的处理记录
在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to contin ...
- thinkphp6安装报错,composer install tp6 报错 Parse error: syntax error
composer install thinkphp6 报错 Parse error: syntax error, unexpected ':', expecting '{' in vendor\top ...
- JS function document.onclick(){}报错Syntax error on token "function", delete this token
JS function document.onclick(){}报错Syntax error on token "function", delete this token func ...
- 一个参数大小写引发的uploadify报错 "Syntax error, unrecognized expression: #"
上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2 报错原因:参数ID[hi ...
- yum报错:Error: xz compression not available
测试服务器(centos6.5)经过一段时间的折腾,有一天在上面进行yum操作时突然出现下面的报错: Error: xz compression not available 最后经过一番排查,发现原因 ...
- yum报错: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
在Centos 5.x或6.x上安装RHEL EPEL Repo repository,资源库,源的意思.RHEL EPEL(Extra Packages for Enterprise Linux) ...
- redis报错Windows error 0x70(a large memory)
redis报错Windows error 0x70 redis 嫌弃你内存不够了,就给你不开第二个实例. The Windows version of Redis allocates a large ...
- ASSERT报错:error C2664: “AfxAssertFailedLine”: 不能将参数 1 从“TCHAR []”转换为“LPCSTR”
转载请注明来源:崨雁嫀筝 http://www.cnblogs.com/xuesongshu 这个错误是我在把tinyxml修改为宽字符(Unicode)版本时候遇到的问题,我首先按关键字把所有有ch ...
- 命令passwd报错因inode节点处理记录
命令passwd报错因inode节点处理记录故障现象:1.修改密码时报错 passwd: Authentication token manipulation error2.添加用户报错:unable ...
- 启动安卓模拟器报错 emulator: ERROR: x86_64 emulation currently requires hardware acceleration! CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1) 解决办法
启动安卓模拟器报错 emulator: ERROR: x86_64 emulation currently requires hardware acceleration! CPU accelerat ...
随机推荐
- 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎
摘要:昇腾AI计算解决方案以极致算力,端边云融合.全栈创新,开放生态的硬核实力.用户可以使用标准的Matrix接口实现业务引擎,对外释放昇腾AI加速能力. 从卷积神经网络中的矩阵乘法(GEMM)说起 ...
- 昇腾CANN:为你开启机器人开发的Buff 加成
摘要:昇腾AI提供了全栈技术和产品,构筑人工智能的算力基座,赋能上层应用 本文分享自华为云社区<昇腾CANN:为你开启机器人开发的Buff 加成>,作者:华为云社区精选 . 昇腾AI基础软 ...
- 深度解读鸿蒙轻内核CPU占用率
摘要:CPUP(Central Processing Unit Percentage,CPU占用率)分为系统CPU占用率和任务CPU占用率.用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规 ...
- 8个方法管理 GitHub 用户权限
如同世界正在经历的疫情,由于网络攻击的大幅增加,许多公司也遭受着"网络疫情",保障代码安全迫在眉睫.在之前的文章中我们了解了安全使用 GitHub 的21条最佳实践.阅读本文,将带 ...
- Solon Aop 特色开发(6)新鲜货提取器,提取Bean的函数进行定制开发
Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...
- kubeadm init port is in use
前一次 init 时,master ip 写错了,导致init 失败,修改IP后再次执行时,报 kubeadm init 失败,port is in use Last login: Thu Oct 1 ...
- BBS项目(四):临时评论渲染 文章子评论功能 后台管理页面搭建 添加文章页面搭建
目录 临时评论样式渲染 文章子评论业务逻辑 后台管理页面搭建 后台管理页面模板创建 添加文章页面搭建 富文本编辑器 添加文章初步实现 添加文章功能优化 beautifulsoup模块基本使用 临时评论 ...
- #3038:How Many Answers Are Wrong (带权并查集)
HDU 3038 第一次接触带权并查集 //带权并查集 更新父节点的同时更新权值 #include<bits/stdc++.h> using namespace std; const in ...
- AtCoder Beginner Contest 166 (A~E)
比赛链接:Here AB水题 C - Peaks 题意: 给出 \(n\) 个观察台的高度,以及 \(m\) 条边,定义"好观察台":比所有直接相连的观测台都高 思路: 因为道路是 ...
- (转)Github+jsDelivr+PicGo 打造稳定快速、高效免费图床
转载自:https://www.itrhx.com/2019/08/01/A27-image-hosting/ 写在开头,之前我是使用Gitee作为图床和Picgo搭配使用的 (图片不允许超过1MB) ...