七、性能测试之内存分析

news2025/1/18 1:51:31

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

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

一、内存知识

内存(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):

    • 怎么回收?
      • 垃圾回收算法:新生代-复制算法(清理eden,将存活的复制到survivor)
      • 老年代-标记整理算法(先标记,再整理,就像电脑删数据,先点击删除丢到回收站,然后在回收站那边再整理下进行删除)
    • 内存资源回收

      • 刚刚我们讲到了资源回收,只是在讲的时候才讲,其他时候没有,因为 本地方法栈,程序计数器,虚拟机栈 ,这些是不需要进行垃圾回收的
      • java的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器(garbage collector)完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,name称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可用回收其占据的空间,用于再分配
    • 3、常见问题:

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

三、内存分析

查看内存

  • 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:使用的物理内存占总内存的比率

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

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

相关文章

探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅

探索图像数据中的隐藏信息:语义实体识别和关系抽取的奇妙之旅 1. 简介 1.1 背景 关键信息抽取 (Key Information Extraction, KIE)指的是是从文本或者图像中,抽取出关键的信息。针对文档图像的关键信息抽取任务作为OCR的下游任务,存在非常…

LNMP架构:搭建Discuz论坛

文章目录 1. 编译安装Nginx1.1 前置准备1.2 编译安装1.3 添加nginx系统服务 2.编译安装MySql2.1 前置准备2.2 编译安装2.3 修改mysql 配置文件2.4 设置路径环境变量2.5 初始化数据库2.6 添加musql系统服务2.7 修改MySql登录密码 3. 编译安装PHP3.1 前置准备3.2 编译安装3.3 复制…

【前端demo】倒计时器 可选择时间 原生实现

文章目录 效果过程日历与获取时间居中背景与字计时器清空计时器 代码HTMLCSSJS 其他demo 效果 效果预览:倒计时器 可选择时间 (codepen.io) 参考: Simple Clock/Countdown timer (codepen.io) 前端页面实现倒计时效果的几种方法_前端倒计时__Boboy的…

安卓逆向 - Frida反调试绕过

本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,谢绝转载,若有侵权请联系我删除! 本文案例 app:5Lqs5LicYXBwMTEuMy4y 一、引言: Frida是非常优秀的一款 Hook框架&#…

iperf 测试网络性能

Iperf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。 官网:iperf.fr https://iperf.fr 支持参数 参数说明-p, --port #Server 端监…

设计模式入门(二)观察者模式

设计模式入门 本系列所有内容参考自《HeadFirst设计模式》。因为书中的代码是采用java语言写的,博主这里用C语言改写。 这里采用讲故事的方式进行讲解。若有错误之处,非常欢迎大家指导。 设计模式:模式不是代码,而针对设计问题的…

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…

用树形dp+状压维护树上操作的计数问题:0902T3

发现操作数 k ≤ 6 k\le6 k≤6,可以考虑对操作进行状压。 然后找找性质,发现要么删掉一棵子树,要么进去该子树。可以视为每种操作有两种情况。 然后分讨一下当前该如何转移。 树形dp的顺序: 合并子树考虑当前往上的边的方向 …

自定义类型:结构体、枚举、联合

目录 结构体 结构体的基础知识 结构的声明 特殊的声明 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体(共…

Mysql创建用户并且给指定用户添加某个库的所有权限

注意: 运行以下命令首先运行的用户需要有以下操作权限才可以执行 创建用户 创建用户:命令中的’username’替换为您要创建的用户名,‘host’替换为用户的主机名或IP地址如果都可以访问则配置’%,password’替换为用户的密码 CRE…

WoW GM

当年黑翼被人黑G以后,后来我就自己开团,今天整理电脑还发现截图。。。。

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程:“AI绘画:Stable Diffusion 终极宝典:从入门到精通 ” 尽管如此,还有读者反馈说,尽管已经成功安装,但生成的图片与我展示的结果相去甚远。真实感和质感之…

h5页面使用js注入企业微信sdk

let script document.createElement(script); //定义script标签 script.type text/javascript; script.src http://res.wx.qq.com/open/js/jweixin-1.2.0.js; document.getElementsByTagName(body)[0].appendChild(script); //将script标签插入到body下面

ISO/IEC标准组织介绍(三十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

[论文笔记]SiameseNet

引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…

C语言:截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章: 《C语言:整型提升》 《C语言:算数转换》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求…

mp代码生成插件

mp代码生成插件 1.下载下面的插件 2.连接测试 3.生成代码的配置 4.生成代码 红色的是刚刚生成的。 我觉得不如官方的那个好用,唯一的好处就是勾选的选项能够看的懂得。

代码随想录第36天|435. 无重叠区间 (需要二刷),763.划分字母区间,56. 合并区间

435. 无重叠区间 (需要二刷) 本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1&a…

公司电脑文件自动加密——「天锐绿盾」

「天锐绿盾」是一种文件自动加密工具,可以与天锐绿盾应用服务器安全接入系统结合使用,实现只有安装了加密客户端的电脑才能访问应用服务器。此外,该工具还可以指定办公人员在对某些类型的文件进行新建、编辑时,自动备份到天锐绿盾…

没有使用sniffer dongle在windows抓包蓝牙方法分享

网上很多文章都是介绍买一个sniffer dongle来抓蓝牙数据,嫌麻烦又费钱,目前找到一个好方法,不需要sniffer就可以抓蓝牙数据过程,现分享如下: (1)在我资源附件找到相关安装包或者查看如下链接 https://learn.microsoft.com/zh-cn/windows-hardware/drivers/bluetooth/testing-bt…