当前位置: 首页 > 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…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...