zoukankan      html  css  js  c++  java
  • Linux 内存泄漏

    1.1 什么是内存泄漏?
    指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
    1.2 以发生的方式来分类,内存泄漏可以分为4类:

      1). 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

      2). 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

      3). 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

      4). 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
    1.3 Linux查询内存占用情况
      top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
      可以直接使用top命令后,查看%MEM的内容。可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:
      $ top -u oracle
    内容解释:

      PID:进程的ID
      USER:进程所有者
      PR:进程的优先级别,越小越优先被执行
      NInice:值
      VIRT:进程占用的虚拟内存
      RES:进程占用的物理内存
      SHR:进程使用的共享内存
      S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
      %CPU:进程占用CPU的使用率
      %MEM:进程使用的物理内存和总内存的百分比
      TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
      COMMAND:进程启动命令名称

    $ pmap -d PID
    可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过ps查看)如下所示:
      $ pmap -d 5647

    $ free -m
               total    used       free     shared    buffers     cached

    Mem:             1002     769        232      0        62       421

    -/+ buffers/cache:        286         715

    Swap:           1153     0         1153
    第一部分Mem行:total 内存总数: 1002
    Mused 已经使用的内存数: 769
    Mfree 空闲的内存数: 232
    Mshared 当前已经废弃不用,总是0
    buffers Buffer 缓存内存数: 62
    Mcached Page 缓存内存数:421M
    关系:total(1002M) = used(769M) + free(232M)

    第二部分(-/+ buffers/cache):
    (-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached)
    (+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
    可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

    $ cat /proc/meminfo

    1.4 Cache Memory(缓存内存)

    当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。

    其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。

    如何释放Cache Memory(缓存内存)?

    用下面的命令可以释放Cache Memory:

    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

    注意,释放前最好sync一下,防止丢失数据。

    总结:个人经验认为没必要手动释放,这种内存管理方式也是比win优胜的地方之一!因为Linux的内核内存管理机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以提高文件以及磁盘的读写速度。

  • 相关阅读:
    Access restriction: The constructor SunJCE() is not accessible due to restriction on required librar
    我选择,我奋斗
    C/C++语言写程序时的“段错误”总结
    VC中临时窗口与持久窗口的对比
    一个WinSocket编程实例
    error PRJ0003 : 生成“cmd.exe”时出错
    编辑利器VIM
    LED数码管的学习
    这个世界诱惑太多
    计算机英语名词简释
  • 原文地址:https://www.cnblogs.com/coffeebar/p/4495321.html
Copyright © 2011-2022 走看看