linux top命令的用法详细详解 linux释放内存命令( 二 )


Buffer主要是针对写操作设计的 , 更细的说是针对内存和硬盘之间的写操作来设计的 , 目的是将写的操作集中起来进行 , 减少磁盘碎片和硬盘反复寻址过程 , 提高性能 。
在Linux系统内部有一个守护进程会定期清空Buffer中的内容 , 将其写入硬盘内 , 当手动执行sync命令时也会触发上述操作 。
Swap虽然现在的内存已经变得非常廉价 , 但是swap仍然有很大的使用价值 , 合理的规划和使用swap分区 , 对系统稳定运行至关重要 。
Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间使用 。同时linux允许使用多个交换分区或者交换文件 。
内存泄漏和内存溢出内存溢出(OOM , out of memory) , 是指程序在申请内存时 , 没有足够的内存空间供其使用 , 出现out of memory;比如申请了一个integer , 但给它存了long才能存下的数 , 那就是内存溢出 。
内存泄露(memory leak) , 是指程序在申请内存后 , 无法释放已申请的内存空间 , 一次内存泄露危害可以忽略 , 但内存泄露堆积后果很严重 , 无论多少内存 , 迟早会被占光 。
如何判断内存泄露用 jstat -gcutil PID , 观察Old这个参数 , 如果每次执行完FULLGC之后Old区的值一次比一次升高 , 就可以判断为发生了内存泄漏 。
如何判断内存溢出Heap Dump(堆转储文件)它是一个Java进程在某个时间点上的内存快照 。Heap Dump是有着多种类型的 。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息 。通常在写heap dump文件前会触发一次FullGC , 所以heap dump文件中保存的是FullGC后留下的对象信息 。
通过设置如下的JVM参数 , 可以在发生OutOfMemoryError后获取到一份HPROF二进制Heap Dump文件:
-XX:+HeapDumpOnOutOfMemoryError
生成的文件会直接写入到工作目录 。
注意:该方法需要JDK5以上版本 。
转存堆内存信息后 , 需要对文件进行分析 , 从而找到OOM的原因 。可以使用以下方式:
mat:eclipse memory analyzer, 基于eclipse RCP的内存分析工具 。具体使用参考:http://www.eclipse.org/mat/
jhat:JDK自带的java heap analyze tool , 可以将堆中的对象以html的形式显示出来 , 包括对象的数量 , 大小等等 , 并支持对象查询语言OQL , 分析相关的应用后 , 可以通过http://localhost:7000来访问分析结果 。不推荐使用 。
OOM常见原因及解决方案可参考高手总结的9种 OOM 常见原因及解决方案
释放内存在Linux系统下 , 我们一般不需要去释放内存 , 因为系统已经将内存管理的很好 。但是凡事也有例外 , 有的时候内存会被缓存占用掉 , 导致系统使用SWAP空间影响性能 , 例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后 , 内存不会被正常释放 , 而是一直作为caching 。此时就需 要执行释放内存(清理缓存)的操作了 。
释放内存操作:
bash
sync# 强制将内存中的缓存写入磁盘echo 数字 > /proc/sys/vm/drop_caches #数字可以是0-3的整数数字含义:

  • 0:不释放(系统默认值)
  • 1:释放页缓存
  • 2:释放dentries和inodes
  • 3:释放所有缓存