七、性能测试之内存分析

性能测试之内存分析与实战

      • 一、内存知识
        • 1、理解:
        • 2、内存的组成:内存地址、存储单元
        • 3、内存---树形结构
          • 1、链表
          • 2、二叉树
        • 4、数据结构
      • 二、内存使用
        • 1、典型案例:JVM(java虚拟机)
          • 包含程序计数器,java虚拟机栈,本地方法栈,方法区,堆内存
          • 堆内存的空间要经过不断分配和回收,才能得到高效的利用,那哪些会被回收,什么时候回收,怎么回收呢?
        • 2、回收(GC):
          • 性能测试中,对gc是要多关注
          • 哪些会被回收?
          • 什么时候回收?
          • 怎么回收?
        • 3、常见问题:
          • 1、内存溢出:
          • 2、内存泄露:
      • 三、内存分析
        • 1、查看内存
          • 1)free:free -h
          • 2)top:Ee
        • 2、内存分析工具
        • 3、确定oom问题

一、内存知识

内存(memory),又叫主存,是cpu与其他设备沟通的桥梁,主要用来临时存放数据,配合cpu工作,协调cpu的处理速度

  • 1、理解:

    • 硬盘数据、外设数据、网络传输数据,要进入cpu前,都要先进入内存
    • 临时存放,在断电后,内存内容就会丢失
    • 当打开一个软件,就会分配虚拟内存、物理内存空间,cpu读取虚拟内存
    • 程序在启动时,并不会把所有的数据都加到内存
    • 32位的系统,最大支持的内存条,只有4g,64位系统,最大可以支持128T
    • 程序在启动时,会有一个内存配置信息,就会告诉系统,我要在整个内存条中,申请多少m内存空间
  • 2、内存的组成:内存地址、存储单元

    • 内存地址:一个编号,用于指示数据位置(绝对地址、相对地址)
    • 存储单元:存放实际数据的地方
    • 内存地址与存储单元的关系:门牌号和房屋
      • 门牌号找到你的家庭地址(内存地址),房屋能装人和各种家居用品(存储单元)
        在这里插入图片描述
      • 数据大小
        • 写过代码的都知道,定义一个数据,要声明数据类型:
          • 为什么要声明这样一个类型?
            • 为了分配存储空间大小,存储大小一定要比实际数据大,才能装下实际数据(东西多,袋子小就装不下)
            • 1、单个数据:int、float、char…
            • 2、连续数据:列表,数组…
              • 分配一个连续的存储单元
                • python:列表 [8,‘nmb’,[‘vip8’,‘vip12’],]
                • 连续的存储单元–> 内存卡
                • 数据存储是不是可以更复杂?
                • 所以,就有了数据结构
              • 列表中,插入一个数据,要把插入位置之后的所有数据都移动位置,所以,这种速度是比较慢,这个时候,我们可以用链表
            • 3、内存—树形结构

              • 树形结构
                在这里插入图片描述

                • 1、链表
                  • 首先它也是一种数组,只是它的每个数据存储的是数据值+下一个元素的地址。如果要在链表中,插入一个数据,插入位置前一个元素中下一个元素的地址,指向性插入的数据的地址,被插入的元素记录的下一个元素地址,数据本身不用移动。
                  • 这种数据插入方式,速度要比列表要块
                  • 但是,读取某个数据的速度降低,因为我们每查询一个数据,都要从链表的第1个数据开始查找,一直到找到为止,这个中间,我们可能要进行大量IO数据交互,那么它的IO可能消耗比较高
              • 2、二叉树
                • 建立在链表的基础上的一种数据结构
                • 以第一个数据为原数据,后续的数据与这个数据比较,小的放左边,大的放右边,生成一个链表
                • 查找数据时,比数据大的,我就去右边找,比数据小,我就去左边找,这个时候,IO就比链表要少很多
                • 增删和链表一样
                  在这里插入图片描述
  • 4、数据结构

    • 堆栈
      • 不是一个,而是两种不同的数据结构
      • 栈(stack
        • LIFO== Last In First Out 后进先出
          • 就像收纳箱装东西,先进去的在最下面;取出来时,最上面的最先出来
          • 装入叫压入(push),取出叫弹出(pop)
          • 存放程序的变量
      • 队列(queue)
        • FIFO == First In First Out 先进先出
          • 就像排队打饭(顺序排列)/循环转圈(循环队列)
        • 堆(heap)
          • 类似图书馆书架上的图书
          • 一种经过排序的树形结构
          • 存放程序的对象
  • 二、内存使用

    • 一个程序运行起来,需要分配一块内存空间,无异常时,就在分配的这块内存空间弹性伸缩存储
    • 这个空间,至少会包括一块栈区和一块堆区,还会包括其他
      在这里插入图片描述
      • 栈区:存放程序中的局部变量,变量有一定的作用域,离开作用域,空间就会被释放,所以更新速度快,生命周期短
      • 堆区:存放程序中的数组和对象。凡是new出来的都存在堆里,如果数据消失,实体不会马上释放的
        • 就像男女朋友确认关系后,所有人都知道了。某天掰了,他们俩没有明确关系了,但是双方可能都不能马上找到新朋友,要被另外的单身份子收割,需要一定的时间
    • 一个程序: 如: 这个程序启动要 256m
      • 先有一个虚拟内存地址 + 物理内存地址
      • 虚拟内存地址: 记录物理内存中存储了哪些数据,在什么地方
    • 1、典型案例:JVM(java虚拟机)

      • 包含程序计数器,java虚拟机栈,本地方法栈,方法区,堆内存
        • 1)程序计数器:记录程序执行字节码的行号指示器
        • 2) java虚拟机栈:java方法执行时的内存模型
        • 3)方法区:共享内存区域,存储已被虚拟机加载的数据
        • 4)堆区:
          • 堆内存:
            在这里插入图片描述

            • 划分为新生代,老年代,永久代(元空间)
              • 1)新生代New:昙花一现,朝生夕死的对象( 比如你写的代码的方法里面的变量)
                • 新生代又分为:Eden,Surivivor1,Surivivor2
                  • Eden:存放jvm刚分配的对象
                  • Surivivor:两个空间一样大,Eden中未被GC的对象,经过copy算法,会在这两个区间来回copy,默认拷贝超过15次,就被移入Tenured年老代
              • 2)老年代Teunred:大对象or多次被GC后还在的对象(顽固分子)
              • 3)永久代Perm(元空间):类信息,常量,静态变量等
            • 堆内存的空间要经过不断分配和回收,才能得到高效的利用,那哪些会被回收,什么时候回收,怎么回收呢?
    • 2、回收(GC):

    • 3、常见问题:

      • 1、内存溢出:
        • 内存不够用,程序在申请内存时,申请不到足够的内存
        • 程序启动要256m,它内存溢出是指的溢出它本身的内存,而不是整个内存(比如你机器有8g,还剩4g,但还是内存溢出了,这是正常的,因为它溢出是指溢出自己本身的256m,而不是8g)
        • java.lang.StackOverFlowError栈溢出(线程请求的栈深度大于虚拟机运行时的最大深度)
        • 内存溢出在错误日志会出现,后续我们可以通过jmap,arthas工具进行查看和分析
      • 2、内存泄露:
        • 内存的资源不及时释放,一直占用,导致可用的内存资源越来越少。
        • 内存泄露一定会导致内存溢出
参数含义
-Xms初始堆大小
-Xmx最大堆空间
-Xmn设置新生代大小
-XX:SurivivorRatio新生代eden空间,from空间,to空间的比例关系(8:1:1)
-XX:PermSize方法区初始大小
-XX:MaxPermSize方法区最大值
-XX:metaspaceSize元空间GC阈值
-XX:MaxMetaspaceSize最大元空间大小
-Xss栈大小
-XX:MaxDirectMemorySize直接内存大小,默认为最大堆空间

三、内存分析

1、查看内存

  • 1)free:free -h

在这里插入图片描述

  • Mem:物理内存

    • total(合计)、used(已被使用)、free(未被使用)、shared(共享)、buff/cache(缓冲区/缓存)、available(新进程可分配)
      • buff:对原始磁盘块(操作系统与磁盘交流的最小单位)的临时存储
      • cache:从磁盘读取文件的页缓存
      • availabe=free(未被使用)+可回收的
  • swap:交换分区

    • 一种虚拟内存,由磁盘虚拟化而来,存在于内存和磁盘之间,因为磁盘和内存之间存在差异
  • 2)top:Ee

在这里插入图片描述

  • VIRT:虚拟内存使用量 VIRT=SWAP+RES
  • RES:物理内存使用量+未换出的虚拟内存大小 RES=CODE+DATA
  • SHR:共享内存的使用量
  • SWAP:虚拟内存中被换出的大小
  • CODE:代码占用的物理内存大小
  • DATA:代码之外的部分占用的物理内存大小
  • %MEM:使用的物理内存占总内存的比率
  • 2、内存分析工具

    • jmap
      • 命令:jmap [options] pid
      • options
        • -dump :生成java堆栈的快照信息
        • -heap :显示java堆详细信息,使用哪种回收机制,参数配置,分代情况
        • -histo :显示堆中对象统计信息,包括类,实例数量
        • jmap -F -dump:format=b,file=文件名.bin 进程id ===执行时间较长,需要等待结束
        • jmap -F -dump: =b,file=xxx .bin 端口号
  • 3、确定oom问题

    • 看请求的响应信息, 一般的情况下,出现内存溢出问题,在响应信息中都会有所体现nested exception is java.lang.OutOfMemoryError: Java heap space
      在这里插入图片描述

    • 有些项目,在log日志中,会有体现(不一定有)

    • 我们看系统的内存

      • 内存并没有被完全消耗掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

说说你了解的 CDC

分析&回答 什么是 CDC CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等。用户可以在以下的场景下使用CDC: 使用f…

燃气管网监测系统,提升城市燃气安全防控能力

燃气是我们日常生活中不可或缺的能源,但其具有易燃易爆特性,燃气安全使用、泄漏监测尤为重要。当前全国燃气安全事故仍呈现多发频发态势,从公共安全的视角来看,燃气已成为城市安全的重大隐忧!因此,建立一个…

JVM内存模型

文章目录 一、前言二、JVM内存模型1、Java堆2、方法区3、Java栈3.1、局部变量表3.2、操作数栈3.3、动态链接3.4、返回地址 4、本地方法栈5、程序计数器 一、前言 本文将详细介绍JVM内存模型,JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM…

Python 类和对象

类的创建 Python语言中,使用class关键字来创建类,其创建方式如下: class ClassName(bases):# class documentation string 类文档字符串,对类进行解释说明class_suiteclass是关键字,bases是要继承的父类,…

李宏毅机器学习笔记:RNN循环神经网络

RNN 一、RNN1、场景引入2、如何将一个单词表示成一个向量3种典型的RNN网络结构 二、LSTMLSTM和普通NN、RNN区别 三、 LSTM的训练 一、RNN 1、场景引入 例如情景补充的情况,根据词汇预测该词汇所属的类别。这个时候的Taipi则属于目的地。但是,在订票系统…

WEBGL(2):绘制单个点

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

Java单元测试及常用语句 | 京东物流技术团队

1 前言 编写Java单元测试用例&#xff0c;即把一段复杂的代码拆解成一系列简单的单元测试用例&#xff0c;并且无需启动服务&#xff0c;在短时间内测试代码中的处理逻辑。写好Java单元测试用例&#xff0c;其实就是把“复杂问题简单化&#xff0c;建单问题深入化“。在编写的…

英国选校8.27|8.29

目录 IC帝国理工学院 UCL伦敦大学学院​​​​​​​ Band A B C 专业院系 爱丁堡 曼彻斯特 KCL伦敦国王学院 Bristol布里斯托 华威 南安普顿 IC帝国理工学院 UCL伦敦大学学院 24qs专业位置双非雅思气候备注9 MSc Scientific and Data Intensive Computing MSc Ur…

在k8s中使用secret存储敏感数据与四种用法

当需要存储敏感数据时可以使用&#xff0c;secret会以密文的方式存储数据。 创建secret的四种方法 &#xff08;1&#xff09;通过--from-literal #每个--from-literal对应一个信息条目 kubectl create secret generic mysecret --from-literalusernameadmin --from-litera…

Spring Boot 中 Nacos 配置中心使用实战

官方参考文档 https://nacos.io/zh-cn/docs/quick-start-spring-boot.html 本人实践 1、新建一个spring boot项目 我的spirngboot版本为2.5.6 2、添加一下依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

无涯教程-JavaScript - CUBEMEMBERPROPERTY函数

描述 CUBEMEMBERPROPERTY函数从多维数据集返回成员属性的值。使用此函数可以验证多维数据集中是否存在成员名称,并返回该成员的指定属性。 语法 CUBEMEMBERPROPERTY (connection, member_expression, property)争论 Argument描述Required/OptionalconnectionName of the co…

JavaScript基础语法03——JS注释、结束符

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天继续学习JavaScript基础语法知识&#xff0c;注释和结束符&#xff0c;以下为学习笔记。 一、JavaScript注释 JavaScript注释有什么作用&#xff1f; JavaScript注释可以提高代码的可读性&#xff0c;能够帮助像…

arduino仿真 SimulIDE1.0仿真器

SimulIDE 是一个开源的电子电路模拟器&#xff0c;支持模拟各种电子元器件的行为&#xff0c;可以帮助电子工程师和爱好者进行电路设计和测试。以下是 SimulIDE 的安装和使用说明&#xff1a; 安装 SimulIDE SimulIDE 可以在 Windows、Linux 和 Mac OS X 等操作系统上安装。您…

零知识证明(zk-SNARK)(二)

From Computational Problem to zk-SNARK 本部分就是将计算难题转换为多项式&#xff0c;然后使用zk-SNARK。 &#xff08;注&#xff1a;以下用 P&#xff0c;V 替代 Prover&#xff0c;Verifier&#xff09; 计算难题->R1CS R1CS(Rank-1 Constraint System)是一种能够…

jvm的内存区域

JVM 内存分为线程私有区和线程共享区&#xff0c;其中方法区和堆是线程共享区&#xff0c;虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1&#xff09;程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也被称为 PC 寄存器&#xff0c;是一块…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目&#xff0c;环境&#xff1a;JDK8&#xff0c;添加依赖&#xff1a;Spring Web、MyBatis FrameWork(最主要&#xff09; 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包&#xff0c;名字为core&#xff0c;表示核心类…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章&#xff0c;基本是基于《MIPI Alliance Specification for D-PHY 》的内容&#xff0c;学习时也以此为准&#xff0c;可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错&#xff0c;既有理论&…

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码&#xff08;含上下扫描动画&#xff09;2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…

A Mathematical Framework for Transformer Circuits—Part (1)

A Mathematical Framework for Transformer Circuits 前言Summary of ResultsREVERSE ENGINEERING RESULTSCONCEPTUAL TAKE-AWAYS Transformer OverviewModel SimplificationsHigh-Level ArchitectureVirtual Weights and the Residual Stream as a Communication ChannelVIRTU…