首页 > 系统相关 >内存溢出问题分析与处理

内存溢出问题分析与处理

时间:2024-05-14 15:31:32浏览次数:24  
标签:缓存 处理 cache 内存 proc GiB 溢出 buff

内存占用情况查询

检查系统内存使用情况以 GiB 为单位进行显示

remotecmd "free -g"

1. total: 物理内存总量(GiB)。

2. used: 当前已使用的物理内存量(不包括缓冲区和缓存)(GiB)。

3. free: 可用的物理内存量(GiB)。

4. shared: 被多个进程共享的内存量(GiB)。

5. buff/cache: 作为文件系统缓存或内核缓冲区而保留的物理内存量(GiB)。

6. available: 在新应用程序启动时可以立即分配给用户的空闲内存量(GiB),这是由 free 和 buff/cache 的值计算得出的。

示例结果可能如下所示:

$ remotecmd "free -g"
              total        used        free      shared  buff/cache   available
Mem:            79          10         68           0          1        67
Swap:            0           0          0

上述示例数据含义介绍

共有 79GB 的物理内存

其中 10GB 正在使用中

还有 68GB 可用

没有任何共享内存 (shared)

大约 1GB 用于文件系统缓存和内核缓冲区 (buff/cache)

并且可供新的应用使用 67GB 左右的空闲内存 (available)

没有交换分区 (swap) 使用。

内存占用结果说明

linux系统上free命令看到的buff/cache到底是什么

  • buff/cache是buffers和cache之和

  • buff是内核缓冲区用到的内存,对应的是/proc/meminfo 中的 Buffers 值,是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,一般不会特别大(20MB 左右),它既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。

  • cache是内核页缓存和Slab用到的内存,对应的是/proc/meminfo中的Cached与SReclaimable之和,不过它既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”

  • buff是对磁盘数据的缓存,而 cache是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

  • SReclaimable 是 Slab 的一部分,是可以被回收的,例如缓存

  • linux内核使用 Slab 机制,管理文件系统的目录项和索引节点的缓存。Slab 包括两部分,其中的可回收部分,是指可以被回收的内核内存,包括目录项(dentry) 和索引节点( inode )的缓存等,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。

总结

  • buff/cache表示的是文件缓存cache、块缓存buffer以及文件系统目录项和索引节点的缓存SReclaimable之和,强调的是可以被系统回收的内容

  • 读写文件时,会把文件内容缓存到内存cache中,提高读写效率

  • 读写磁盘时,会把内容缓存到内存buffer中,提高读写效率

  • 当内存不够时,buff和cache是可以被系统回收的,当然我们也可以使用drop cache的命令手动回收,不过可能会导致脏页同步到磁盘带来的磁盘IO变高

清理系统缓存

清理指令:

sync

echo 1 >/proc/sys/vm/drop_caches

echo 2 >/proc/sys/vm/drop caches

echo 3 >/proc/sys/vm/drop_caches

上述 Linux 命令用于清理系统缓存:

1. echo 1 > /proc/sys/vm/drop_caches - 清除 page cache,这将释放已被应用程序使用的内存页并返回给操作系统。

2. echo 2 > /proc/sys/vm/drop_caches - 清除 dentries 和 inodes 的 cache,这有助于在不重启机器的情况下重新挂载文件系统或修复某些错误(如 "No space left on device")。

3. echo 3 > /proc/sys/vm/drop_caches - 执行前面两项命令中的全部操作,即完全清空所有可用的 cache。

注意:使用此类命令时要小心,因为它们会立即释放大量可用 RAM,并且可能对正在运行的应用和服务产生负面影响。因此,只有在必要且可以承担后果时才应该执行这些操作。

总结

总的来说针对内存占用问题,不能把清理缓存作为最优解,根除问题还是要从程序优化下手。

要多维度分析原因,对症下药,可能的根因如下:

1. 存在大量未处理的账单项:检查代码是否正确地从数据库查询、过滤和排序账单项,然后将它们存储在 acctItemList 中。如果账单项数量过多,则可能会占用太多的堆空间。

2. 没有及时清理垃圾:在某些情况下,应用程序没有正确释放不需要使用的对象的引用,造成了内存泄漏。通过使用 JVM 参数 -XX:+UseG1GC 或 -XX:+CMSClassUnloadingEnabled 来启用 Garbage Collection (GC) 和类卸载功能可以帮助检测和修复此问题。

3. 使用了超大的集合类型:例如 HashMap 或 HashSet,其初始大小设置得很小,而随着数据的增加,它们会迅速膨胀。可以通过调整集合类型的初始大小来避免此问题。

4. 创建了大型对象:如果创建了一个非常大的对象,并且该对象不能被 GC 立即回收,那么也会消耗掉大部分可用的堆空间。

要解决此问题,您可以尝试以下方法之一:

1. 优化代码逻辑:仔细检查您的代码,找出哪里正在生成大量的账单项或者其他大型对象。根据需求进行修改,使其更高效且不会对堆内存产生如此大的压力。

2. 增大堆内存:您可以使用 JVM 参数 -Xmx 指定最大堆大小,其中 是所需的值,单位通常为 GB。例如,-Xmx4g 表示将最大堆大小设置为 4GB。

3. 实施垃圾收集策略:启用适用于您的应用场景的 GC 算法,例如 G1GC (-XX:+UseG1GC) 或 CMS (-XX:+CMSClassUnloadingEnabled)。这些算法旨在更好地管理堆内存并减少碎片化。

4. 监控和分析:使用 Java Virtual Machine Monitoring Tools (JVisualVM, JConsole, etc.) 对您的应用进行性能分析和诊断。这将帮助您识别潜在的问题并找到最佳的解决方案。 请注意,以上只是一些常见的方法,您还应该根据您的特定情况进行调试和测试。 

 

标签:缓存,处理,cache,内存,proc,GiB,溢出,buff
From: https://www.cnblogs.com/lzg-blog/p/18191313

相关文章

  • 内存
    内存内存的基本概念内存是用来存储数据的社保,它的存储熟读介于寄存器和硬盘之间内存是CPU唯一可以访问的打容量的存储设备!所有硬盘中的程序和数据必须调入内存之后方可被CPU执行!切记:CPU不能直接处理硬盘中的数据内存的问题是软件开发中最核心的问题之一!如内存的分配,内存的释......
  • Jmeter - BeanSell 后置处理器 结合 HttpClient 使用
    背景:在后置处理器中发送POST请求,请求体为JSON数据疑问:1.如果获取Cookie?2.HttpClient怎么发送POST?3.HttpClient怎么添加Cookie?解决:1.如果获取Cookie?importorg.apache.jmeter.protocol.http.control.CookieManager;importorg.apache.jmeter.protocol.http.control.Coo......
  • EAV模型(实体-属性-值)的设计和低代码的处理方案(1)
    一般我们在开发的时候,习惯上使用常规的关系型数据库来设计数据库表,对于一些业务表的字段比较固定的场景,是一种非常不错的选择,而且查询的时候,由于是基于固定的表字段进行查询,性能基本上是最优的。不过有一些场景下,业务信息的经常变化,使用常规的关系型数据库来创建表字段、删除字段......
  • yq工具处理yaml文件
    1.yq介绍一个轻量级、可移植的命令行YAML、JSON和XML处理器。yq使用类似jq的语法,但可以处理yaml文件以及json、xml、properties、csv和tsv。它还不支持所有jq功能-但它确实支持最常见的操作和功能,并且正在不断添加更多功能 2.github地址https://github.com/mike......
  • python 虚拟环境中无法调用git 命令 处理方法
    确认Git安装:首先,确保Git已经安装在您的系统上。打开命令行窗口,运行git--version检查Git是否已安装以及其版本。手动设置GIT_PYTHON_GIT_EXECUTABLE:如果Git已安装,但gitpython仍然找不到它,您可能需要手动设置环境变量GIT_PYTHON_GIT_EXECUTABLE。在WindowsPower......
  • Linux上执行内存中的脚本和程序
    在Linux中可以不需要有脚本或者二进制程序的文件在文件系统上实际存在,只需要有对应的数据在内存中,就有办法执行这些脚本和程序。原理其实很简单,Linux里有办法把某块内存映射成文件描述符,对于每一个文件描述符,Linux会在/proc/self/fd/<文件描述符>这个路径上创建一个对应描述符的......
  • python处理exl中行的合并
    描述:现在我们有一个项目名,项目状态以及项目负责人统计的exl表格,第一列是项目名称,第二列是项目完成状态,第三列是项目负责人。但是同一个项目可能有多个负责人,但是最开始的表格并没有将这几个负责人合并起来放入同一行,所以这里就是为了将第一列相同的数据合并在一起,在owner中同时......
  • N1CTF2018 shopping:多线程堆题中堆溢出的应用
    介绍一种在多线程堆题中利用堆溢出达成任意地址分配的手法。我们知道,一个进程的主线程的堆管理main_arena在libc中,分配的chunk在堆段中。那么子线程的arena和堆块都在哪里呢?这一大串在libc前面一点点的anon就是给子线程留的arena和堆空间。arena和tcache管理chunk在这个内存段......
  • java的图像处理 java图像处理为什么耗cpu
    CPU:有的应用需要大量计算,他们会长时间、不间断地占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题。例如:代码递归导致的无限循环,正则表达式引起的回溯,JVM频繁的FULLGC,以及多线程编程造成的大量上下文切换等,这些都有可能导致CPU资源繁忙。内存:Java程......
  • 【图像处理】使用matplotlib库显示灰度图像为自定义颜色(2)
    在下面的代码中,facies_img的值只有[0,1,2]表明图像是灰度图像。通过下面的代码可以让图像显示为彩色图像importmatplotlib.pyplotaspltimportmatplotlib.colorsasmcolorsfromPILimportImageimportosimportrandomimportnumpyasnp#路径设置data_dir='data......