Chinaunix

标题: 大家看看我这个情况是不是内存泄露? [打印本页]

作者: loveoov    时间: 2008-01-02 18:10
标题: 大家看看我这个情况是不是内存泄露?
有一个程序运行一段时间 由于它占用内存太大 我把它停掉了
但是内存始终释放不了! 现在系统只剩23M内存了
Tasks:  67 total,   1 running,  66 sleeping,   0 stopped,   0 zombiei,  0.0%st
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  
Mem:   1027272k total,  1003512k used,    23760k free,     2980k buffer
Swap:  2553680k total,        8k used,  2553672k free,   960496k cached


2824 root      15   0  2160  992  800 R  0.3  0.1   0:11.80 top                                             
    1 root      15   0  2036  644  552 S  0.0  0.1   0:00.94 init                                             
    2 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                      
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0                                      
    4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                                       
    5 root      10  -5     0    0    0 S  0.0  0.0   0:05.08 event.....

现在的问题是:我如何知道这些内存用在哪里?然后又如何释放它们呢?
求教高手了
作者: scutan    时间: 2008-01-02 18:19
不是你内存泄漏的问题, linux的内存不是用来看的, 而是拿来用的, 它是为了充分利用物理内存,建立各种cache,优化程序性能,减少磁盘操作.这一点和windows系统不同,windows系统中总是有很多内存空闲,即便是进行了大量的磁盘操作后.而linux中真正空闲的物理内存几乎就看不到.
关键是linux为了提高I/O性能, 就将一些内存用来作为cache, buffer了. 尽最大可能地使用内存.
作者: isnowran    时间: 2008-01-03 01:50
原帖由 scutan 于 2008-1-2 18:19 发表
不是你内存泄漏的问题, linux的内存不是用来看的, 而是拿来用的, 它是为了充分利用物理内存,建立各种cache,优化程序性能,减少磁盘操作.这一点和windows系统不同,windows系统中总是有很多内存空闲,即便是进行了大 ...

兄弟, 道理没错, 但得结合实际啊

  1. Mem:   1027272k total,  1003512k used,    23760k free,     2980k buffer
复制代码


确实是1003512k 内存已被占用, top后, 键入'M', 按内存使用排序看看
作者: loveoov    时间: 2008-01-03 09:33
标题: 回复 #3 isnowran 的帖子
谢谢你的建议 我已经按 M 键排序了  但似乎占内存最多的进程也不过是0.4% 也就是说
这些内存加起来根本都不到1000M那么多,更加奇怪的是system-monitor 里面的内存
占用显示只有180M , 我使用free 命令查看的结果跟TOP是一样的 只有20M的空闲


PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                          

2450 haldaemo   18   0  5644 3756 1616 S  0.0   0.4   0:02.54 hald                                             
2590 root            15   0  8168 2428 1928 S  0.0  0.2   0:02.17 sshd                                             
2590 root            15   0  8168 2428 1928 R  0.0  0.2   0:02.17 sshd                                             
2382 xfs              18   0  3792 1588  716 S  0.0   0.2   0:00.01 xfs                                             
2592 root            15   0  4624 1460 1184 S  0.0  0.1   0:00.69 bash                                             
2180 root            25   0 12692 1352  592 S  0.0  0.1   0:25.01 pcscd

[ 本帖最后由 loveoov 于 2008-1-3 14:06 编辑 ]
作者: panyuanyong    时间: 2008-01-03 10:20
Mem:  1020156k av,  720676k used,  299480k free,       0k shrd,  169884k buff
       389588k active,             135984k inactive
Swap: 1052216k av,       0k used, 1052216k free                  241108k cached
大家先把内存分清楚,虚拟内存,缓存,cache都是可以被计算的,还有top命令所计算的是什么
抛砖引玉,请高手指点
作者: loveoov    时间: 2008-01-03 10:37
标题: 回复 #5 panyuanyong 的帖子
[root@localhost MC]# vmstat -s
      1027272     total memory
      1013744     used memory
        48908        active memory
       941752       inactive memory
        13528        free memory
         5256         buffer memory
       960100       swap cache
      2553680      total swap
            0            used swap
      2553680      free swap
         1084         non-nice user cpu ticks
            0            nice user cpu ticks
         1319        system cpu ticks
       193561      idle cpu ticks
         1769        IO-wait cpu ticks
          296         IRQ cpu ticks
        11543       softirq cpu ticks
            0           stolen cpu ticks
       587632      pages paged in
       431018      pages paged out
            0           pages swapped in
            0           pages swapped out
      2228440     interrupts
        44740       CPU context switches
   1199411924  boot time
         2691         forks

[ 本帖最后由 loveoov 于 2008-1-3 10:43 编辑 ]
作者: scutan    时间: 2008-01-03 12:52
原帖由 isnowran 于 2008-1-3 01:50 发表

兄弟, 道理没错, 但得结合实际啊

Mem:   1027272k total,  1003512k used,    23760k free,     2980k buffer


确实是1003512k 内存已被占用, top后, 键入'M', 按内存使用排序看看


嗯. 谢谢指出我的失误.
作者: loveoov    时间: 2008-01-03 13:55
标题: 回复 #7 scutan 的帖子
晕~~~

大哥 你帮忙我解决下问题啊
如果确有内存尚未释放 我如何得知这些内存被谁占有
又或者如何查看这些内存maps?

                      total       used       free     shared    buffers     cached
Mem:       1027272      984692   42580          0      22660     924360
-/+ buffers/cache:       37672     989600
Swap:      2553680          8         2553672

[ 本帖最后由 loveoov 于 2008-1-3 14:15 编辑 ]
作者: MMMIX    时间: 2008-01-04 09:11
标题: 回复 #8 loveoov 的帖子
try

  1. cat /proc/meminfo
复制代码

作者: busyant    时间: 2008-01-04 10:44
理论上说,linux的可用内存为:
cached+buffer
从你第一帖里面看,2980k buffer,960496k cached。所以可用内存是很多的。在有新的应用需要内存是,cached的内存会被释放出来的。
内存是否真的不够,从swap的使用上就可以看出来。而你的swap用量为0。so,你的内存是够用的。


看实际情况,我也听说过存在内存“只吞不吐”的,个人觉得应该是应用程序的问题。
作者: 柳拂风    时间: 2008-01-04 11:57
“960496k cached”
你的缓存相当大啊,不用担心。

如果你非要看“剩余内存”的话,
可以把 free + buffer + cached 都当作剩余内存,他们都是可用的内存。
上面一位兄台说的对,看linux的内存够不够用,要看Swap用的多不多。

linux这样设计是有他的道理的,不信你试试复制一个1G大的文件,连续复制两次,
在第二次的时候,在linux下复制明显比windows快得多,因为它已经把文件缓存了。
作者: loveoov    时间: 2008-01-04 13:40
标题: 回复 #11 柳拂风 的帖子
谢谢楼上的 我的问题找到了
应用程序的确是读了一个大文件到内存里面(cached)
我把该程序终止了,然后启动别的程序
发现内存被释放了很多
这个似乎跟linux的内存管理算法有关,你不启动其他程序,那部分内存一直都在cached里面

[ 本帖最后由 loveoov 于 2008-1-4 13:41 编辑 ]
作者: nxnh    时间: 2008-01-05 18:57
楼上说的对,只是显示内存被占用那么多,实际上大部分是可用的。当需要这部分内存的时候就会释放。如果你想知道到底多少内存被占用,就把每个进程占用的内存数加起来。

[ 本帖最后由 nxnh 于 2008-1-5 18:58 编辑 ]
作者: nxnh    时间: 2008-01-05 18:59
哦看错了,不是楼上。
作者: lxy9805287    时间: 2008-01-05 21:28
linux 看到内存剩的很少,并不代表被用完了.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2