free top 内存泄漏 内存溢出

 1. free命令

free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。

直接输入free命令,显示如下

free命令默认是显示单位kb,可以采用free -m和free -g命令查看,分别表示MB和GB

另外,free -h会自动选择以适合理解的容量单位显示

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

 输出简介:

Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

buff/cache

表示的是缓存占用的内存大小

free与available

我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。对操作系统来讲,buffers/cached 都是属于被使用,所以它认为free通常较小。free 是真正尚未被使用的物理内存数量。

available是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available ≈ free + buffer/cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

Swap与Mem

当物理内存快被耗尽时,系统并没有崩溃,而是拿swap做临时内存,当两者都耗尽,系统OutofMemory。物理内存到达峰值,系统中可能一些不常用的进程内存占用被踢到swap区,当Mem区的资源进行释放时,被挪到swap的内存并不会全部回来的,随着系统或者程序的唤醒才会慢慢回到mem区,Swap是内存不够时磁盘虚拟出来的内存,磁盘主要是I/O级别的操作并不是系统内核级别的操作,处理速度跟Mem区不是一个等级,可以通过配置指定是否使用swap

总结

当前系统使用到的内存 ≈ used + buff/cache ,used中包含了shared
总内存 total ≈ used + free + buff/cache
程序可使用内存 available <= free + buffer/cache,因为部分系统内存是不可以回收的
看内存够不够用重点是要看buffers/cache和free为主


2. top命令

top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等;

直接输入top命令

下面表示整体信息

列表的含义

进入top的实时界面后,默认按照CPU的使用率排序,通过“shift+m”按键将进程按照内存使用情况排序,可以查看哪些进程是当前系统中的内存开销“大户”。

top命令中,按下 f 键,进入选择排序列的界面,这里可以选择要显示的信息列,要按照哪些信息列进行排序等

参照红框的说明来选择是否显示那些列就行,标*的就是显示

 


3. 内存泄漏

3.1 什么是内存泄漏?

内存泄漏是指你向系统申请分配内存进行使用(new),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。一次内存泄漏的危害可以忽略不计,但是内存泄漏堆积则后果很严重,无论多少内存,迟早会被占完

3.2 内存泄漏的危害

频繁GC:系统分配给每个应用的内存资源都是有限的,内存泄漏导致其他组件可用的内存变少后,一方面会使得GC的频率加剧,再发生GC的时候,所有进程都必须等待,GC的频率越高,用户越容易感应到卡顿。另一方面内存变少,可能使得系统额外分配给该对象一些内存,而影响整个系统的运行情况。

导致程序运行崩溃:一旦内存不足以为某些对象分配所需要的空间,将会导致程序崩溃,造成体验差。

3.3 如何判断服务器是否可能存在内存泄露?

内存泄漏问题难以发现及定位,个人无相关经验,以下是查阅的部分资料,未实测

案例1:

已分配出去的,并且可再被重用的内存: available - free = 926(总)- 770(free)=156G

buff + cache = 161G

161G跟156G相差不大,  (1 - 156 / 161) * 100% = 3%),说明只有3%的内存没有被用到, 内存泄漏的可能非常低。

案例2:

已分配出去的,并且可再被重用的内存: available - free = 17(总)-0.5(free)=16.5G

Buff + cache = 18G

16.5G跟18G相差不大, (( 1 - 16.5 / 18) * 100% = 8%),说明只有8%的内存没有被用到,内存泄漏的可能非常低。

3.4 如何定位及解决内存泄漏问题?

相关内容,有待进一步了解。

查看哪些应用程序占的内存比较多

ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less

执行以上命令可查看各个程序进程内存使用的内存情况,如下图所示,第一列为进程占用的内存百分比,可以看到哪些应用程序占的内存比较多,用于排查问题:

什么是内存泄漏?该如何检测?又该如何解决? - 知乎


4. Java的垃圾回收机制GC

原文地址:面试题之内存泄漏相关_Zy_JiBai的博客-CSDN博客

     1、CG的作用:释放掉不可到达的对象的内存。

     2、不可达是个什么概念?

    首先我们要搞清楚Java的内存分区了,其中有两个非常重要的就是栈内存和什么是内存泄漏?该如何检测?又该如何解决? - 知乎

  • 堆内存存放创建的对象的内存
  • 栈内存存放指向对象的引用和普通数据类型

例如创建一个变量:String str1 = new String("test");

由此可以说明Java操作对象全部都是匿名操作。在创建之初,每一个堆内存中对象的内存,在栈中都会有一个值(引用)指向他,而有一部分值在我们使用完毕后会将引用置空,这就会有一些堆中的内存没有引用指向,又因为Java中对对象是匿名操作,所以对这些没有栈中内存存储的引用指向的对象称之为不可触及的对象。

工作原理

简单介绍一下GC的工作原理:

首先GC会扫描栈内存中的引用,然后会遍历堆内存中的引用,这样就会查找出内存中不可触及的对象,然后将其释放掉。

说到这里大家应该发现一个问题,GC回收的只是堆中的内存,而没有栈中的内存,这是因为栈中已分配的内存会随着哟个方法结束的时候释放掉,所以不用担心栈内存中会存在内存泄漏的问题。

PS:定义变量的时候,慎用static,例如静态的集合中的数据都不会被回收

 

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值