`

Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案

阅读更多

问题描述

Linux内存使用量超过阈值,使得Java应用程序无可用内存,最终导致程序崩溃。即使在程序没有挂掉时把程序停掉,系统内存也不会被释放。

 

找原因的过程

这个问题已经困扰我好几个月了,分析过好多次都没有找到原因,网上查了一下该问题其他人也都遇到过,不过并没有什么好的解决方案,因为项目一直没有上线,每次当内存不足时导致程序崩溃都是重启服务就好了,索性也就没花太多的时间来找问题。现在项目马上上线了,不能在出现程序崩溃的情况了,况且还是前置系统,更不能出现任何问题。

最开始一直认为是程序的原因导致内存泄漏,使用jdk自带的jmap -F -dump:live,format=b,file=/usr/local/sztFront/logs/heapdump.bin命令输出过几次dump文件,通过MemoryAnalyzer分析,应用程序没有耗内存过大的变量。后台猜测是否日志输出过多导致的,毕竟是前置系统,每天的报文量特别大,日志能到达5,6G。所以把日志接收报文关了,日志大小马上降下来了,每天200M。程序挂掉的时间变长了,原来差不多一周就挂掉了,现在可以达到两周左右才挂掉,还是不行,没有冲根本上解决问题。经过在网上搜索各种相关的问题,问题出现在Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0RHEL 4.x之前的版本都没有。这就可以解释为什么我的项目总挂掉了,我的项目主要就是处理文件的,所以接收和下载的文件会被缓存起来,一直耗着内存不释放,即使把程序停掉也不会释放内存。最后找到了三条执行,可以清理cached的内存

三条指令:

sync

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

执行完这三条指令后通过free -m命令查看,free可用内存马上增多,buff/cache列值变小,说明内存被释放了,但是不能总是手动的执行这三条指令,所以最后写了一个shell脚本,开启Linux定时任务crond,每天早上检查一次free内存,当小于4G时执行这三条命令(注:系统内容20G)。

注意:在执行这三条命令之前一定要先执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件

 

解决方案(手动)

1. 修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.  
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  
As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.  
This tunable was added in 2.6.16.  

 注意:在执行这三条命令前先执行sync命令

 

解决方案(自动)

1、编写shell定时任务脚本freemem.sh

 

#! /bin/sh  
used=`free -m | awk 'NR==2' | awk '{print $3}'`  
free=`free -m | awk 'NR==2' | awk '{print $4}'`  
echo "===========================" >> /app/memory/logs/mem.log  
date >> /app/memory/logs/mem.log  
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log  
if [ $free -le 4000 ] ; then  
                sync && echo 1 > /proc/sys/vm/drop_caches  
                sync && echo 2 > /proc/sys/vm/drop_caches  
                sync && echo 3 > /proc/sys/vm/drop_caches  
                used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`  
                free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`  
                echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log  
                echo "OK" >> /app/memory/logs/mem.log  
else  
                echo "Not required" >> /app/memory/logs/mem.log  
fi  
exit 1 

 2、使用crontab -e命令编辑当前用户的crontab

 

0 6 * * * /usr/local/tomcat/sztFileFront/bin/freemem.sh  

 定时任务编写参考:http://www.jb51.net/article/15008.htm

 

3、重启crond服务

 

/sbin/service crond restart  

 4、查看crond服务是否重启成功

 

/sbin/service crond status  

 

最后,问题解决。我设定的定时任务是每天早上6点执行一次freemem.sh脚本。

 

 

 

原文参考:http://blog.csdn.net/u014740338/article/details/66975550

 

 

分享到:
评论

相关推荐

    解决 linux 下 buffcache 占用过高的问题.docx

    在标题和描述中提到的问题,即"Linux下buff/cache占用过高",这是一个常见的系统性能优化问题,尤其是对于运行Java应用或者其他资源密集型服务的云服务器而言。这里我们将深入探讨buff/cache的作用、为何会占用过多...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    "java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码" 在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过...

    Linux内存buffer和cache的区别

    - 只有当buffers和cache都用尽且物理内存也被完全占用时,系统才会开始使用swap空间,即硬盘上的虚拟内存。 #### 五、Buffer与Cache的具体区别 1. **用途不同**: - Buffer:主要用于I/O写操作,例如将数据写入...

    linux内存中cache分析

    在Linux系统中,内存管理是操作系统的核心组成部分,它负责为各种进程分配和回收内存资源。在Linux内核中,内存的使用效率通过缓存(Cache)机制得到了显著提升。本篇文章将深入探讨Linux内存中的缓存分析,以及如何...

    Linux内存中Swap和Buffer Cache机制

    Linux内存管理是操作系统的核心组成部分,尤其在服务器环境中,理解Swap和Buffer Cache机制至关重要。Swap空间是Linux实现虚拟内存的关键,它允许系统将物理内存中暂时不用的数据存储到硬盘上,以此扩展内存容量。当...

    Linux内核内存Cache机制原理

    6. **内存压力与交换**:当系统内存不足时,Linux内核会根据内存压力来决定是否淘汰Page Cache。如果淘汰仍不足以释放足够的内存,内核将开始将页面交换到磁盘上的交换分区,这是一个相对慢速的过程。内核使用多种...

    linux 查看 cache 中文件

    在实际应用中,了解缓存中的文件对于系统管理员来说非常有用,例如,可以帮助他们监控系统的资源使用情况,找出占用大量内存的文件,或者在性能调优时,确定是否需要清除某些缓存以释放内存资源。此外,对于开发者而...

    linux下释放cache内存

    然而,在某些情况下,用户可能会观察到系统内存占用率非常高,这主要是因为大量的空闲内存被用作缓存。虽然这并不会直接影响系统的正常运行,但有时可能需要释放这些缓存以便为其他进程分配更多可用内存。 #### 二...

    J2Cache 基于内存和 Redis 的两级 Java 缓存框架

    Java 两级缓存框架,可以让应用支持两级缓存框架 ehcache(Caffeine) + redis 。避免完全使用独立缓存系统所带来的网络IO开销问题。J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存...

    Linux下应用程序到底使用了多少内存

    首先,当我们通过`top`命令查看内存使用情况时,要注意它显示的内存占用并不完全代表应用程序实际消耗的内存。这是因为Linux系统会预留一部分内存作为缓冲区(buffers)和缓存(cached)。缓冲区主要用于存储磁盘块...

    linux内存中buffer与cache的区别

    当我们使用`free`命令查看系统的内存使用情况时,可能会注意到一个现象:即使系统似乎没有运行太多的应用程序,`free`显示的空闲内存数值也相对较低。这是因为Linux操作系统采取了一种“内存不用则废”的设计理念...

    Linux操作系统中内存buffer和cache的区别.docx

    在 Linux 操作系统中,内存 buffer 和 cache 是两个重要的概念,它们都是占用内存的,但是它们的作用和特点却不同。本文将详细介绍内存 buffer 和 cache 的概念、区别以及其在系统中的作用。 内存 buffer 和 cache ...

    Java中各类Cache机制实现解决方案

    **ShiftOne Java Object Cache** 是一种细粒度的对象缓存解决方案,主要针对Java应用程序中的对象管理问题。它作为Java标准库的一部分存在,主要用于解决非持久化对象的状态管理问题。ShiftOne的主要特点是: - **...

    windows server 2008 r2内存耗尽解决方案

    Windows Server 2008 R2 是微软公司推出的服务器操作系统之一,但是在实际使用中,可能会出现内存耗尽的问题,导致服务器性能下降,影响业务运行。于是,微软官方发布了内存耗尽解决方案,以解决这个问题。 ...

    Linux操作系统中内存buffer和cache的区别.pdf

    ### Linux操作系统中内存buffer和cache的区别 #### 一、引言 在Linux操作系统中,内存管理是一项关键的技术,它直接影响到系统的性能和稳定性。本文将详细介绍Linux系统中内存buffer和cache的区别及其工作原理,...

    减少Oracle内存占用

    这不仅会影响系统的稳定性,还可能导致其他应用程序因可用内存不足而受到影响。本文将详细介绍如何通过合理设置SGA(共享全局区)来有效降低Oracle 10g在Windows XP系统中的内存占用,并确保日常学习与工作的正常...

    释放指定文件占用cache的方法

    通过代码实现释放linux 系统特定文件占用的cache内存的方法

    手工释放linux内存.pdf

    通过手动释放缓存的方式,可以在一定程度上缓解Linux系统因缓存占用过多内存而导致的“内存不足”问题。这种方法特别适用于那些需要即时释放内存资源以供其他任务使用的场景。需要注意的是,在日常运维中应谨慎使用...

    深入理解Linux虚拟内存管理.rar

    Linux虚拟内存管理是操作系统核心的重要组成部分,它负责为应用程序提供比物理内存更大的地址空间,并有效地管理物理内存资源。本资料“深入理解Linux虚拟内存管理”旨在帮助读者深入了解这一复杂的系统机制,包括...

    java连接cache数据库说明,数据库驱动,cache可视化工具

    Intersystems提供了适用于Java的JDBC驱动,它允许Java应用程序与Cache进行通信。驱动通常以`.jar`文件的形式提供,需要将其添加到Java项目的类路径中。 2. **连接字符串**:建立连接时,需要一个连接字符串,该字符...

Global site tag (gtag.js) - Google Analytics