坪山商城网站建设哪家效益快,长春网站建设优化排名,宁波住房和城乡建设部网站,PHP网站建设项目经验性能测试之内存分析与实战 一、内存知识1、理解#xff1a;2、内存的组成#xff1a;内存地址、存储单元3、内存---树形结构1、链表2、二叉树 4、数据结构 二、内存使用1、典型案例#xff1a;JVM#xff08;java虚拟机#xff09;包含程序计数器#xff0c;java虚拟机栈… 性能测试之内存分析与实战 一、内存知识1、理解2、内存的组成内存地址、存储单元3、内存---树形结构1、链表2、二叉树 4、数据结构 二、内存使用1、典型案例JVMjava虚拟机包含程序计数器java虚拟机栈本地方法栈方法区堆内存堆内存的空间要经过不断分配和回收才能得到高效的利用那哪些会被回收什么时候回收怎么回收呢 2、回收GC性能测试中对gc是要多关注哪些会被回收什么时候回收怎么回收 3、常见问题1、内存溢出2、内存泄露 三、内存分析1、查看内存1freefree -h2topEe 2、内存分析工具3、确定oom问题 一、内存知识
内存memory又叫主存是cpu与其他设备沟通的桥梁主要用来临时存放数据配合cpu工作协调cpu的处理速度 1、理解 硬盘数据、外设数据、网络传输数据要进入cpu前都要先进入内存临时存放在断电后内存内容就会丢失当打开一个软件就会分配虚拟内存、物理内存空间cpu读取虚拟内存程序在启动时并不会把所有的数据都加到内存32位的系统最大支持的内存条只有4g64位系统最大可以支持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、典型案例JVMjava虚拟机 包含程序计数器java虚拟机栈本地方法栈方法区堆内存 1程序计数器记录程序执行字节码的行号指示器2 java虚拟机栈java方法执行时的内存模型3方法区共享内存区域存储已被虚拟机加载的数据4堆区 堆内存 划分为新生代老年代永久代元空间 1新生代New昙花一现朝生夕死的对象 比如你写的代码的方法里面的变量 新生代又分为EdenSurivivor1Surivivor2 Eden存放jvm刚分配的对象Surivivor两个空间一样大Eden中未被GC的对象经过copy算法会在这两个区间来回copy默认拷贝超过15次就被移入Tenured年老代 2老年代Teunred大对象or多次被GC后还在的对象顽固分子3永久代Perm元空间类信息常量静态变量等 堆内存的空间要经过不断分配和回收才能得到高效的利用那哪些会被回收什么时候回收怎么回收呢 2、回收GC YGCminor GC针对新生代young generation得den区进行资源回收FGCmajor GC处理的区域同时包括新生代和年老代不管是YGC还是FGC都会造成一定程度的卡顿及时采用新的垃圾回收算法也只能减少卡顿时间不能完全消除卡顿比如删大文件就会卡一下FGC通常比较慢少则几百毫秒多则几秒如果频繁了会导致性能变差YGC一般几十到上百毫秒如果耗时达到秒级频繁还会导致性能变差 性能测试中对gc是要多关注 如果新生代资源分配过多那么老年代这变就要少老年代的空间我可能就要经常的进行FGC FGC频率高了那么累计的gc的时间就长导致性能比较差如果新生代分配的资源少了那么老年代就分配多些我的新生代的资源回收频率YGC就要高 那么累计的ygc的时间也可能长我的性能也可能较差那么两者之间有完美的比率吗 是没有的比如写个查找有人用递归有人用循环这样分配的内存是不一样的。只能边调试边测试改堆栈的配置 哪些会被回收 1、是否已死引用计数法被引用的计数等于0回收可达性算法没有引用链回收2、垃圾回收法 什么时候回收 分配空间不足注意不是内存空间不足才会执行回收定时回收 怎么回收 垃圾回收算法新生代-复制算法清理eden将存活的复制到survivor老年代-标记整理算法先标记再整理就像电脑删数据先点击删除丢到回收站然后在回收站那边再整理下进行删除 内存资源回收 刚刚我们讲到了资源回收只是在讲堆的时候才讲其他时候没有因为 本地方法栈程序计数器虚拟机栈 这些是不需要进行垃圾回收的java的内存回收机制内存空间中垃圾回收的工作由垃圾回收器garbage collector完成的它的核心思想是对虚拟机可用内存空间即堆空间中的对象进行识别如果对象正在被引用name称其为存活对象反之如果对象不再被引用则为垃圾对象可用回收其占据的空间用于再分配 3、常见问题 1、内存溢出 内存不够用程序在申请内存时申请不到足够的内存程序启动要256m它内存溢出是指的溢出它本身的内存而不是整个内存比如你机器有8g还剩4g但还是内存溢出了这是正常的因为它溢出是指溢出自己本身的256m而不是8gjava.lang.StackOverFlowError栈溢出线程请求的栈深度大于虚拟机运行时的最大深度内存溢出在错误日志会出现后续我们可以通过jmaparthas工具进行查看和分析 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、查看内存 1freefree -h Mem物理内存 total合计、used已被使用、free未被使用、shared共享、buff/cache缓冲区/缓存、available新进程可分配 buff对原始磁盘块操作系统与磁盘交流的最小单位的临时存储cache从磁盘读取文件的页缓存availabefree未被使用可回收的 swap交换分区 一种虚拟内存由磁盘虚拟化而来存在于内存和磁盘之间因为磁盘和内存之间存在差异 2topEe VIRT虚拟内存使用量 VIRTSWAPRESRES物理内存使用量未换出的虚拟内存大小 RESCODEDATASHR共享内存的使用量SWAP虚拟内存中被换出的大小CODE代码占用的物理内存大小DATA代码之外的部分占用的物理内存大小%MEM使用的物理内存占总内存的比率 2、内存分析工具 jmap 命令jmap [options] pidoptions -dump 生成java堆栈的快照信息-heap 显示java堆详细信息使用哪种回收机制参数配置分代情况 -histo 显示堆中对象统计信息包括类实例数量jmap -F -dump:formatb,file文件名.bin 进程id 执行时间较长需要等待结束jmap -F -dump: b,filexxx .bin 端口号 3、确定oom问题 看请求的响应信息 一般的情况下出现内存溢出问题在响应信息中都会有所体现nested exception is java.lang.OutOfMemoryError: Java heap space 有些项目在log日志中会有体现不一定有 我们看系统的内存 内存并没有被完全消耗掉