网站首页 > 文章精选 正文
内存知识
内存(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 按改变单位
猜你喜欢
- 2025-05-05 一个后勾腿动作,有效疏通血管,改善下肢发麻,促进全身燃脂
- 2025-05-05 大型调相机起动及并网研究(什么是调相机,与发电机区别)
- 2025-05-05 你们都是托:动态对比度其实是骗你的
- 2025-05-05 最容易被忽视的身体素质——柔韧性
- 2025-05-05 减压阀能减静压吗?(减压阀能减静压吗视频)
- 2025-05-05 第6讲-结构设计作用(结构设计的作用)
- 2025-05-05 不谈源码,聊聊位运算的实际应用(位运算的含义和使用)
- 2025-05-05 元王CAE仿真系列之疲劳分析篇(疲劳仿真软件)
- 2025-05-05 静态混合器在化工中的作用(静态混合器结构)
- 2025-05-05 测绘人员必读:RTK常用功能讲解(rtk测量操作步骤)
- 05-05MyBatis的三种分页方式,你学废了吗?
- 05-05如何写一个简单的分页(最简单的分页)
- 05-05详解如何使用Spring Data JPA进行数据的分页与排序
- 05-05手速太快引发分页翻车?前端竞态陷阱揭秘
- 05-05前端分页机制的具体实现(分页前端需要做什么)
- 05-05一个后勾腿动作,有效疏通血管,改善下肢发麻,促进全身燃脂
- 05-05大型调相机起动及并网研究(什么是调相机,与发电机区别)
- 05-05你们都是托:动态对比度其实是骗你的
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)