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,例如静态的集合中的数据都不会被回收

free top 内存泄漏 内存溢出相关推荐

  1. JVM - 垃圾回收(垃圾标记阶段算法,内存泄漏与溢出)(2)

    2.垃圾回收相关算法: 2.1.垃圾标记阶段算法: 2.1.1 标记阶段的目的 垃圾标记阶段:主要是为了判断对象是否存活 1.在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首 ...

  2. 内存泄漏和溢出的区别

    转自:内存泄漏和溢出的区别 溢出是满了溢出来,泄漏是使用过的内存未及时释放使得内存变小. 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of me ...

  3. 内存泄漏——内存溢出区别

    内存溢出和内存泄漏的区别.产生原因以及解决方案 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...

  4. 内存泄漏 内存溢出 踩内存 malloc底层实现原理

    本文主要对内存泄漏.内存溢出.内存踩踏[踩内存]以及malloc的底层实现原理进行了总结.话不多说,直接往下看: 参考文章: 内存泄漏与内存溢出: https://blog.csdn.net/ruir ...

  5. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)

    45.JVM调优策略 45.1.常见问题 45.1.1.内存泄漏 45.1.1.1.年老代堆空间被占满 45.1.1.2.持久代被占满 45.1.1.3.堆栈溢出 45.1.1.4.线程堆栈满 45. ...

  6. JVM学习笔记之-垃圾回收相关概念 System.gc()的理解 内存溢出与内存泄漏 STW 垃圾回收的并行与并发 安全点与安全区域 再谈引用:强引用 软引用 弱引用 虚引用 终结器引用

    System.gc()的理解 在默认情况下,通过System.gc()或者Runtime. getRuntime ( ).gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...

  7. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出

    参考:内存泄漏.内存溢出.段错误.堆溢出.栈溢出 作者:焦木白 发布时间:2019-10-22 网址:https://blog.csdn.net/jiaomubai/article/details/1 ...

  8. spark如何防止内存溢出_什么叫内存溢出?内存泄漏的定义又是什么?使用中如何避免?...

    一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,于是就发生了内存溢出. 内存泄漏:内存泄漏指程序运行过程中分配内存给临时变量,用 ...

  9. 移动端测试=== 两个概念 内存泄漏 和 内存溢出 【转】

    关于内存在一块其实我并不是很想拿出来说,一般情况下内存这一块都是可优化的,可以通过硬件资源或者调整一些系统或者应用系统的参数配置来进行优化. 很多同僚问到了"内存泄漏"和" ...

  10. JavaScript 内存溢出,内存泄漏

    内存 内存(Memory)是计算机的重要部件之一,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据.它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存 ...

最新文章

  1. OpenCV 图像采样 插值 几何变换
  2. 第十五届全国大学生智能汽车竞赛室外光电组全国总决赛方案
  3. AVAudioPlayer音频播放器-备用
  4. android设置程序开机自启动
  5. CentOS服务器利用.htaccess批量封IP方法介绍
  6. Windows编程设备描述表的概念和在客户区绘制、在窗口标题栏绘制、在桌面绘制图解
  7. openfire在windows环境和linux环境下的配置
  8. java 配置参数_给你的JAVA程序配置参数(Properties的使用)
  9. 项目中的软件需求说明书的访谈部分
  10. 数据倾斜是什么以及造成的原因?
  11. 业界 | 成为CTO之前,我希望有人告诉我这些
  12. 解只含加减的一元一次方程
  13. 系统集成(IBMS)软件的功能
  14. 2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(上)...
  15. java表白 520
  16. Java——LocalDateTime
  17. Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色
  18. (C语言)汉诺塔与受限汉诺塔
  19. Python: 蛇形填空(每日一题)
  20. 雅虎市值_雅虎如何一次又一次错失千亿美元

热门文章

  1. matlab中rand函数
  2. C语言异或运算逆运算,异或的逆运算
  3. 免费ftp软件下载,5款免费ftp软件下载工具
  4. c语言gets,getc,区分C语言中fgetc、getc、getchar、fgets、gets
  5. getc()、gets()、getchar()、scanf()的区别
  6. China Mobile”、“China Unicom”,请修改为中国移动、中国联通
  7. bootstrap collapse 卡顿
  8. 千呼万唤始出来——DataV私有部署功能
  9. 一个高效的积分兑换商城系统怎么搭建
  10. 基于SSH会员积分消费管理系统