#创作挑战赛#

内存知识

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

处理流程:

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

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

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

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

需要注意的点

测试内存性能用什么(性能测试必懂的内存知识点)(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以后称其为 元空间)


jvm虚拟机:

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

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

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

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


GC

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

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

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

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

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

gc回收机制

gc回收的时间


内存资源回收

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

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


jvm虚拟机参数

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

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

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

查看内存的命令:

free-h,top 按改变单位

,