#创作挑战赛#
内存知识内存(memory) 主要用来存储系统和应用程序的指令,数据,缓存等。是cpu与其他设备沟通的枢纽,配合cpu工作,协调cpu处理速度
处理流程:
- 硬盘数据、外设数据、网络传输数据先进入内存处理后==》再进入cpu进行计算
内存的组成部分: 内存地址 存储单元
内存地址与存储单元的关系,类似于门牌号与房子,通过门牌号找到你家庭地址(内存地址),房子能装人和各种家居物品(存储单元)
存储单元中,就是用于真正存储内容,而不同的数据类型,存储单元大小不一样,int,float,string。列表,数组,链表 map 等不同的数据结构算法复杂度也是不一样的
需要注意的点
- 当我们打开一个软件系统会分配虚拟内存,物理内存。cpu会读取虚拟内存,虚拟内存里面会记录该程序所需要的物理内存信息(如代码信息,数据地址等)
- 当应用程序启动时,系统不会把所有的数据加到内存里
- 当应用程序启动时,会产生一个内存配置信息,通知系统并申请内存空间。如:在一个8g的内存中,部署了一个项目,配置内存为1个g,那么就会从内存空间里面申请1个g的空间使用,不会使用超过1g的空间,会在分配的内存中不断的回收使用。
内存中的数据结构
数组 : 因为有下标,查询快、增删慢
链表 :由一群结点组成顺序的数据结构。在最简单的情况下,每个结点由一个数据和一个指向下一个结点的指针(内存地址)而组成
二叉树 :一种特殊的链表,在插入数据时,数据进行比较,比数据小的在左边,比数据大的插入在右边;在查找数据时,比数据大的,我就去右边找,比数据小,我就去左边找,这个时候,IO就比链表要少很多
内存中的数据类型
栈:存储的数据比较小,比如存储JAVA中的某个变量。先进后出 LIFO ,压入 push ,弹出 pop 弹出我们最后一个数据
队列:先进先出(FIFO) First In First Out ,如MQ 队列
堆heap: 存储的数据比较复杂,通常是一个可以被看做一棵树的数组对象,可以用于存储代码中的 对象
内存的使用一个程序运行时,需要分配一块内存空间,这个内存空间中至少会包含一块堆区和一块栈区域
栈:存放代码中的局部变量,因变量有一定的作用域(如 java中的作用域 public private static final),离开作用域,空间就会被释放,所以,它的更新速度快,生命周期短
堆:存储数组和对象,new出来的对象都是存放在堆中,如果数据消失后,实体类也不会马上释放
jvm堆的体系构造 :新生代,老年代,永久代(jdk1.8以后称其为 元空间)
- 新生代:是类的诞生、成长、消亡的区域,朝生暮死的对象
- 老年代:经历多次被GC 依然存活的对象会进入老年代;连接池的对象一般会进入老年代,常驻内存的内存缓存一般也会进入老年代;
- 永久代:永久存储一个常驻内存区域, 存放类信息,常量,静态变量
jvm虚拟机:
程序计数器: 记录持续执行字节码的行号指示器
虚拟机栈:记录Java 方法执行的内存模型 每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。常见错误:
- StackOverflowError: 线程请求的栈深度大于虚拟机运行的最大深度 通俗理解为: 内存的资源不及时释放,一直占用,导致可用的内存资源越来越少。(内存不够用)
- OutOfMemorvError: 栈在动态扩展时,无法申请到足够的内存空间 通俗理解为:内存泄漏持续到一定时间,可用的空间就会越来越少,下一次程序需要申请比较大的空间时,发现,申请空间不足,已经超过最大可用空间,内存溢出会日志中展示,也可以使用监控工具分析如:jmap,arthas (内存不释放)
方法区:共享内存区域,用于存储已被虚拟机加载的数据
GC
YGC:Young Generation Minor GC 针对新生代的Eden区进行资源回收
FGC:Major GC 针对的区域同时包含新生代和年老代
在系统进行资源回收的时候,都会出现卡顿,YGC的卡断时间会比较短,FGC卡顿的时间会比较长
性能测试中,就对于gc是要关注的点有以下:
- 如果 新生代资源分配过多,那么,老年代这变就要少, 老年代的空间,我可能就要经常的进行FGC, FGC频率高了,那么累计的gc的时间就长,导致性能比较差
- 如果 新生代分配的资源少了,那么老年代就分配多些,我的新生代的资源回收频率YGC就要高, 那么累计的ygc的时间也可能长,导致的性能也可能较差
gc回收机制
- 引用 计数法,可达性算法 来判断程序是否已使用完毕。
- 垃圾回收算法 (新生代-复制算法 清理Eden,将存活的复制到survi vor1),老年代-标记算法(先标记,在进行清理 类似于win系统删除文件后会进入回收站,磁盘空间不会变大,只有清理掉回收站才会增加空间)
gc回收的时间
- 分配的空间不足时
- 定时回收
内存资源回收
资源回收只存在于 堆 中,本地方法栈,程序计数器,虚拟机栈 这些不需要进行资源回收
JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (GarbageCollector,GC) 完成的,它的核心思想是: 对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。
jvm虚拟机参数
-XX:SurivivorRatio=8 eden空间、from空间、to空间的比例 8:1:1
XX:MaxMetaspaceSize 是jdk1.8 以后的名称,1,7不能使用
查看内存的命令:
free-h,top 按改变单位
,