【软件构造】第八章第一节 软件构造性能的度量原理

第八章第一节 软件构造性能的度量原理

本章是课程覆盖的第5个质量指标:时空性能

这是大家最熟悉的指标,虽然很重要,但并非软件构造中最重要的指标,当其他指标得以优化之后,再去考虑性能问题。

Outline

  • 性能度量指标
  • 存储性能
  • 内存管理:
    • 对象管理模型:静态、堆、栈
    • 内存管理模型:
  • Java垃圾回收机制
    • 基本概念
    • GC的四种基本算法
  • JVM中的GC
  • JVM GC性能调优

 Notes

## 性能度量指标

  • 时间性能
    • 每条指令、每个控制 结构、整个程序的执行时间
    • 不同语句或控制结构执行时间的分布情况
    • 时间瓶颈在哪里
  • 空间性能
    • 每个变量、每个复杂结构、整个程序的内存消耗
    • 不同变量/数据结构的相对消耗
    • 空间瓶颈在哪里
    • 随时间的变化情况

## 内存管理

【对象管理模型】

  • 三者的差异在于:如何与何时在程序对象与内存对象之间建立联系
  • 静态
    • 定义:静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。
    • 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间;
    • 不支持递归,不支持动态创建可变长的复杂数据类型;
    • 在程序执行期内实体至多关联一个运行时对象
    • eg: 基本类型,数组
  • 动态-基于栈
    • 栈定义:方法调用和局部变量的存储位置,保存基本类型
      • 如果一个方法被调用,它的栈帧被放到调用栈的顶部
      • 栈帧保存方法的状态,包括执行哪行代码以及所有局部变量的值
      • 栈顶始终是当前运行方法
    • 一个实体可以在运行时连续地连接到多个对象,并且运行时机制以堆栈中的后进先出顺序分配和释放这些对象
    • 栈无法支持复杂数据结构

 【Java内存管理模型(Java Memory Model)】

  • Java内存模型(简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。即回答:JVM如何管理内存
    • 如何在堆上创建新对象
    • 当某个对象不再有reference指向他,如何阐述对象、释放内存

  • 对上创建的对象可被所有线程共享引用;
  • 可访问对象,就可以访问对象内的成员变量;
  • 如果两个线程调用同一个对象上的某个方法,它们分别保留该方法的局部变量的拷贝;
  • JMM例子:
    • 一个基本类型的局部变量,一直被保存在 线程栈
    • 局部变量引用的对象,保存在 线程栈 中,对象本身存在 堆 
    • 对象可能包含方法,这些方法可能包含局部变量。 这些局部变量存储在线程栈上,并且该方法所属的对象存储在_堆
    • 对象的原始成员变量存储在堆上。 如果一个成员变量是一个对象的引用,它将被存储在堆
    • 静态类变量保存在堆上

更多内容参考  zejiang的博客

  • Copying(复制)算法
    • 基本思想:为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
    • 优势:运行高效、不易产生内存碎片
    • 缺点:复制花费大量的时间,牺牲内存空间

 

## JVM中的GC

关于该部分的内容 请参考  Java 内存区域和GC机制

Java GC将堆分为不同的区域,各区域采用不同的GC策略,以提高GC的效率

(使用“-verbose:gc”在控制台或日志文件中输出JVM进行GC的全过程)

  • Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。
  • 对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)

 

 ## GVM GC性能调优

  • 尽可能减少GC时间,一般不超过程序执行时间的5%
    • 堆的大小决定着VM将会以何种频度进行GC、每次GC的时间多长。
      • 这两个指标具体取值多少为“优”,需要针对特定应用进行分析。
      • 较大的heap会导致较少发生GC,但每次GC时间很长
      • 如果根据程序需要来设置heap大小,则需要频繁GC,但每次GC的时间较短
    •  设定堆的大小的具体方法
      • Xmx/-Xms:指定年轻代和老年代空间的初始值和最大值;Xms小于Xmx时,年轻代和老年代所消耗的空间量可以根据应用程序的需求增长或收缩;Java堆的增长不会比Xms大,也不会比Xmx小
      • XX: NewSize=[g|m|k]:年轻代空间的初始和最小尺寸,是大小,[g | m | k]指示大小是否应解释为千兆字节,兆字节或千字节
      • XX: MaxNewSize=[g|m|k]:年轻代空间的最大值
      • Xmn[g|m|k]:将年轻代的初始值、最小值、最大值设为同一值
    • GC模式选择
      • 增长或收缩年轻代或老年代的空间时需要Full GC
      • Full GC可能会降低吞吐量并导致超出期望的延迟
      • 串行收集器(-XX:+UseSerialGC):使用单个线程执行所有垃圾收集工作
      • 并行收集器(-XX:+UseParallelGC):并行执行Minor GC,显著减少垃圾收集开销
      • 并发低暂停收集器(-XX:+UseConcMarkSweepGC):收集持久代,与执行应用程序同时执行大部分收集,在收集期间会暂停一小段时间
      • 增量低暂停收集器(-XX:+UseTrainGC):收集每个Minor的部分老年代,并尽量减少Major的大停顿
      • -verbose:gc:打印GC信息

    文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览35192 人正在系统学习中 相关资源:流式细胞仪的分析软件周期凋亡_凋亡流式原始资料下载,细胞凋亡…

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年5月15日
下一篇 2018年5月15日

相关推荐