性能分析之Memory、free+jstat+内存模型

性能分析之Memory、free+jstat+内存模型

free

free #以kb为单位查看内存
free -m # 以M为单位查看内存

在这里插入图片描述
我们先来看一下我们现在的free命令就是上面这样的

total 系统总的可用物理内存大小

used 已被使用的物理内存大小,是只有被程序占用的内存,而不是所有的

free 还有多少物理内存可用,是真正尚未被使用的物理内存数量。

shared 被共享使用的物理内存大小

buff/cache 被 buffer 和 cache 使用的物理内存大小

available 还可以被 应用程序 使用的物理内存大小,是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法),为什么是这样呢,Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。

所以我们也可以得出这么一个公式:

used = total - free - buffers - cache

我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

但是网上的教程一般都是这样的
在这里插入图片描述

第二部分(-/+ buffers/cache):

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

现在只不过是把(-buffers/cache) 去掉了,(+buffers/cache)换成了available。

经过查询,发现是这个命令改版了

在这里插入图片描述
在这里插入图片描述

内存模型

传送门

抄来的图和文案

JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存的关系的基础。下图给出了硬件、系统、进程三个层面的内存之间的概要关系。

在这里插入图片描述
从硬件上看,Linux系统的内存空间由两个部分构成:物理内存和SWAP(位于磁盘)。物理内存是Linux活动时使用的主要内存区域;当物理内存不够使用时,Linux会把一部分暂时不用的内存数据放到磁盘上的SWAP中去,以便腾出更多的可用内存空间;而当需要使用位于SWAP的数据时,必须 先将其换回到内存中。

从Linux系统上看,除了引导系统的BIN区,整个内存空间主要被分成两个部分:内核内存(Kernel space)、用户内存(User space)。

内核内存是Linux自身使用的内存空间,主要提供给程序调度、内存分配、连接硬件资源等程序逻辑使用。

用户内存是提供给各个进程主要空间,Linux给各个进程提供相同的虚拟内存空间;这使得进程之间相互独立,互不干扰。实现的方法是采用虚拟内存技术:给每一个进程一定虚拟内存空间,而只有当虚拟内存实 际被使用时,才分配物理内存。

从进程的角度来看,进程能直接访问的用户内存(虚拟内存空间)被划分为5个部分:代码区、数据区、堆区、栈区、未使用区。

代码区中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。

数据区中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。

堆是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。

栈区用来存放函数的传入参数、临时变量,以及返回地址等数据。

未使用区是分配新内 存空间的预备区域。

进程与JVM内存空间

JVM本质就是一个进程,因此其内存空间(也称之为运行时数据区,注意与JMM的区别)也有进程的一般特点。

但是,JVM又不是一个普通的进程,其在内存空间上有许多崭新的特点,主要原因有两 个:

1.JVM将许多本来属于操作系统管理范畴的东西,移植到了JVM内部,目的在于减少系统调用的次数;

  1. Java NIO,目的在于减少用于读写IO的系统调用的开销。JVM进程与普通进程内存模型比较如下图:

在这里插入图片描述

JVM简单模型

原来根据JVM规范,JVM 内存共分为虚拟机栈,堆,方法区,程序计数器,本地方法栈五个部分。

在这里插入图片描述
但是现在java1.7之后改成了这个亚子
在这里插入图片描述

我们重点看堆的样子,因为堆是JVM内存占用最大,管理最复杂的一个区域。唯一的途径就是存放对象实例:所有的对象实例以及数组都在堆上进行分配。jdk1.7以后,字符串常量从永久代中剥离出来,存放在堆中。
在这里插入图片描述

GC

(1)YoungGC 就是在新生代的Eden区域满了之后,就会触发,采用复利算法来回收新生代的垃圾

(2)发生YoungGC之前往往会先检查一下老年代的空间,如果说明本次YoungGC后可能升入老年代对象的大小,可能超过了老年代当前可用内存空间,此时必须先触发一次OldGC给老年代腾出更多的空间,然后再执行YoungGC

所以,一般OldGC 很可能就是在 YoungGC 之前触发,所以自然OldGC一般都会跟一次YoungGC连带关联在一起了。 那他触发的实际上就是FullGC,因为我们知道 FullGC会包含YoungGC、OldGC和永久代的GC 也就是说触发FullGC的时候,可能就会去回收年轻代、老年代和永久代三个区域的垃圾对象。

YongGc也可以称为MinorGC

YoungGC 就是在新生代的Eden区域满了之后,就会触发

OldGc

很简单,就是老年代的清理

FullGC

YongGc+OldGc

jstat

free是监控的整个机器的性能,但是如果我们只压测一个进程,我们还可以进入到单一进程中去看JVM的信息

jstat -gcutil 26527 2000#26527为进程号,2000为每隔2000毫秒也就是2秒打印一次

在这里插入图片描述
S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值