Linux - 记一次某Java程序启动报错(申请内存失败)

news2024/11/21 0:32:19

文章目录

  • 问题
  • 可能原因分析
    • 可能原因分析
    • 尝试各种解决方案
    • 尝试解决过程
  • 解决办法: 调整 overcommit_meory参数
  • overcommit_memory详解
    • 什么是 `overcommit_memory`?
    • `overcommit_memory` 的选项及其含义
    • 配置 `overcommit_memory`
      • 查看当前设置
      • 设置 `overcommit_memory`
      • 配置 `overcommit_ratio`
    • 参数设置对系统的影响
      • 启发式内存分配(0)
      • 总是允许内存分配(1)
      • 禁止过度分配(2)
    • 实例与使用建议
      • 数据库服务器
      • 高性能计算应用
  • RedHat官网调优指南 (临时或永久改变系统的内存管理行为)
    • 临时调整内存参数
    • 永久调整内存参数
    • 参考命令

在这里插入图片描述


问题

启动的时候直接抛出如下异常

Native memory allocation (mmap) failed to map 2879048192 bytes for committing reserved memory

在 Linux 上部署项目时遇到 Native memory allocation (mmap) failed to map 2879048192 bytes for committing reserved memory 错误,这通常表明系统在尝试分配内存时遇到了问题。虽然 free 命令显示有足够的可用内存,并且 ulimit -a 显示内存没有被限制,但仍可能有其他原因导致该问题。


可能原因分析

可能原因分析

  1. 内存碎片化

    • 尽管 free 显示有足够的可用内存,但这些内存可能不是连续的。mmap 需要分配连续的内存块,如果内存碎片化严重,可能无法找到足够大的连续内存块。
  2. 地址空间不足

    • 32 位系统的虚拟地址空间有限,即使物理内存充足,虚拟地址空间也可能不足。
    • 64 位系统通常不太可能出现这个问题,但在极端情况下(例如,系统运行多个内存密集型应用程序)也可能发生。
  3. 内核参数限制

    • 某些内核参数(如 vm.max_map_countvm.overcommit_memory)可能限制了内存分配。
  4. 容器或虚拟机限制

    • 如果在 Docker 容器或虚拟机中运行应用程序,容器或虚拟机本身可能有内存限制。

尝试各种解决方案

  1. 检查内存碎片化

    • 使用 cat /proc/meminfo 查看内存详细信息。
    • 重点关注 MemFreeMemAvailableHugePages_TotalHugePages_Free
    • 使用 sudo sysctl -a | grep vm.min_free_kbytes 确认内核保留的最小空闲内存。
  2. 调整内核参数

    • vm.max_map_count:最大 mmap 区域数。
      sudo sysctl -w vm.max_map_count=262144
      
    • vm.overcommit_memory:内存过度提交策略。 【我们通过调整参数,临时修复了该问题
      sudo sysctl -w vm.overcommit_memory=1
      
  3. 检查虚拟地址空间

    • 确保系统运行在 64 位模式下。
    • 检查应用程序是否有特定的内存限制。
  4. 检查容器/虚拟机限制

    • 对于 Docker 容器:
      docker inspect <container_id> | grep Memory
      
    • 对于虚拟机,检查虚拟机管理工具的内存设置。

尝试解决过程

  1. 检查内存详细信息:

    cat /proc/meminfo
    
  2. 检查内核参数:

    sudo sysctl -a | grep vm
    
  3. 调整内核参数:

    sudo sysctl -w vm.max_map_count=262144
    sudo sysctl -w vm.overcommit_memory=1
    
  4. 检查 Docker 容器内存设置:

    docker inspect <container_id> | grep Memory
    
    

解决办法: 调整 overcommit_meory参数

调整 overcommit_meory参数。
在这里插入图片描述


overcommit_memory详解

在 Linux 操作系统中,内存分配是一个关键的任务。内存的高效使用和管理直接影响系统的性能和稳定性。overcommit_memory 是一个重要的内核参数,用于控制内存分配策略。

什么是 overcommit_memory

overcommit_memory 是 Linux 内核中的一个参数,通过 /proc/sys/vm/overcommit_memory 文件进行配置。它决定了内核如何处理内存分配请求,尤其是在可用物理内存不足的情况下。

overcommit_memory 的选项及其含义

overcommit_memory 参数有三个可能的值,每个值对应一种特定的内存分配策略:

  1. 0 - 启发式内存分配(默认值)

    • 内核根据一定的启发式算法决定是否允许内存分配请求。内核会考虑当前的内存使用情况和预期的内存需求,通常会允许合理范围内的内存过度分配。
    • 优点:灵活性较高,适合大多数应用场景。
    • 缺点:可能在内存非常紧张时导致 OOM(Out Of Memory)错误。
  2. 1 - 总是允许内存分配

    • 内核允许所有内存分配请求,无论当前的内存使用情况如何。这意味着即使系统内存已经耗尽,内核也会继续分配内存。
    • 优点:极大的灵活性,确保所有内存分配请求都能成功。
    • 缺点:可能导致严重的内存不足问题,甚至导致系统崩溃。
  3. 2 - 禁止过度分配

    • 内核严格限制内存分配,只有在有足够的物理内存和交换空间时才允许内存分配请求。这个策略会结合 overcommit_ratio 参数来确定可用的内存总量。
    • 优点:提高系统稳定性,防止 OOM 错误。
    • 缺点:降低内存分配灵活性,可能拒绝一些合理的内存分配请求。

配置 overcommit_memory

可以通过以下命令查看和设置 overcommit_memory 参数:

查看当前设置

cat /proc/sys/vm/overcommit_memory

设置 overcommit_memory

例如,将 overcommit_memory 设置为 1:

echo 1 > /proc/sys/vm/overcommit_memory

配置 overcommit_ratio

如果 overcommit_memory 设置为 2,还需要配置 overcommit_ratio 参数来决定可用内存总量。overcommit_ratio 是一个百分比值,表示可分配的物理内存和交换空间的比例。

echo 50 > /proc/sys/vm/overcommit_ratio

这个配置表示内核允许分配的内存总量为物理内存加上 50% 的交换空间。

参数设置对系统的影响

启发式内存分配(0)

这种设置平衡了灵活性和稳定性,适合大多数应用场景。系统会尝试合理地分配内存,防止过度分配,但在极端情况下可能仍会遇到 OOM 错误。

总是允许内存分配(1)

这种设置提供了最大的灵活性,但也伴随着最高的风险。适用于需要极大内存灵活性的场景,如高性能计算或科学计算,但需注意可能的内存不足问题。

禁止过度分配(2)

这种设置提供了最大的稳定性,适用于需要严格内存控制的场景,如数据库服务器或关键业务应用。通过合理设置 overcommit_ratio,可以确保系统不会因内存不足而崩溃。

实例与使用建议

数据库服务器

对于数据库服务器,建议使用禁止过度分配的策略(设置 overcommit_memory 为 2),并合理配置 overcommit_ratio 以确保稳定性。例如,对于一个拥有 16GB 内存和 8GB 交换空间的系统,可以将 overcommit_ratio 设置为 50:

echo 2 > /proc/sys/vm/overcommit_memory
echo 50 > /proc/sys/vm/overcommit_ratio

高性能计算应用

对于高性能计算应用,可以考虑启用总是允许内存分配的策略(设置 overcommit_memory 为 1),以确保所有内存分配请求都能成功:

echo 1 > /proc/sys/vm/overcommit_memory

RedHat官网调优指南 (临时或永久改变系统的内存管理行为)

https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-captun

在 Linux 上,调整内存相关参数可以临时或永久改变系统的内存管理行为。

临时调整内存参数

临时调整内存参数可以通过向 /proc/sys 文件系统中的相应文件写入值来实现。这种方法在系统重启后会失效,需要重新设置。

  1. 调整 overcommit_memory 参数

    echo 1 > /proc/sys/vm/overcommit_memory
    
  2. 调整 overcommit_ratio 参数

    echo 50 > /proc/sys/vm/overcommit_ratio
    
  3. 调整 max_map_count 参数

    echo 262144 > /proc/sys/vm/max_map_count
    
  4. 调整 nr_hugepages 参数

    echo 128 > /proc/sys/vm/nr_hugepages
    
  5. 调整其他相关参数

    echo 65536 > /proc/sys/kernel/msgmax
    echo 65536 > /proc/sys/kernel/msgmnb
    echo 1985 > /proc/sys/kernel/msgmni
    echo 4294967296 > /proc/sys/kernel/shmall
    echo 68719476736 > /proc/sys/kernel/shmmax
    echo 4096 > /proc/sys/kernel/shmmni
    echo 32768 > /proc/sys/kernel/threads-max
    echo 65536 > /proc/sys/fs/aio-max-nr
    echo 1048576 > /proc/sys/fs/file-max
    

永久调整内存参数

为了使内存参数的调整在系统重启后依然有效,可以将这些设置写入 /etc/sysctl.conf 文件,或在 /etc/sysctl.d/ 目录下创建一个新的配置文件。

  1. 编辑 /etc/sysctl.conf 文件

    sudo nano /etc/sysctl.conf
    

    添加以下内容:

    vm.overcommit_memory = 1
    vm.overcommit_ratio = 50
    vm.max_map_count = 262144
    vm.nr_hugepages = 128
    kernel.msgmax = 65536
    kernel.msgmnb = 65536
    kernel.msgmni = 1985
    kernel.shmall = 4294967296
    kernel.shmmax = 68719476736
    kernel.shmmni = 4096
    kernel.threads-max = 32768
    fs.aio-max-nr = 65536
    fs.file-max = 1048576
    
  2. 创建新的配置文件(例如 /etc/sysctl.d/99-custom.conf

    sudo nano /etc/sysctl.d/99-custom.conf
    

    添加相同的内容:

    vm.overcommit_memory = 1
    vm.overcommit_ratio = 50
    vm.max_map_count = 262144
    vm.nr_hugepages = 128
    kernel.msgmax = 65536
    kernel.msgmnb = 65536
    kernel.msgmni = 1985
    kernel.shmall = 4294967296
    kernel.shmmax = 68719476736
    kernel.shmmni = 4096
    kernel.threads-max = 32768
    fs.aio-max-nr = 65536
    fs.file-max = 1048576
    
  3. 应用配置

    sudo sysctl -p
    

参考命令

  • 临时调整参数

    echo 1 > /proc/sys/vm/overcommit_memory
    echo 262144 > /proc/sys/vm/max_map_count
    
  • 永久调整参数

    sudo nano /etc/sysctl.d/99-custom.conf
    sudo sysctl -p
    

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何为您的企业实施营销翻译

要为您的业务实施营销翻译&#xff0c;您需要执行以下步骤&#xff1a; 评估市场需求 你首先需要做的事情之一是确定你的产品或服务可以销售的地区或国家。这可以通过 看看在这些地区已经取得成功的竞争对手阅读行业的市场调查和预测&#xff0c;了解市场趋势和潜在机会评估…

经销or直营,新老车企殊途终要同归

步入2024&#xff0c;汽车圈的新人、老人都逐渐活成了对方的样子。 2024年5月&#xff0c;先后有消息传来&#xff0c;阿维塔要从直营模式全部转向经销模式&#xff0c;蔚来新发布的子品牌“乐道”未来可能考虑合作或加盟&#xff0c;并单独建设门店。 而就在5月1日&#xff…

网工内推 | 国企信息工程师,信息系统项目管理师优先,最高14薪

01 上海浦东软件园股份有限公司 &#x1f537;招聘岗位&#xff1a;信息化管理工程师 &#x1f537;岗位职责&#xff1a; 1. 根据公司战略、数字化总体架构规划和IT 技术趋势&#xff0c;制定信息化系统的规划与设计&#xff0c;并制定实施计划。 2. 统筹公司信息化系统管理…

ONLYOFFICE 文档 8.1 发布:重塑文档处理

官网链接&#xff1a;ONLYOFFICE官网 一、PDF编辑器功能强大&#xff1a;创造跟随想象 在追求无界办公与高效创作的今天&#xff0c;ONLYOFFICE再次引领风潮&#xff0c;正式发布了其桌面编辑器的最新版本——ONLYOFFICE桌面编辑器8.1。这一版本不仅巩固了其作为顶级办公套件…

【分布式文件系统HDFS】文件操作基本命令的使用

目录 一、按照下述要求写出相应的文件操作命令&#xff0c;执行并观察结果 1. 新建目录 1.1 在本地文件系统按要求创建如下的文件夹 1.2 在HDFS文件系统按要求创建如下的文件夹 2. 编辑文件test1.txt&#xff0c;放入本地文件夹 /opt/user/myfile 3. 使用moveFromLocal命令…

计算机视觉:项目实战

目录 SSD1.安装ananconda2.安装cuda和cudnn3.配置Pytorch环境3.1 pytorch环境的配置与激活3.2 pytorch库的安装3.3 其它依赖库的安装 遇到的问题&#xff1a;1.EOFError: Ran out of input.2.No module named dlib. SSD 1.安装ananconda 见另一篇博文&#xff1a;https://blo…

随机步问题

随机步问题 1.题目简介2.题目分析3.创建变量4.主程序5.程序效果6.程序可以改进的点 1.题目简介 2.题目分析 数组初始化 生成随机方向 判断程序结束的标志 当前元素为Z&#xff0c;或者四个方向都堵住了 3.创建变量 arry[ROW][COL]创建二维数组 _Bool a,b,c,d判断是否会出现四…

搜索引擎的妙用:掌握这些技巧,让你的搜索更高效!

搜索引擎是我们日常生活中不可或缺的工具&#xff0c;它帮助我们快速找到所需的信息。但是&#xff0c;你真的知道如何高效地使用搜索引擎吗&#xff1f;下面&#xff0c;我将分享一些高级搜索技巧&#xff0c;让你的搜索更加精准和高效。 1. 完全匹配搜索 当你想要搜索一个特…

Python数据可视化-地图可视化

1.首先绘制实现数据可视化的思维导图 具体要实现什么功能-怎么处理&#xff0c;先把思路写好 数据来源&#xff1a; 爬取的数据 运行结果&#xff1a; 部分代码&#xff1a; 完整代码请在下方↓↓↓&#x1f447;获取 转载请注明出处&#xff01;

调频信号FM的原理与matlab与FPGA实现

平台&#xff1a;matlab r2021b&#xff0c;vivado2023.1 本文知识内容摘自《软件无线电原理和应用》 调频(FM)是载波的瞬时频率随调制信号成线性变化的一种调制方式&#xff0c;音频调频信号的数学表达式可以写为&#xff1a; Fm频率调制&#xff0c;载波的幅度随着调制波形…

不同材质的不锈钢氮气柜优缺点和使用场景分析

不锈钢氮气柜是一种用于存储对湿度敏感的物品的专用储藏设备&#xff0c;通过充入干燥的氮气来降低柜内湿度&#xff0c;保护存储物免受氧化或腐蚀。 根据不同的材质&#xff0c;不锈钢氮气柜可分为&#xff1a; 一、201不锈钢氮气柜&#xff1a; 201不锈钢因其较低的镍含量而成…

【揭秘新潮流】实践教学新宠SmartEDA,让电子设计课“潮“起来!

在信息时代的浪潮下&#xff0c;电子设计课程早已不再是枯燥乏味的代名词。随着技术的飞速发展&#xff0c;一种名为SmartEDA的实践教学新选择正逐渐崭露头角&#xff0c;为电子设计课程注入了前所未有的活力与趣味性。今天&#xff0c;就让我们一起走进SmartEDA的世界&#xf…

25届最近4年中国科学技术大学自动化考研院校分析

中国科学技术大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近4年考研分数情况 四、近4年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、…

Maven列出所有的依赖树

在 IntelliJ IDEA 中&#xff0c;你可以使用 Maven 插件来列出项目的依赖树。Maven 插件提供了一个名为dependency:tree的目标&#xff0c;可以帮助你获取项目的依赖树详细信息。 要列出项目的依赖树&#xff0c;可以执行以下步骤&#xff1a; 打开 IntelliJ IDEA&#xff0c;…

Kubernetes之Controller详解

本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述&#xff0c;希望对您有所帮助&#xff01; 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一&#xff0c;负责管理…

CCS的安装步骤

CCS的安装步骤 安装之前有几件重要的事情要做&#xff1a; 首先肯定是要下载安装包啦&#xff01;点击此处是跳到官网下载地址安装包不能处的路径中不能包含中文关闭病毒防护和防火墙&#xff0c;以及其他杀毒软件最后是在重启后进行安装 主要的步骤如下&#xff1a; 找到安…

想布局短视频赛道,云微客AI矩阵系统告诉你诀窍

随着人工智能技术的不断发展&#xff0c;越来越多的企业和个人创作者开始意识到智能化的重要性。而现阶段&#xff0c;随着短视频市场的膨胀扩大&#xff0c;批量成片、智能创作、定时发布是当下重要的趋势&#xff0c;企业如果想在短视频赛道分一杯羹&#xff0c;智能化的平台…

python目录树生成器

代码如下&#xff1a; import os from colorama import Fore, Style, init from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, RIGHT, Y, END# 初始化 colorama init(autoresetTrue)def print_directory_tree(root_dir, text_widget, indent, lastTrue):"…

allWebPlugin助力iWebOffice2015插件在高版本浏览器使用

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

STM32CubeMX与RT-Thread Studio协助使用(实现点亮LED)

1创建自己的项目 1-1选择板子 1-2生成的项目 运行一下看是否创建成功 零警告零错误 2配置STM32Cude 2-1找打如图图标点击&#xff08;CubeMX的图标&#xff09; 2-2输入自己安装的路径选中exe文件 点击Browse 找到如图选中&#xff0c;在打开&#xff08;STM32CubeMX的安装路…