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

文章目录

  • 问题
  • 可能原因分析
    • 可能原因分析
    • 尝试各种解决方案
    • 尝试解决过程
  • 解决办法: 调整 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.mzph.cn/news/858116.shtml

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

相关文章

github-chinese,跟英文GitHub说拜拜

背景 对于我们程序员来说,Github是一个常逛的web网站,里面学习资源众多,不管是查问题还是查资料都离不开他。 但是Github作为一个国际化的网站,语言主要是英语,所以对于一些英语似懂非懂的同学来说还是有一些难处。 想过找一个国内中文的Github作为一个平替网站,但是资…

访问网站时IP被屏蔽是什么原因?

在互联网使用中&#xff0c;有时我们可能会遇到访问某个网站时IP地址被屏蔽的情况。IP地址被网站屏蔽是一个相对常见的现象&#xff0c;而导致这种情况的原因多种多样&#xff0c;包括恶意行为、违规访问等。本文将解释IP地址被网站屏蔽的常见原因&#xff0c;同时&#xff0c;…

Day 30:100346. 使二进制数组全部等于1的最小操作次数Ⅱ

Leetcode 100346. 使二进制数组全部等于1的最小操作次数Ⅱ 给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意 一个下标 i &#xff0c;并将从下标 i 开始一直到数组末尾 所有 元素 反转 。 反转 …

平面设计软件PS/AI/ID/CDR怎么选怎么下载(附教程)

随着设计行业的普遍化&#xff0c;平面设计软件也越来越多且功能越来越强大。平面设计软件需要在电脑上运行使用&#xff0c;来进行平面画面、平面文字的设计工作。如大家所了解的&#xff0c;Adobe Photoshop、Adobe Illustrator、CorelDRAW、Adobe InDesign是平面设计中最常用…

Kubernetes相关生态

1、Prometheus、Metrics Server与Kubernetes监控体系 简介&#xff1a; Prometheus 项目与 Kubernetes 项目一样&#xff0c;也来自于 Google 的 Borg 体系&#xff0c;它的原型系统&#xff0c;叫作 BorgMon&#xff0c;是一个几乎与 Borg 同时诞生的内部监控系统 Pro…

MQTT服务器/MQTT_C#客户端/Websoket连MQTT

1 . 搭建MQTT服务器 找到上传中的 emqx-5.3.2-windows-amd64 打开bin如下: 链接: emqx-5.3.2-windows-amd64 如果安装失败 在上传中找到链接: VC_redist.x64.exe 安装。 正确后在浏览器输入 http://127.0.0.1:18083 会有如下mqtt服务端管理页面: 进入客户端认证,创建一个…

IDEA Plugins中搜索不到插件解决办法

IDEA中搜不到插件有三种解决方案&#xff1a; 设置HTTP选项&#xff0c;可以通过File->Settings->Plugins->⚙->HTTP Proxy Settings进行设置 具体可参考这篇博文&#xff1a;IDEA Plugins中搜索不到插件解决办法本地安装&#xff0c;ile->Settings->Plugin…

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录 二、从回归到线性分类模型&#xff1a;分类 3.分类模型损失函数推导——极大似然估计法 &#xff08;1&#xff09;二分类损失函数——极大似然估计 &#xff08;2&#xff09;多分类损失函数——极大似然估计 4.模型损失函数推导新视角——交叉熵 &#xff08;1&#x…

安徽理工大学2计算机考研情况,招收计算机专业的学院和联培都不少!

安徽理工大学&#xff08;Anhui University of Science and Technology&#xff09;&#xff0c;位于淮南市&#xff0c;是安徽省和应急管理部共建高校&#xff0c;安徽省高等教育振兴计划“地方特色高水平大学”建设高校&#xff0c;安徽省高峰学科建设计划特别支持高校&#…

国产测温速度快且功耗低的温度传感芯片MY18E20可Pin-Pin替换DS18B20

MY18E20是一款国产高精度可编程的数字模拟混合信号温度传感芯片&#xff1b;感温原理基于CMOS半导体PN节温度与带隙电压的特性关系&#xff0c;经过小信号放大、模数转换、数字校准补偿后&#xff0c;数字总线输出&#xff0c;具有精度高、一致性好、测温快、功耗低、可编程配置…

Python+Pytest+Yaml+Request+Allure接口自动化测试框架详解

PythonPytestYamlAllure整体框架目录&#xff08;源代码请等下篇&#xff09; 框架详解 common:公共方法包 –get_path.py:获取文件路径方法 –logger_util.py:输出日志方法 –parameters_until.py&#xff1a;传参方式方法封装 –requests_util.py&#xff1a;请求方式方法封…

Web渗透-文件包含漏洞

一、简介 在程序员开发过程中&#xff0c;通常会把可重复使用的函数写到单个文件中&#xff0c;在使用某些函数时&#xff0c;直接调用此文件&#xff0c;无需在此编写&#xff0c;这种调用文件的过程一般被称为文件包含。随着网站业务的需求&#xff0c;程序开发人员一般希望…

什么是深度神经网络?与深度学习、机器学习、人工智能的关系是什么?

什么是深度神经网络&#xff1f;与深度学习、机器学习、人工智能的关系是什么&#xff1f; &#x1f916;什么是深度神经网络&#xff1f;与深度学习、机器学习、人工智能的关系是什么&#xff1f;摘要引言正文内容1. 什么是深度神经网络&#xff1f;&#x1f9e0;1.1 深度神经…

Cadence 16.6与17.4个人学习版推荐

一. 简介与下载 Cadence个人学习版是基于Cadence官方发行的安装包做了适当精简和优化的二次打包版本&#xff0c;包括了Cpature原理图设计、PSpice 电路仿真以及Allegro PCB设计等以电子产品设计为主的主要功能&#xff0c;能满足绝大部分硬件工程师的使用需求。 学习版预先已…

nacos 简述 安装运行

一、下载 官网:Redirecting to: https://nacos.io/ 文档:Nacos 快速开始 github地址:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. 下载nacos server(tips:也…

【Gradio】Custom Components | Gradio组件关键概念 后端

Gradio组件关键概念 在本节中&#xff0c;我们将讨论Gradio中组件的一些重要概念。在开发自己的组件时&#xff0c;理解这些概念非常重要。否则&#xff0c;您的组件可能会与其他Gradio组件的行为大不相同&#xff01; ✍️ 提示&#xff1a;如果你熟悉Gradio库的内部机制&…

达梦8 通过日志解释数据守护系统的关停顺序

关闭守护系统时&#xff0c;必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换模式&#xff0c;如果退出守护进程或主备库的顺序不正确&#xff0c;可能会引起主备切换&#xff0c;甚至造成守护进程组分裂。 官方推荐通过在监视器执行stop group命令关闭守护系统…

ALOS 12.5m DEM下载

1、下载地址 阿拉斯加遥感数据下载地址&#xff1a;https://search.asf.alaska.edu/ &#xff1b; 数据详情描述见地址&#xff1a;https://asf.alaska.edu/datasets/daac/alos-palsar-radiometric-terrain-correction/ &#xff1b; 2、下载步骤 2.1、勾绘研究区 在网站中…

以太坊==windows电脑本地搭建一个虚拟的以太坊环境

提供不同的选择&#xff0c;适合不同需求和技术水平的开发者&#xff1a; Geth&#xff1a;适合需要与主网兼容或构建私有网络的开发者。Ganache&#xff1a;适合快速开发和测试智能合约的开发者&#xff0c;特别是初学者。Docker&#xff1a;适合需要快速、可重复搭建环境的开…

笔记-python reduce 函数

reduce() 函数在 python 2 是内置函数&#xff0c; 从python 3 开始移到了 functools 模块。 官方文档是这样介绍的 reduce(...) reduce(function, sequence[, initial]) -> valueApply a function of two arguments cumulatively to the items of a sequence, from left …