测试内存性能用什么(性能测试必懂的内存知识点)

#创作挑战赛#

内存知识

内存(memory) 主要用来存储系统和应用程序的指令,数据,缓存等。是cpu与其他设备沟通的枢纽,配合cpu工作,协调cpu处理速度

处理流程:

  • 硬盘数据、外设数据、网络传输数据先进入内存处理后==》再进入cpu进行计算

内存的组成部分: 内存地址 存储单元

内存地址与存储单元的关系,类似于门牌号与房子,通过门牌号找到你家庭地址(内存地址),房子能装人和各种家居物品(存储单元)

存储单元中,就是用于真正存储内容,而不同的数据类型,存储单元大小不一样,int,float,string。列表,数组,链表 map 等不同的数据结构算法复杂度也是不一样的

测试内存性能用什么(性能测试必懂的内存知识点)(1)

需要注意的点

  • 当我们打开一个软件系统会分配虚拟内存,物理内存。cpu会读取虚拟内存,虚拟内存里面会记录该程序所需要的物理内存信息(如代码信息,数据地址等)
  • 当应用程序启动时,系统不会把所有的数据加到内存里
  • 当应用程序启动时,会产生一个内存配置信息,通知系统并申请内存空间。如:在一个8g的内存中,部署了一个项目,配置内存为1个g,那么就会从内存空间里面申请1个g的空间使用,不会使用超过1g的空间,会在分配的内存中不断的回收使用。

测试内存性能用什么(性能测试必懂的内存知识点)(2)

内存中的数据结构

数组 : 因为有下标,查询快、增删慢

链表 :由一群结点组成顺序的数据结构。在最简单的情况下,每个结点由一个数据和一个指向下一个结点的指针(内存地址)而组成

测试内存性能用什么(性能测试必懂的内存知识点)(3)

二叉树 :一种特殊的链表,在插入数据时,数据进行比较,比数据小的在左边,比数据大的插入在右边;在查找数据时,比数据大的,我就去右边找,比数据小,我就去左边找,这个时候,IO就比链表要少很多

测试内存性能用什么(性能测试必懂的内存知识点)(4)

内存中的数据类型

栈:存储的数据比较小,比如存储JAVA中的某个变量。先进后出 LIFO ,压入 push ,弹出 pop 弹出我们最后一个数据

测试内存性能用什么(性能测试必懂的内存知识点)(5)

队列:先进先出(FIFO) First In First Out ,如MQ 队列

测试内存性能用什么(性能测试必懂的内存知识点)(6)

堆heap: 存储的数据比较复杂,通常是一个可以被看做一棵树的数组对象,可以用于存储代码中的 对象

内存的使用

一个程序运行时,需要分配一块内存空间,这个内存空间中至少会包含一块堆区和一块栈区域

测试内存性能用什么(性能测试必懂的内存知识点)(7)

栈:存放代码中的局部变量,因变量有一定的作用域(如 java中的作用域 public private static final),离开作用域,空间就会被释放,所以,它的更新速度快,生命周期短


堆:存储数组和对象,new出来的对象都是存放在堆中,如果数据消失后,实体类也不会马上释放

jvm堆的体系构造 :新生代,老年代,永久代(jdk1.8以后称其为 元空间)

  • 新生代:是类的诞生、成长、消亡的区域,朝生暮死的对象
  • 老年代:经历多次被GC 依然存活的对象会进入老年代;连接池的对象一般会进入老年代,常驻内存的内存缓存一般也会进入老年代;
  • 永久代:永久存储一个常驻内存区域, 存放类信息,常量,静态变量

jvm虚拟机:

测试内存性能用什么(性能测试必懂的内存知识点)(8)

程序计数器: 记录持续执行字节码的行号指示器

虚拟机栈:记录Java 方法执行的内存模型 每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。常见错误:

  • StackOverflowError: 线程请求的栈深度大于虚拟机运行的最大深度 通俗理解为: 内存的资源不及时释放,一直占用,导致可用的内存资源越来越少。(内存不够用)
  • OutOfMemorvError: 栈在动态扩展时,无法申请到足够的内存空间 通俗理解为:内存泄漏持续到一定时间,可用的空间就会越来越少,下一次程序需要申请比较大的空间时,发现,申请空间不足,已经超过最大可用空间,内存溢出会日志中展示,也可以使用监控工具分析如:jmap,arthas (内存不释放)

方法区:共享内存区域,用于存储已被虚拟机加载的数据


GC

YGC:Young Generation Minor GC 针对新生代的Eden区进行资源回收

FGC:Major GC 针对的区域同时包含新生代年老代

在系统进行资源回收的时候,都会出现卡顿,YGC的卡断时间会比较短,FGC卡顿的时间会比较长

测试内存性能用什么(性能测试必懂的内存知识点)(9)

性能测试中,就对于gc是要关注的点有以下:

  • 如果 新生代资源分配过多,那么,老年代这变就要少, 老年代的空间,我可能就要经常的进行FGC, FGC频率高了,那么累计的gc的时间就长,导致性能比较差
  • 如果 新生代分配的资源少了,那么老年代就分配多些,我的新生代的资源回收频率YGC就要高, 那么累计的ygc的时间也可能长,导致的性能也可能较差

gc回收机制

  • 引用 计数法,可达性算法 来判断程序是否已使用完毕。
  • 垃圾回收算法 (新生代-复制算法 清理Eden,将存活的复制到survi vor1),老年代-标记算法(先标记,在进行清理 类似于win系统删除文件后会进入回收站,磁盘空间不会变大,只有清理掉回收站才会增加空间)

gc回收的时间

  • 分配的空间不足时
  • 定时回收

内存资源回收

资源回收只存在于 堆 中,本地方法栈,程序计数器,虚拟机栈 这些不需要进行资源回收

JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (GarbageCollector,GC) 完成的,它的核心思想是: 对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。


jvm虚拟机参数

测试内存性能用什么(性能测试必懂的内存知识点)(10)

-XX:SurivivorRatio=8 eden空间、from空间、to空间的比例 8:1:1

XX:MaxMetaspaceSize 是jdk1.8 以后的名称,1,7不能使用

查看内存的命令:

free-h,top 按改变单位

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页