当前位置: 首页 > news >正文

性能分析--内存知识

内存相关知识

  • 计算机中与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、调整整个内存大小(调整YGC的回收频率)
    • 2、调整新生代老年代的配比(调整FGC的回收频率)

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: 能接收的队列长度,队列满了再有连接就会被拒绝(修改线程池)

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? p=c2hhcmVkLzIwMjMvMDMvMjQvZ2MubG9nLS0xMy0zMi0zNw==&channel=WEB 给开发人员

监控

也可以来监控  内存使用情况 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.jar=3088:./tomcat.yml"

(路径:javaagent和包名:jmx_prometheus_javaagent0.14.0.jar要写正确,端口按需更改)

hosts文件中没有主机名的,需要要改一下。  ------如果不改,网络延迟可能很长,导致监控平台这边不显示数据。

引入模板: 8563    注意的 job的填写,要是  Prometheus.yml中写的 job_name

模板3517,没数据需要写入对应的ip和端口号

相关文章:

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度,比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据,一旦断电就会消失。linux系统的 /proc路径下的文件,都是内存文件。内存大小,一般 是GB为单位。 现在都操作…...

目标检测标签分配策略,难样本挖掘策略

在目标检测任务中,样本的划分对于模型的性能具有至关重要的影响。其中,正样本指的是包含目标物体的图像或区域,而负样本则是不包含目标物体的图像或区域。然而,在负样本中,有一部分样本由于其与正样本在特征上的相似性…...

Java | Leetcode Java题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int best 10000000;// 枚举 afor (int i 0; i < n; i) {// 保证和上一次枚举的元素不相等if (i > 0 && nums…...

FIN和RST的区别,几种TCP连接出现RST的情况

一、RST跟FIN的区别&#xff1a; 正常关闭连接的时候发的包是FIN&#xff0c;但是如果是异常关闭连接&#xff0c;则发送RST包 两者的区别在于&#xff1a; 1.RST不必等缓冲区的包都发出去&#xff0c;直接就丢弃缓存区的包发送RST包。而FIN需要先处理完缓存区的包才能发送F…...

2024/4/1—力扣—删除字符使频率相同

代码实现&#xff1a; 思路&#xff1a; 步骤一&#xff1a;统计各字母出现频率 步骤二&#xff1a;频率从高到低排序&#xff0c;形成频率数组 步骤三&#xff1a;频率数组只有如下组合符合要求&#xff1a; 1, 0...0n 1, n...n (, 0)n...n, 1(, 0) bool equalFrequency(char…...

Spring源码解析-容器基本实现

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 一、简单介绍 二、简单视频倒放效果实现原理 三、简单视频倒放效果案例实现…...

蓝牙学习十(扫描)

一、简介 从之前的文章中我们知道&#xff0c;蓝牙GAP层定义了四种角色&#xff0c;广播者&#xff08;Broadcaster&#xff09;、观察者&#xff08;Observer&#xff09;、外围设备&#xff08;Peripheral&#xff09;、中央设备&#xff08;Central&#xff09;。 之前的学习…...

(26)4.7 字符函数和字符串函数

#include<stdio.h> #include<string.h> #include<assert.h> //int my_strcmp(const char* str1, const char* str2) //{ // assert(str1 && str2);//指针有效性&#xff0c;不能为空指针 // while (*str1 *str2) // { // if (*str1…...

交换机与队列的简介

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…...

1.docker

Docker 是一种容器化平台&#xff0c;可以在不同的操作系统中轻松运行和管理应用程序。它使用容器技术来打包应用程序及其所有依赖关系&#xff0c;使其可以在任何环境中运行。 Docker 的基本概念包括以下几个部分&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;…...

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…...

KingbsaeES数据库分区表的详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 分区表是一种将大型数据库表拆分为更小、更可管理的部分的技术。它通过将表数据分散存储到多个物理存储单元中&#xff0c;可以提高查询和数据维护的性能&#xff0c;并优化对大型数据集的处理。本篇文章以kingbase为…...

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索&#xff1a;为什么是B树&#xff1f; 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式&#xff1a;二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树&#xff1a;AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…...

XML HTTP传输 小结

what’s XML XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传输和存储数据&#xff0c;不用于表现和展示数据&#xff0c;HTML 则用来表现数据。 XML 是独立于软件和硬件的信息传输工具。 应该掌握的基础知识 HTMLJavaScript…...

相机标定——四个坐标系介绍

世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系&#xff0c;通常反映真实世界下物体的位置和方向。它是一个惯性坐标系&#xff0c;被用作整个场景或系统的参考框架。在很多情况下&#xff0c;世界坐标系被认为是固定不变的&#xff0c;即它…...

C++:MySQL数据库的增删改(三)

1、相关API 执行所有的sql语句都是mysql_query或者mysql_real_query mysql_query无法处理带有特殊字符的sql语句&#xff08;如&#xff1a;反斜杠0&#xff09;mysql_real_query则可以避免&#xff0c;一般使用这个。 mysql_affected_rows&#xff1a;获取sql语句执行结果影响…...

golang - 简单实现linux上的which命令

本文提供了在环境变量$PATH设置的目录里查找符合条件的文件的方法。 实现函数 import ("fmt""os""path""strings" )// 实现 unix whtich 命令功能 func Which(cmd string) (filepath string, err error) {// 获得当前PATH环境变量en…...

推荐一个好用的数据库映射架构

SqlSugar ORM 优点: SqlSugar 是 .NET 开源 ORM 框架,由 Fructose 大数据技术团队维护和更新,是开箱即用最易用的 ORM 优点: 【低代码】【高性能】【超简单】【功能综合】【多数据库兼容】【适用产品】 支持 .NET .NET framework.net core3.1.ne5.net6.net7.net8 .net…...

(013)window的Idea运行程序 Amazon java.nio.file.AccessDeniedException

解决方法一 在资源管理器中删除该目录&#xff0c; 在程序中使用代码&#xff0c;重新建立该目录&#xff1a; if (!FileUtil.exist(destinationPath)){FileUtil.mkdir(destinationPath); }解决方法二 JDK 的版本有问题&#xff0c;换个JDK。 解决方法三 网络不好&#xf…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...