网站制作 深圳,潍坊专升本考试地点,网站域名的安全性,成立咨询公司需要什么条件内存相关知识
计算机中与CPU进行数据交换的桥梁。内存的速度#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件#xff0c;都是内存文件。内存大小#xff0c;一般 是GB为单位。 现在都操作…内存相关知识
计算机中与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的时间
36501440 5090
52*40 2*5*60 2080600 2680
GC是资源回收一定要有的期望回收总时间少的。 ygc和fgc的频率是关键.
这个就要反复测试出来而不是计算出来
调整 新生代 与 老年代的 大小 1、调整整个内存大小调整YGC的回收频率2、调整新生代老年代的配比调整FGC的回收频率
YGC 回收的时间 一般是小几十毫秒到小几百毫秒以内
FGC回收的时间大几百毫秒甚至上秒
验证 内存溢出、gc
配置参数 tomcat是部署java的一个中间件springboot开发自身就带有tomcatspringboot的项目可以放到 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:PermSize128m -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:filename” 打印gc的配置一般不在生成环境中添加。 server.xml中线程池的保持的连接数企业配置的数值都比较小
配置 acceptCount 能接收的队列长度队列满了再有连接就会被拒绝修改线程池 tomcat
配置文件 bin文件夹下 catalina.sh 配置堆栈信息 conf 文件夹下 server.xml文件 服务、线程池信息
实战
tomcat java项目 可以配置 catalina.sh 堆栈信息也可以不配
有内存溢出的问题堆栈信息配置配大一些也只是 内存溢出的时间 延后一点。
环境要求 jre\jdk8
上传 tomcat的包、JvmPertest.war包服务器上
解压 tomcat JvmPertest.war包丢到 tomcat的webapps文件夹下
配置 catalina.sh文件 启动tomcat
测试
使用jmeter调用 http://ip:8080/JvmPertest/pertest1 去logs查看日志 调用jmeter脚本一段时间持续运行
日志如下在日志信息中不一定会出现错误信息
发现响应出错了錯誤信息中 nested exception is java.lang.OutOfMemoryError: Java heap space
定位
已经出现了内存溢出问题 下一次测试的时候要重启项目注意内存溢出会可能会导致无法停止项目需要杀掉进程重启项目
安装arthas
curl -O https://arthas.aliyun.com/math-game.jar
启动arthas
java -jar math-game.jar
把arthas 连接到 java进程上 使用jmeter进行性能测试 测试时发现有内存溢出的问题的时候我们在arthas中执行 heapdump 就会在很短时间内存 把内存新的信息dump下来生成一个hprof文件放在tomcat的temp文件夹中。 把hprof的文件下载下来然后使用MAT(MemoryAnalyzer)工具打开。 做java开发编辑器是可以去安装 这个 插件 1、我们已经获取到 内存溢出时的堆栈信息 hprof文件 这个文件可以直接给开发人员让他们去 定位具体问题 -----对于没有java基础
2、你想分析定位具体问题使用mat(MemoryAnalyzer)工具打开 hprof文件进一步分析。 假设性能测试服务是一个集群对这个集群大服务进行性能测试时发现了内存溢出集群是由多个服务构成的怎么来获取堆栈信息
1、首先判断出现内存溢出的服务是哪个 1、 集群中所有的服务的日志看一遍 内存溢出日志可能有错误信息。 有内存溢出的日志在服务上肯定这个服务就内存溢出了此时就获取这个服务所在的机器的堆 栈信息就可以了。2、看java进程的内存使用情况。 内存几乎都用完了 --------就是这个了
仅仅只是加大服务的内存是不一定能解决 内存溢出问题。 为什么内存溢出是申请了内存没有释放导致内存泄露然后时间久了就内存溢出。
内存回收也是可能导致内存溢出的一种原因。
内存的释放就与GC有关系。 调整内存的参数配比 是不是就会改变GC频率。 ----把新生代 调大老年代调小。前提内存总大小没有变
确认是否有效
就会打印 gc日志gc.log通过分析gc日志来判断是否有效。
有了gc日志可以使用 gceasy.io网站 可以把gc的日志文件给开发人员让他们去分析
也可以 把gc分析报告 https://gceasy.io/my-gc-report.jsp? pc2hhcmVkLzIwMjMvMDMvMjQvZ2MubG9nLS0xMy0zMi0zNwchannelWEB 给开发人员 监控
也可以来监控 内存使用情况 grafana Prometheus jvm_exporter 操作jvm_exporter和tomcat.yml上传到 被监控的服务上 https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent 中选择你要 下载到文件
tomcat.yml文件 ----里面的东西不要动
修改 tomcat的catalina.sh文件 JAVA_OPTS-javaagent:./jmx_prometheus_javaagent0.14.0.jar3088:./tomcat.yml
路径javaagent和包名jmx_prometheus_javaagent0.14.0.jar要写正确端口按需更改
hosts文件中没有主机名的需要要改一下。 ------如果不改网络延迟可能很长导致监控平台这边不显示数据。 引入模板 8563 注意的 job的填写要是 Prometheus.yml中写的 job_name 模板3517没数据需要写入对应的ip和端口号