频繁读写文件导致内存使用率过高

2023-11-01

最近接到一个客户反馈,说是服务器内存使用过高,总内存16G,使用top命令查看可用内存已经不足1G了。

客户环境服务器为linux,部署了3个tomcat,每个tomcat均有大量的日志产生。

让客户使用free -m检查一下

此处有必要解释一下free命令返回的各个参数的意思(直接转了)。

解释:

  •    total:是总的物理内存
  •    used:使用中的内存
  •    free:完全空闲的内存
  •    shared:多个进程共享的内存 
  •    buffers:写缓存,在写入磁盘之前,先把数据缓存一段时间,可以释放
  •    cache:读缓存,读取过的文件,会缓存一段时间。可以释放
  •    -buffers/cache:应用程序实际使用中的内存大小,等于used-buffers-cached(Mem列的三个数)
  •    +buffers/cache:可供使用的内存总量,等于free+buffers+cached(Mem列的三个数)
  •    Swap:不解释,都能看懂的

可用看到cache已经达到10G了。是什么导致cache如此之大呢?

网上可用查到解释:

什么是Cache Memory(缓存内存):

当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。

其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。

为了确认这种情况是由于文件读写造成的,以及该情况下不影响程序正常运行(cache能正确自动释放),特进行试验。

环境准备

内存8G,我准备了一个近2G的文件。下面进行cp操作并检查cached的数值。

通过测试可以发现可用内存越来越少,cached的内存越来越大,经过几次cp之后可用内存已经只有142m了。

此时我启动了3个tomcat,然后再kill掉这3个tomcat进程。

tomcat进程启动没有报内存溢出,把3个tomcat进程kill掉之后free明显多了(原先被文件读写占用的cached内存在free不足的时候回收了被tomcat占用,在tomcat被kill之后释放出来)。

 

结论:

1、linux系统在文件读写时会写入内存缓存,导致“看上去”可用内存会减少。

2、cached掉的内存不用担心,在需要内存时会释放出来。

3、cached掉的内存在需要释放时也不是全部释放的,而是一部分一部分的释放的。

 

附手动释放cached内存的方式:

如何释放Cache Memory(缓存内存):

用下面的命令可以释放Cache Memory:

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches


注意,释放前最好sync一下,防止丢失数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

频繁读写文件导致内存使用率过高 的相关文章

  • 【Linux】Vmware虚拟机安装教程

    目录 一 下载Vmware和CentOS 二 使用Vmware创建虚拟机 1 创建虚拟机 2 稍后安装镜像 3 选择对应镜像版本 4 输入虚拟机名称和保存地址 5 指定虚拟机磁盘大小 6 完成 三 安装CentOS 1 查看cpu是否开启虚
  • 实现 Java 平台的三种方式

    广泛地说 只要能执行 Java bytecode 者 就可以称为 Java 平台 Java platform 大致上 实现 Java 平台的方式有三种 分别是 Java 虚拟机器 Java Virtual Machine JVM Java
  • spark-submit 报错 Initial job has not accepted any resources

    spark submit 报这样的错误 WARN scheduler TaskSchedulerImpl Initial job has not accepted any resources check your cluster UI to
  • 红帽6虚拟机安装流程

    红帽虚拟机的安装流程 redhat6 本篇文章将会带大家完整的安装linux红帽虚拟机 傻瓜式配置红帽虚拟机 超详细安装流程 1 下载好所需要的镜像文件 并且放在一个固定的文件夹中 如果没有iso文件 评论一下 发给你 2 打开虚拟机创建新
  • Vmware安装后,没有VMnet0

    安装虚拟机之后 发现只有VMnet1和VMnet8 没有VMnet0 后来了解到桥接不是添加一个VMnet0虚拟网卡 而是添加网络服务 下面是VMware虚拟网卡的说明 网络类型 网络适配器名 Bridged VMnet0 NAT VMne
  • VirtualBox虚拟机网络连接设置的四种方式

    VirtualBox是一款SUN出品的非常优秀的虚拟机程序 版本也非常齐全 你可以在官网上找到适合各种操作系统平台的版本 这里我先给大家大致讲解下VBox的网络配置及应用 VirtualBox的提供了四种网络接入模式 它们分别是 1 NAT
  • 是否存在一种在 atexit 或类似方法中释放内存而不使用全局变量的方法?

    我正在用 C 开发一个项目 我需要释放分配的内存并在退出之前关闭所有打开的文件 我决定实施一个clean函数将完成所有这些事情并调用它atexit因为有很多可能的退出场景 问题是atexit不允许我使用参数设置函数 所以我无法发送到clea
  • C - 在内存被释放()后访问数据?

    我读了很多关于标准 C 中的 malloc 和 free 的内容 据我了解 您malloc 只为了一次记忆 然后你free 同样的记忆只有一次 这可能是不好的做法 但我明白 在你之后malloc 内存 您可以定义多个指向它的指针 而一旦你f
  • 怎样才能实现免费的Interface类呢?

    我有一个小问题 正如标题所说 我想释放一个其类实现接口的对象 但是出现错误 无效的指针操作 我的界面 Interface Type An interface definition IMessageEvents Interface IInte
  • 为什么 free() 不释放所有已分配的内存位置? [复制]

    这个问题在这里已经有答案了 我不知道是我做错了什么还是我的观念有些错误 include
  • cudaFree 不释放内存

    下面的代码计算两个向量 a 和 b 的点积 正确的结果是8192 当我第一次运行它时 结果是正确的 然后 当我第二次运行它时 结果是之前的结果 8192 等等 1st iteration result 8192 2nd iteration
  • “免费”的冲突类型

    我收到错误 免费 的冲突类型 打电话给free 下面的函数 int main char fx x 2 5 x 1 node fxNode buildTree fx sizeof fx sizeof char printf deriveFro
  • 当尝试释放堆管理器分配的内存时会发生什么,而堆管理器分配的内存超出了要求的内存?

    这个问题是在一次采访中问我的 假设 char p malloc n 分配了 n 个以上的内存 即分配了 N 个字节的内存 并且使用 free p 来释放分配给 p 的内存 堆管理器可以执行这种错误的分配吗 现在会发生什么 是释放 n 个字节
  • 在不同的函数中分配的空闲内存?

    我正在尝试学习 C 目前正在尝试编写基本的堆栈数据结构 但我似乎无法掌握基本的知识malloc free right 这是我一直在使用的代码 我只是在这里发布一小部分来说明特定问题 而不是全部代码 但错误消息是通过运行此示例代码生成的val
  • 为什么在释放指针后取消引用它时会得到不同的结果?

    我有一个关于 C 内存管理的问题 以及 Debian GNU Linux 下的 GCC 4 3 3 根据 K R 的 C 编程语言书籍 第 7 8 5 章 当我释放指针然后取消引用它时 会出现错误 但我有一些疑问 因为我注意到有时 正如我在
  • C++ 中可以混合使用 free 和构造函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 调用free 或delete而不是delete 有什么危险吗 https stackoverflow com questions 1612031 is there any danger in call
  • C 中的释放字符串

    如果我写 char a malloc sizeof char 4 a abc char b abc 我是否需要释放该内存 还是由我的系统完成 在您的情况下 您将无法释放动态分配的内存 因为您正在丢失对它的引用 试试这个 include
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 多维字符数组?

    我想做的是创建一个二维字符串数组 下面的seg错误立即出现 请问是什么问题 void add2 char b char i if i b 0 0 char malloc 120 sprintf b 0 0 s hithere b 0 1 c
  • 基本 Malloc/免费

    如果我的程序有这样的片段 struct Node node while node malloc 100 do stuff with node 这意味着每次我循环 while 循环时 我都会新分配节点指针指向的 100 个字节 对吧 如果这是

随机推荐

  • 手写算法-FIFO

    一 思路 FIFO是英文First In First Out 的缩写 是一种先进先出的数据缓存器 他与普通存储器的区别是没有外部读写地址线 这样使用起来非常简单 但缺点就是只能顺序写入数据 顺序的读出数据 其数据地址由内部读写指针自动加1完
  • 什么是字节流?Java 中有哪些字节流

    在 Java 中 字节流是一种输入和输出数据的方式 它以字节为单位进行操作 字节流主要用于处理二进制数据 如图像 音频和视频等 在本文中 我们将介绍什么是字节流 Java 中的字节流有哪些以及一些示例代码 什么是字节流 字节流是输入和输出数
  • vue devtools安装及使用

    vue devtools使用 在vue学习开发之前 应安装vue devtools为我们提供一个界面 用来查看vue组件和全局状态管理器vuex中记录的数据 如果你可以访问google web store 请在store中安装 git cl
  • 解决:IDEA不能识别*.js文件

    在进行IDEA进行前端开发时 必不可少的会用到JavaScripts 在进行 js文件时 发现其不识别 为文本样式 如下图所示 Setting gt Editor gt File Types gt JavaScript gt 填写 js 这
  • ethers不同版本返回余额的整数值类型,以及对大整数值的处理差异性的比较

    目录 一 安装6v版本 二 安装5v版本 三 ethers 5v版本 1 获取余额 2 对于数值的处理
  • host command not found,host命令不可用的问题

    如果出现host command not found host命令不可用的问题 如果在centos环境下使用yum install bind utils进行安装bind utils的软件包 如果是unbuntu环境下可以使用sudo apt
  • Keil5编译——Error: L6218E: Undefined symbol

    1 具体问题 在初学RTThread着手最基础的 动态内存分配线程来控制LED闪烁 keil5编译时遇到以下的错误提示 STM32L431RC BearPiLED STM32L431RC BearPiLED axf Error L6218E
  • 今天软件开发面临的挑战

    1 开发模式的进化 2 软件工程意识的觉醒 3 软件过程的可视化管理 4 团队开发与合作 5 可重用性 可维护性和灵活性 6 质量控制和成本控制 7 加快上市时间 8 提高竞争优势
  • 街霸五显示登录服务器,pc版的街霸五如何登陆服务器

    发布时间 2016 03 27 Bungie与动视合作的首款FPS大作正式版将与9与9日登陆PS4和Xbox One PC版何在 动视目前已经确认PC版的正在制作中 但是动视并未透露详细的上市日期 不过已经有细心 标签 游戏资讯 游戏新闻
  • 窗函数设计FIR滤波器

    文章目录 实验原理 常见的窗函数 矩形窗Boxcar 巴特利特窗Bartlett 汉宁窗Hanning 哈明窗Hamming 布莱克曼窗Blackman 凯泽窗Kaiser 设计步骤 MATLAB实现 实验原理 有限单位冲激响应序列 h n
  • CV计算机视觉核心03-初步认识机器学习(线性回归模型、梯度下降法、线性回归模型解决数字识别问题(没用auto grad)、逻辑回归模型sigmoid、作业:线性回归解决数字识别auto grad)

    CV计算机视觉核心03 初步认识机器学习 线性回归模型 梯度下降法 区分一下回归模型和分类模型 线性回归模型解决数字识别问题 没有使用auto grad 逻辑回归模型 sigmoid函数 如何使用自动梯度计算 auto grad使用的注意事
  • SPEOS—光学产品设计及仿真工具

    SPEOS是ANSYS公司功能强大的光学仿真软件 用于光学设计 环境与视觉模拟 成像仿真等 强大的解决方案提供了可视化光学系统和直观的人机交互平台 其仿真技术已广泛用于汽车 电子电器 精密仪器 照明设备等领域 SPEOS软件内嵌ISO和CI
  • 01趣味算法 ---- 走进算法

    14天阅读挑战赛 努力是为了不平庸 算法学习有些时候是枯燥的 这一次 让我们先人一步 趣学算法 欢迎记录下你的那些努力时刻 算法学习知识点 算法题解 遇到的算法bug 等等 在分享的同时加深对于算法的理解 同时吸收他人的奇思妙想 一起见证技
  • go语言结构体与JSON序列化

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 易于人阅读和编写 同时也易于机器解析和生成 JSON键值对是用来保存JS对象的一种方式 键 值对组合中的键名写在前面并用双引号 包裹 使用冒号 分隔
  • Linux笔记_4(群组和文件目录属性)

    Linux笔记 4 标签 空格分隔 Linux 使用者与群组 1 在Linux里面 每个档案都有 Users Group Others 三种身份的权限 a 档案拥有者 b 群组 每个账号可以在多个群组中 c 其他人 2 预设情况下 系统上所
  • Word临时文件怎么恢复?可持续的文件恢复方法

    在word进行文档编辑时 有时候会发生误删除word文件的情况 这个时候word临时文件怎么恢复呢 其实word临时文件还存在于电脑中 本篇文章就来为大家讲解word临时文件怎么恢复 word临时文件在哪个文件夹 如果你在编辑文件时 没有手
  • STL迭代器简介

    标准模板库 The Standard Template Library STL 定义了五种迭代器 下面的图表画出了这几种 input output forward bidirectional random access 要注意 上面这图表并
  • 实现简易版——MyLinkedList

    class Node String val Node pre 双向 Node next Node String val this val val public class MyLinkedList private Node head 头结点
  • 视频号短视频创作需要注意的6个剪辑技巧(细节提高推荐率)

    昨天 老蒋有在 视频号短视频创作不能做的8件事情 文章中总结到我们在视频号创作短视频的时候几个不应该做的事情可能会导致账户被封 作品被限流的问题 继续接着这个话题 我们来聊一聊短视频需要注意的几个剪辑技巧 这些细节可能会提高用户的阅读体验
  • 频繁读写文件导致内存使用率过高

    最近接到一个客户反馈 说是服务器内存使用过高 总内存16G 使用top命令查看可用内存已经不足1G了 客户环境服务器为linux 部署了3个tomcat 每个tomcat均有大量的日志产生 让客户使用free m检查一下 此处有必要解释一下