我正在运行两台Ubuntu 12.04
服务器(没有 GUI/桌面)Canonical 的云图像在Amazon EC2
。一种是micro
RAM 613MB
,一种是 RAM 介质3.75GB
。
我只有操作码的厨师安装在micro
盒子上,在大盒子上我有一个用 2048MB 内存初始化的 java 应用程序/SOLR 索引:
JAVA_OPTIONS="-server -Xms2048m -Xmx2048m -XX:+UseParallelGC -XX:NewRatio=5"
如果我已经chef
在微型盒子上运行了一段时间,然后尝试安装一个新程序,或者启动类似的程序,RabbitMQ
或者Apache2
我会收到一条错误消息,提示没有足够的可用内存来完成操作。
在大型机器上,当内存变低或机器开启一段时间后,Java 应用程序似乎会定期崩溃。
使用free
/free -m
命令我发现实际上没有太多可用内存,此时我通常必须重新启动系统以“清除”内存。
似乎内存应该在某个时间点后自动释放或“清除”,或者如果必须手动完成,则可能有更好的方法来更有效地释放/清理/管理内存。
有没有办法可以手动释放/清除系统内存?有没有一个工具可以自动检查/清理内存?
答案1
需要重启当然没有多大意义——如果你的内存已满,它一定是满的东西,如果您停止该进程(例如java应用程序),那么该内存将被释放。
但是,如果您需要这样做只是为了重新启动同一个应用程序,则存在以下问题:为什么这样一来,该进程就会消耗大量内存。通常,一个不断增长并且从不释放任何东西的进程可能会被认为是由于其内部错误而导致内存泄漏。
也就是说,你需要做的第一件事就是找出具体是什么软件造成问题的原因;此类工具top
通常用于此目的。你也可能对此有兴趣普洛格。
答案2
我在某处读到过关于删除缓存的轻率想法,但我自己从未尝试过。您可以尝试一下,风险自负:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
基本上,您在这里所做的是将缓存在内存中的磁盘写入操作提交到磁盘并清除缓存内存部分。但是,如果您的系统配置正常,那么一旦执行完此命令,它就会开始构建。但它可能会让您暂时放心,克服“内存不足”的消息。如果提交到磁盘失败,则删除缓存命令将不起作用,正如您从命令“&&”中看到的那样,因此这是一个相当安全的选项。