内存相关知识
- 计算机中与CPU进行数据交换的桥梁。内存的速度,比CPU的速度要慢很多。比磁盘速度要快很多。
- 内存中存放数据,一旦断电就会消失。
- linux系统的 /proc路径下的文件,都是内存文件。
- 内存大小,一般 是GB为单位。 现在都操作系统是 64位,可以支持 几个T的内存
- 服务器的内存: 常见 8g 16g 32g 64g
- 内存: 内存地址 存储单元 两部分组成
- 内存单元大小,不是固定。(一般8位)
存储单元
- 简单数据类型可以指定长度
- 有些数据类型不明确长度,不明确的长度存储单元,就有管理存储数据的数据结构。
列表的数据结构,索引位置,告诉你某个数据在列表的中的某个位置。列表,插入或删除一个数据, 在它的索引位置之后的所有数据,都得移动。 列表数据类型,在进行数据 插入、删除是比较慢的。
链表: 数据之间相互记录,构成一个数据链
链表插入数据、删除数据,速度比 列表要快,但是查询或获取数据的速度要比列表要慢
二叉树: 是一个链表
类、对象: 比较复杂的,数据要存放,不知道具体应该怎么存
堆:用于存放比较复杂的第数据
堆区: 连续一段地址空间,存放堆数据
栈stack区: 连续一段地址空间,来存放数据长度比较明确的数据
堆栈: 是两种数据结构。
栈stack区:LIFO ===Last In First Out 后进先出
- 压栈 弹出
队queue列: FIFO ====FirstInFirstOut 先进先出
- 顺序队列、 循环队列堆
内存: 有堆区和栈区。 每一个程序启动时候会申请一段内存空间,在自己申请的内存空间中,划 分出堆区和栈区
虚拟内存,是记录程序的内存中数据的区域的。
图解虚拟内存、物理内存、swap 分区的工作与管理
CPU对程序计算某个功能时候,就问虚拟内存,要xxx类型的数据应该到内存的哪个地方去获取。 虚拟内存就会返回结果给 CPU。CPU拿到这个地址之后就直接去内存条中,地址区间去取数据。
cpu从内存中,读数据,是以-页page-为单位。
php、python、go语言项目,没有强制现在项目的内存空间大小,所以一般不会有内存溢出问题,但 是并不是说,就没有内存问题。
内存溢出,只是内存问题中的一种。
内存泄露: 程序在运行过程中,某次请求申请了一段内存空间(从程序自己的内存空间中申请了一 段)使用,使用完成之后不释放,导致可用内存越来越少。
- 可用的内存漏掉了。
内存溢出:经过一段时间的内存泄露之后,某次申请内存空间时,申请的空间大小,大于剩余可用空间,此时就内存溢出。
- 性能角度来讲,不建议代码中使用递归。
怎么知识内存溢出了?
- 1、观察程序的内存使用情况,完全几乎全部使用,肯定有内存溢出。
- 2、内存溢出,不一定会报出错误。
- 1、报错误: 日志中、直接发送给请求当作请求的响应
堆区: 新生代new、老年代Tenured、永久代Perm
- new : Ø昙花一现,朝生夕死的对象 代码方法内部变量
- eden区
- from区
- to区
- Tenured: Ø大对象 or 多次被GC后还在的对象(顽固份子)
项目中新申请的资源都放在 new中, 使用之后判断策略,多次判断这个资源是否还用,如果还可以用,把这个资源 移动到Tenured。
YGC: 主要回收新生代的空间、回收频率高,每次收时间短
FGC: 主要回收老年代的空间、回收频率低,每次回收用到时间长
- 还包括:回收 新生代、元空间
总的GC回收时间,期望越短越好 = YGC时间 + FGC的时间
3650+1440 = 5090
52*40 + 2*5*60 = 2080+600 = 2680
GC是资源回收,一定要有的,期望回收总时间少的。 ygc和fgc的频率是关键.
这个就要 反复测试出来,而不是计算。
- 调整 新生代 与 老年代的 大小
- 1、调整整个内存大小
- 2、调整新生代老年代的配比
YGC 回收的时间 一般是小几十毫秒到小几百毫秒以内
FGC回收的时间,大几百毫秒甚至上秒
验证: 内存溢出、gc
tomcat是部署java的一个中间件,springboot开发,自身就带有tomcat,springboot的项目,可以放到 tomcat中启动,也可以直接使用 java -jar xxx.jar
tomcat的bin文件夹中 catalina.sh 配置,配置内存信息
tomcat的conf有 server.xml 配置 配置服务 协议、端口
tomcat的logs文件夹日志文件
tomcat的webapps文件夹 放项目
- 项目打war包,自动可以解压
JAVA_OPTS=”-server -Xms512m -Xmx512m -Xmn128m -Xss256k -XX:PermSize=128m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename”
打印gc的配置,一般 不在生成环境中添加。
server.xml中线程池的
配置 acceptCount: 能接收的队列长度,队列满了,再有连接就会被拒绝