精华内容
下载资源
问答
  • UML 交互

    千次阅读 2012-07-14 09:53:03
    UML 交互图 (顺序图、通信图、鲁棒图、定时图)   2010-12-23 作者:佚名 来源:网络    交互交互图  交互的概念  一次交互就是指在特定语境中,为了实现某...
    UML 交互图 (顺序图、通信图、鲁棒图、定时图)
     

    2010-12-23 作者:佚名 来源:网络

     

       交互与交互图
       交互的概念
       一次交互就是指在特定语境中,为了实现某一个目标,而在一组对象之间进行交换的一组消息所表示的行为

       消息
       UML中的4种交互图
       顺序图:顺序图是一种强调消息时间顺序的交互图,为读者提供了控制流随着时间推移的清晰的可视化轨迹
       通信图:UML 2.0中的通信图实际上就是UML 1中的协作图,它强调的是参加交互的对象的组织,为读者提供了在协作对象结构组织的语境中观察控制流的一个清晰的可视化轨迹
      定时图:采用了一种带数字刻度的时间轴来精确地描述消息的顺序
      交互概述图:是交互图和活动图的混合物
      如何阅读交互图
       阅读顺序图

    顺序图的主要元素

    对象与角色:最顶上一排矩形框。在交互图中,参与交互的对象既可以是具体的事物,又可以是原型化的事物。作为具体的事物,一个对象代表现实世界中的某个东西。例如,aOrder作为类Order的一个实例,可以代表一个特定的订单;而如果作为一个原型化的事件,则aOrder可以代表类Order的任何一个实例。

    生命线与控制焦点:每个对象都有自己的生命线,对象生命线是一条垂直的虚线,用来表示一个对象在一段时间内存在

    消息:用来描述对象之间所进行的通信的,该信息带有对将要发生的活动的期望。当传送一个消息时,它所引起的动作是用一个通过对计算过程的抽象而得到的可执行语句(就是方法头)。

       消息分为五种:调用、返回、发送、创建和销毁
       调用:表示调用某个对象一个操作

    顺序编号(第几步的编号):整个消息的传递过程就形成了一个完整的序列,因此通过在每个消息的前面加上一个用冒号隔开的顺序号来表示其顺序。除了顺序编号之外,还可以采用嵌套方案:

    读图小结

    第1步 在dispatchForm(分发窗体)中,对于某个已支付的Order进行分发时,就会调用该订单(一个Order类的实例对象aOrder)的dispatch()方法。

    1.1 dispatch()方法将逐个调用 [for each orderitem] 该Order对应的所有OrderItem对象的getPeddleryId()方法获取供应商ID 1.2(PeddleryId),1.1.1 而OrderItem对象则是通过其所对应的Product对象来的getPeddleryId()方法来获取供应商ID 。

    1.2当Order的实例对象aOrder得到返回的PeddleryId后,根据该值判断是否已经有相对应的DeliverOrder对象【if PeddeleryId Not Exist】,如果没有就创建它(调用 1.3 create(PeddleryId)),然后再将对应的Product添加到这个DeliverOrder对象中。[else ] 1.4否则就直接添加到相应的DeliverOrder对象中。

    嵌套,由左向右,由上向下

    循环与分支

       交互片断操作符
       片段就是指上面的框,
       左上角是片段操作符
       assert(断言)
       一定会发生
       交互片断操作符assert是用来表示内容所描述的行为是执行过程中那个时刻唯一的有效行为。如果执行到这个片断的前面,则说明该片断就一定会发生。它通常和ignore或consider一起使用,以断言某种特定种类的消息行为

    break

       条件复合跳出?交互片断操作符break和循环语句的break有点类似,通常break用来定义一个含有监护条件的子片断。
       如果监护条件为“真”则执行子片断,而且不执行包含子片断的图中其它交互将不会执行,也就是跳出去;
       如果监护条件为“假”,那么执行将正常地继续进行

    critical

       连续性的事物性的操作
       表示该子片断是“临界区域”,在临界区域中生命线上的事件序列不能够和其它区域中的任何其他事件交错。通常用来表示一个原子性的连续操作,例如事务性操作

    par

       同时执行
       用来表示“并行”的,也就是用来表示两个或多个并发执行的子片断,并行子片断中单个元素的执行次序可以以任何可能的顺序相互操作

    ref

       引用另一个片段到此处
       在一个交互图中,我们可以引用其它的交互图,其表示的方法是用一个矩形,加上ref操作符,并写明引用的交互图名称即可


    表示法
    表示法
    类图
    class
    对象图
    object
    包图
    package
    用例图
    use case
    顺序图
    sd
    通信图
    comm
    定时图
    timing
    活动图
    activity
    交互概观图
    intover
    状态机图
    statemachine
    构件图
    component
    部署图
    deployment

    阅读通信图

    通信图就是把顺序图竖起来去看,关注了访问关系。

    通信图主要元素

    链:连接器,是用来表示对象之间的语义连接,一般而言,链是关联的一个实例(包括《association》、《self》、《global》、《local》等)。不过在UML 2中已经开始弱化它们的使用,因此除非必要,无需过多地考虑它们

    消息编号:消息的编号有两种,一种是无层次编号,它简单直观;另一种是嵌套的编号,它更易于表示消息的包含关系(类似,1.3.2 )

    迭代标记:用*号表示,表示循环,通常还有迭代表达式,用来说明循环规则

    监护条件:通常是用来表示分支的,也就是表示“如果条件为true,才发送消息”

    在通信图中使用监护条件一定要有所限制,通常应只列出主要的监护条件,否则会影响其阅读。如果需要,尽可能还是通过顺序图来表示

    如何绘制交互图

    准备工作

    首先根据自己的喜好和实际的表现需要来选择顺序图或通信图。不过由于它们在语义上是等价的,因此可以绘制出一种,再通过建模工具来自动转换成另一种图

    分析模型中的交互图彻重于分析类的职责分配和交互流程,而设计模型中的交互图则彻重于设计类的引入和实际方法的调用与流程控制

    先确定参与交互的对象、对象之间的关系(通信图),然后确定对象间的消息交互流程(用同步调用、异步消息、返回消息表示),并利用交互片断(顺序图)或迭代标记及监护条件来表示循环和分支结构

    鲁棒分析

    鲁棒图可以很多的解决需求分析和架构设计之间的差别。更详细的说明请看最后的解释。

    Robustness分析不是UML模型的一部分,它是一个强大的草图工具,是介于分析和设计之间的一种有效工具

    在Robustness分析中,将应用边界类、控制类和实体类,分别对应MVC 架构的3个层

    从一个用例中抽取三类对象的方法

    鲁棒分析—从事件流开始

    下面是用例描述

    鲁棒分析—寻找边界对象

    图书管理员向系统发出“新增书籍信息”请求——主窗口、“新增书籍信息”按钮

    系统要求图书管理员选择要新增的书籍是计算机类还是非计算机类——书籍类别列表框。

    图书管理员做出选择后,显示相应界面,让图书管理员输入信息,并自动根据书号规则生成书号——“新书信息录入”窗口及辅助的“提交”按钮

    鲁棒分析—寻找控制对象和实体对象

    新添两个逻辑:

    一 是基本事件流中的步骤2、3要求根据用户选择的类别,自动获得书号;

    二 是当书名重复性检查没有通过(有重名),则应返回要求其重输

    构建交互模型

    转换成通信图

    走到这里,我们已经能够知道,MDA的建模顺序,是先用例图,用例描述,鲁棒图,鲁棒顺序图(通信图),类图,数据库设计图

    交互图应用说明

    交互模型的类型与演变

    分析阶段的交互模型

    工作方法:针对用例图中的每个用例,并结合领域模型中的类,寻找分析类,并通过Robustness分析来理清业务逻辑流程,再用交互模型将其确定下来

    注意:主要关注于区分出边界对象、实体对象和控制对象,暂时不要考虑其具体的实现类

    说明:对于较复杂的用例,可以按上述的流程逐渐地进行分析、设计、实施;但对于比较简单的用例而言,也是可以直接从用例描述中导出设计阶段交互模型

    分析阶段的交互模型之后

    引入基础类:包括基础框架、程序库等

    质量评审:

    -- 低耦合:耦合性是指两个类之间的连接强度

    -- 高内聚:内聚性是指一个类的属性与方法高度集成

    -- 效率:解决方案的执行效率是否满足系统的需求

    -- 完整性:是指在任何环境下都可以重复使用

    -- 简单性:类越简单,出错的可能性越小,系统的灵活性和可维护性也越好

    优化类设计:阅读 《设计模式与重构》

    设计阶段的交互模型 & 交互建模要点

    在分析模型的基础上引入基础类、优化类设计之后,必然会获得新的类模型(类图)(设计模型),因此就可能需要基于新引入的“设计类”来更新交互模型,以获得与实际代码相吻合的模型

    给出一个能表达其目的的名称;通过修改元素的布局,尽量避免交叉线的存在;可以通过注解和颜色作为可视化提示,以突出图形中的重要特性;尽量少用分支,对于分支很多的场景,可以考虑用活动图来补充

    定时图(时序图)

    定时图与顺序图的区别

    坐标轴交换了位置,改为从左到右来表示时间的推移(生命线颠倒)

    用生命线的“凹下凸起”来表示状态的变化,每个水平位置代表一种不同的状态,状态的顺序可以有意义、也可以没有意义

    生命线可以跟在一根线后面,在这根线上显示些不同的状态值

    可显示一个度量时间值的标尺,用刻度表示时间间隔

    展开全文
  • 几个公式需要记忆一下。 一、概论 交互:人与计算机之间的直接或间接的通讯。 人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易使用。 人机交互的研究内容 人机交互界面...

    第八章由于懒了,没写。有几个公式需要记忆一下。

    一、概论

    交互:人与计算机之间的直接或间接的通讯。
    人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易使用。

    人机交互的研究内容

    • 人机交互界面的表示模型与方法
    • 可用性分析与评价
    • 多通道交互技术
    • 认知与智能用户界面
    • 群件
    • web设计
    • 移动界面设计

    **人机交互学:**是一门研究人、计算机以及他们之间相互联系的方式(交互)的科学。
    交互:人与计算机之间的直接或间接的通讯
    人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易使用。

    为什么学习人机交互?
    从市场角度:用户容忍度降低
    从企业角度:提高生产效率,降低成本
    从个人角度:提高可用性,获取用户主观满意度
    从人性角度:容忍用户出错

    多通道交互:一种使用多种通道与计算机通信的人机交互方式。

    通道:源于心理学的概念,涵盖了用户表达意图、执行动作或感知反馈信息的各种通信方法,如言语、眼神、脸部表情、唇动、手动、头动、肢体姿势、触觉、嗅觉或味觉等。

    (手写汉字识别、数字墨水技术、笔式交互技术、语音识别、语音合成技术)

    人机交互的发展历史

    命令行界面交互阶段、图形用户界面交互阶段、自然和谐的人机交互阶段(情感计算、多通道交互、虚拟现实、只能用户界面)

    人机交互的发展趋势

    智能化、集成化、网络化、标准化

    二、人机交互基础知识

    什么是好的交互设计?
    不存在危害的系统,高效且无差错
    日常系统,易学习,不易出错,用户满意
    最好的界面是用户感觉不到界面
    界面设计满足不同用户的身心需求

    交互框架作用:
    提供理解或定义某种事物的一种结构
    能够帮助人们结构化设计过程
    认识设计过程中的主要问题
    还有助于定义问题所涉及的领域

    2.2交互框架

    执行/评估活动周期 EEC:
    1、最有影响力的框架
    2、定义了活动的四个组成部分
    目标(Goal) ≠意图(Intention)
    执行(Execution)
    客观因素(World)
    评估(Evaluation)

    EEC模型可解释为什么有些界面的使用存在问题
    执行隔阂:用户为达目标而制定的动作与系统允许的动作之间的差别
    评估隔阂:系统状态的实际表现与用户预期之间的差别

    EEC模型不能描述人与系统通过界面进行的通信
    四个构成部分+四个步骤(翻译过程)
    系统:内核语言
    用户:任务语言
    输入:输入语言
    输出:输出语言

    2.3 交互形式

    1、命令行交互
    优点
    专家用户能够快速完成任务;
    较GUI节约系统资源;
    可动态配置可操作选项;
    键盘操作较鼠标操作更加精确;
    支持用户自定义命令

    缺点
    命令语言的掌握对用户的记忆能力提出较高要求;
    基于回忆的方式(recall memory)
    没有GUI基于识别的方式(recognition memory)容易使用
    键盘操作,出错频率较高;
    要求用户记忆指令的表示方式
    与可用性理论所强调的“不应要求用户了解计算机底层的实现细节”相违背。

    2、菜单驱动界面
    优点
    基于识别机制,对记忆的需求较低;
    具有自解释性;
    容易纠错;
    适合新手用户。若提供了较好的快捷键功能,则对于专家用户同样适用。
    缺点
    导航方式不够灵活;
    当菜单规模较大时,导航效率不高;
    占用屏幕空间,不适合小型显示设备。
    为节省空间,通常组织为下拉菜单或弹出式菜单;
    对专家用户而言使用效率不高

    3、基于表格的界面
    优点
    简化数据输入;
    只需识别无需学习;
    特别适合于日常文书处理等需要键入大量数据的工作
    缺点
    占用大量屏幕空间;
    导致业务流程较形式

    4、直接操纵
    自由阶段——指用户执行操作前的屏幕视图;
    捕获阶段——在用户动作(点击、点击拖拽等)执行过程中屏幕的显示情况;
    终止阶段——用户动作执行后屏幕的显示情况。

    优点
    将任务概念可视化,用户可以非常方便地辨别他们;
    容易学习,适合新手用户;
    基于识别,对记忆的要求不高,可减少错误发生;
    支持空间线索,鼓励用户对界面进行探索;
    可实现对用户操作的快速反馈,具有较高的用户主观满意度。
    缺点
    实现起来比较困难;
    对专家用户而言效率不高;
    不适合小屏幕显示设备;
    对图形显示性能的需求较高;
    不具备自解释性,可能误导用户

    5、问答界面
    优点
    对记忆的要求较低;
    每个界面具有自解释性;
    将任务流程以简单的线性表示;
    适合新手用户。
    缺点
    要求从用户端获得有效输入;
    要求用户熟悉界面控制;
    纠错过程可能比较乏味。

    6、隐喻界面
    优点
    直观生动
    无需学习
    局限性
    不具有可扩展性,大量实体时效率低下
    不同用户对同一事物可能产生不同的联想
    紧紧地将我们的理念和物理世界束缚在一起
    寻找恰当的隐喻可能存在困难

    7、自然语言交互
    8、3D虚拟环境导航
    9、笔交互
    10、触摸屏
    11、多通道用户界面

    2.4 理解用户

    信息处理模型:研究人对外界信息的接收、存储、集成、检索和使用,可预测人执行特定任务的效率,没有考虑到注意和记忆的重要性

    扩展的信息处理机模型

    **认知心理学:**关注人的高级心理过程,如记忆、语言、思维、感知和问题解决能力等的心理学

    格式塔心理学:研究人是如何感知一个良好组织的模式的,而不是将其视为一系列相互独立的部分。
    人类处理机模型
    包含三个交互式组件:
    感知处理器 :信息将被输出到声音存储和视觉存储区域
    认知处理器 :输入将被输出到工作记忆
    动作处理器:执行动作

    存在的问题
    把认知过程描述为一系列处理步骤
    仅关注单个人和单个任务的执行过程,忽视了复杂操作执行中人与人之间及任务与任务之间的互动
    忽视了环境和其他人可能带来的影响

    格式塔(Gestalt)心理学
    相近性原则、相似性原则、连续性原则、完整性和闭合性原则、对称性

    人的认知特性
    三个阶段
    感觉记忆
    短时记忆
    长时记忆
    三个阶段之间可以进行信息交换

    三、交互设计目标与原则

    3.2 交互设计目标

    可用性目标
    (1)易学性(最基本的可用性属性)
    (2)高效率
    (3)易记性
    易记性的影响因素
    位置:将特定对象放在固定位置
    分组:对事物按照逻辑进行恰当的分组
    惯例:尽可能使用通用的对象或符号
    冗余:使用多个感知通道对信息进行编码
    (4)少出错
    措施
    保证导致灾难性后果错误的发生频率降到最低
    保证错误发生后迅速恢复到正常状态
    (5)主观满意度
    观念的转变
    传统软件质量观
    侧重内部效率和可靠性
    如程序代码运行时的效率以及灵活性、可维护性
    人机交互软件质量观
    转向用户视角

    用户体验目标

    区别与联系

    可用性保证产品的基本功能完备且方便使用;用户体验的目的是给用户一些与众不同的使用感受。

    3.3 简易可用性工程

    可用性工程是完整的用于改善产品可用性的迭代过程。

    可用性度量
    常用方法
    选择一些能够代表目标用户群体的测试用户
    让这些用户使用系统执行一组预定的任务
    比较任务的执行情况
    针对多维属性
    取每个可用性属性的平均值
    查看整体分布情况
    (1)易学性度量
    可用性属性中最容易度量的属性
    找一些从未使用过系统的用户
    能够代表系统的目标用户
    区分没有任何计算机使用经验的新手用户和具有一般计算机使用经验的用户
    统计他们学习使用系统直至达到某种熟练程度的时间
    (2)使用效率度量
    (3)易记性度量
    (4)错误率度量
    (5)主观满意度度量
    不论采用什么样的评价尺度,都应当在大规模测试前进行小规模试点测试

    可用性工程:以提高产品的可用性为目标的先进的产品开发方法论

    完整的可用性工程过程
    了解用户
    竞争性分析
    设定可用性目标
    用户参与的设计
    迭代设计
    产品发布后的工作
    简化
    用户和任务观察
    场景(scenario)
    简化的边做边说(thinking aloud)
    启发式评估

    3.4 交互设计原则

    基本规则
    可学习性
    新用户能用它开始有效的交互并能获得最大的性能
    灵活性
    用户和系统能以多种方式交换信息
    健壮性
    在决定成就和目标评估方面对用户提供的支持程度

    八条黄金规则

    尽可能保证一致
    符合普遍可用性

    提供信息丰富的反馈
    设计说明对话框以生成结束信息

    预防并处理错误
    让操作容易撤销

    支持内部控制点
    减轻短时记忆负担

    七项原理

    应用现实世界和头脑中的知识

    简化任务结构

    使事情变得明显

    获得正确的映射

    利用自然和人为的限制力量

    容错设计

    当所有都不成功时进行标准化

    十项启发式规则
    系统状态的可见度
    系统和现实世界的吻合
    用户享有控制权和自主权
    一致性和标准化
    避免出错
    依赖识别而非记忆
    使用的灵活性和高效性
    审美感和最小化设计
    帮助用户识别、诊断和恢复错误
    帮助和文档

    四、交互设计过程

    4.2 交互设计过程

    基本活动
    (1)标识用户需要并建立需求
    了解谁是目标用户,交互式产品应提供哪些支持
    这个活动是最基本的
    (2)开发满足需求的候选设计方案
    交互设计的核心活动
    可进一步划分为概念设计和物理设计
    (3)构建设计的交互式版本
    不必是可运行的软件
    (4)评估设计
    评估设计的可用性和可接受性
    用到各种评估标准
    三个关键特征
    以用户为中心
    以用户为中心是交互设计的核心观点
    提供让用户参与评估和提出反馈的机会
    稳定的可用性标准
    项目之初就必须标识特定的可用性和用户体验目标
    迭代
    用户和设计人员都参与设计和讨论需求
    各个活动相互启发,并重复进行

    4.3 设计过程

    1、选取用户
    2、明确需求
    3、提出候选设计方案
    4、选择设计方案
    决策分为两类:
    第一类:关于可见、可测量的外部特征,例:检索数据库网页的响应时间
    第二类:关于不可见、不可测量的内部特征,例:数据库内部存取机制
    注意力集中在可见、可测量的外部行为上

    4.4 交互系统生命周期

    一个交互式系统的所有需求在开始时是无法确定的。
    传统的生命周期模型不适用
    1、星型生命周期模型
    以“评估”为核心
    没有活动次序
    任何两个活动可以相互切换
    可以从任一活动开始

    2、可用性工程生命周期模型
    三个基本任务:
    需求分析
    设计/测试/开发
    安装
    交互设计过程管理
    LUCID(合理的以用户为中心的交互设计)
    六个阶段:
    预想
    发现
    设计基础
    设计细节
    构建
    发布

    五、交互式系统的需求

    用户是不同的
    产品是不同的
    人物角色的构建
    场景剧本的构造
    需求获取和分析
    层次化任务分析
    原型

    需求:关于目标产品的一种陈述,它指定了产品应做什么,或者应如何工作

    需求获取是项目设计的第一个阶段

    需求活动
    搜集数据、解释数据、提取需求

    产品特性
    功能不同、物理条件不同、使用环境不同

    5.4 用户特性

    用户差异
    (1)体验水平差异
    设计目标
    让新手快速和无痛苦地成为中间用户
    避免为想成为专家的用户设置障碍
    让中间用户感到愉快
    因为他们的技能将稳定地处于中间层
    a.新手用户
    特点
    敏感,且很容易在开始有挫折感
    设计要求
    不能将新手状态视为目标
    让学习过程快速且富有针对性
    确保程序充分反映了用户关于任务的心智模型
    无论什么样的帮助,都不应该在界面中固定
    具有向导功能的对话框帮助较好
    不要使用在线帮助作为学习指导
    使用单个的指南工具(一般显示在对话框中)
    菜单项应该是解释性的
    b.专家用户
    特点
    对缺少经验的用户有着异乎寻常的影响
    “专家说不好就不好”
    欣赏更新的且更强大功能
    不会受到复杂性增加的干扰
    设计要求
    对经常使用的工具集,要能快速访问
    c.中间用户
    特点
    需要工具,但不需要解释,而需要提示
    知道如何使用参考资料,在线帮助
    能够区分经常使用和很少使用的功能
    高级功能的存在让永久的中间用户放心
    设计要求
    工具提示(Tooltip)是适合中间用户最好的习惯用法
    在线帮助是永久中间用户的极佳工具
    常用功能中的工具放在用户界面的前端和中心位置
    提供一些额外的高级特性

     (2)年龄差异
     (3)文化差异
     (4)健康差异
    

    5.5 用户建模

    人物角色
    作用:
    确定产品应该做什么及应有的行为
    与利益相关者、开发者和其他设计者交流
    在设计中达成意见一致和承诺
    衡量设计的效率
    促进产品其他方面的相关工作,如市场推广和营销计划。
    解决产品开发过程中出现的3个设计问题 :
    弹性用户
    自参考设计
    边缘情况统计

    建模过程:
    拼凑:采用头脑风暴的方法,产生一些零碎概念或模型的片段,先不去考虑他们的细节。
    组织:将这些片段按照所构造模型的需要进行分组和分类,归并或删除那些冗余重叠的东西
    细节:建立和完善相应细节,补充遗漏的数据
    求精:对模型进行推敲,以便改进和完善
    以上过程循环反复

    5.6 需求获取、分析和验证

    观察:
    直接观察
    间接观察
    场景:
    场景是表示任务和工作结构的“非正式的叙述性描述“
    场景的来源:场景说明通常来自专题讨论或者访谈,目的是解释或讨论有关用户目标的一些问题
    任务分析
    层次化任务分析(HTA)是应用最广的任务分析技术

    需求定义阶段的步骤:

    1)创建问题和前景综述

    2)头脑风暴

    3)确定人物角色的期望

    4)构建情景剧本

    5)确定需求(数据需求、功能需求、其他)

    任务分析的用途:
    手册和教学(现有系统)
    需求获取和系统设计(新系统)
    任务分析本身不是需求获取,但有助于需求的完整表达
    详细的接口设计(新系统)
    应用于菜单设计
    需求验证:
    一般的需求验证技术:
    需求评审、测试用例
    交互系统的验证技术:
    原型
    原型分类:
    低保真原型(丢弃型)
    与最终产品不太相似的原型
    使用与最终产品不同的材料,如纸张、纸板
    如PalmPilot掌上电脑的木雕原型
    优点是简单、便宜、易于制作和修改
    高保真原型(进化型)
    与最终产品更为接近,使用相同的材料
    如使用Visual Basic开发的软件系统原型
    风险
    用户会认为原型就是系统
    开发人员可能认为已找到了一个用户满意的设计

    六、交互式系统的设计

    过早地把重点放在小细节、小部件和精细的交互上会妨碍产品的设计

    6.2 设计框架

    定义高层次上的屏幕布局
    定义产品的工作流、行为和组织
    步骤:
    1、定义外形因素和输入方法
    2、定义功能和数据元素
    3、决定功能组合层次
    4、勾画大致的设计框架
    5、构建关键情景场景剧本
    6、通过验证性的场景剧本来检查设计

    三种验证性的场景剧本

    1、关键线路的变种场景剧本

    2、必须使用的场景剧本

    3、边缘情形使用的场景剧本

    6.3 简化设计的四种策略:

    转移(略)
    删除
    方法:功能融合、删除视觉混乱、删减文字、不要删减过多
    组织
    隐藏:把不是最重要的组件和信息以某种方式隐藏起来,避免分散用户的注意力。

    删除不必要的
    组织要提供的
    隐藏非核心的

    6.4 设计中的折中

    个性化和配置
    本地化和国际化
    审美学与实用性

    6.5 软件设计的细节

    设计体贴的软件

    加快系统的响应时间

    减轻用户的记忆负担

    减少用户的等待感
    以某种形式的反馈让用户了解操作进行的进度和状态
    如进度对话框
    以渐进方式向用户呈现处理结果
    分成多个连续的部分来顺序地把结果提供给用户
    先传输全局概括,再传输细节
    给用户分配任务,分散用户的注意力(安装软件)
    减低用户的期望值(本次安装大约需要3分钟)

    设计好的出错信息
    四个简单原则
    使用清晰的语言来表达,而不要使用难懂的代码
    使用的语言应当精炼准确,而不是空泛而模糊的
    对用户解决问题提供建设性的帮助
    出错信息应当友好,不要威胁或责备用户

    6.6 交互设计模式

    模式在HCI中的应用还处于起步阶段
    定位模式、结构模式、行为模式
    模式不是拿来即用的商品,每一次模式的运用都有所不同

    物理结构:
    三种不同的物理结构:
    多窗口
    当用户想要自定义屏幕布局的复杂应用时
    缺点:窗口太多,用户找不到想要的窗口
    单一窗口分页
    简单Web应用最适合
    优点:有效组织空间,是小型手持设备和手机的首选
    平铺窗口
    优点:可看到许多内容而不必管理窗口
    缺点:占据大量屏幕空间
    如何选择:用户是关键

    七、可视化设计

    7.2 窗口和菜单

    1、窗口
    (1)状态:
    最大化
    最小化
    还原
    平铺(Tile)窗口:允许拖放操作
    重叠(Overlapping)窗口:有效利用屏幕空间
    层叠(Cascade )窗口:可视化组织各窗口
    (2)窗口界面类型
    多文档界面
    优点
    节省系统资源
    最小的可视集
    协同工作区
    多文档同时可视化
    缺点
    菜单随活动文档窗口状态变化,导致不一致性
    文档窗口必须在主窗口内部,减弱多文档显示优势
    屏幕显示复杂:子窗口可能在父窗口中被最小化

     单文档界面
       优点
         从用户角度出发,以文档为中心
         界面的视觉复杂性小
       缺点
         不能管理分散但相关的文档窗口
         相关文档不能从相同类型的其他文档中分离
         文档打开过多时,任务栏可能被占满
     标签文档界面
       窗口菜单:包含了当前打开窗口的列表
       
       优点:让用户看到哪些窗口是打开的
       缺点:不允许用户看到两个及以上的窗口内容
    

    2、菜单
    访问系统功能的工具,已经成为窗口环境的标准特征
    必不可少的组成部分
    菜单标题
    菜单选项
    最重要的特性:描述性、一致性
    注意事项:
    菜单应该按语义及任务结构来组织
    合理组织菜单接口的结构与层次
    菜单及菜单项的名字应符合日常命名习惯
    菜单选项列表即可以是有序的也可以是无序的
    为菜单项提供多种的选择途径
    增加菜单系统的可浏览性和可预期性
    对菜单选择和点取设定反馈标记

    7.3 对话框

    ​ 典型的辅助性窗口
    ​ 分类:
    ​ 模态对话框、非模态对话框
    ​ 按用途分类:
    ​ 属性对话框、功能对话框、进度对话框(耗费的时间的进度)、公告对话框(阻塞型对话框(错误、警告、确认)、临时对话框)、标签对话框、扩展对话框、级联对话框
    ​ 消除错误信息
    ​ 用更健壮的软件取代错误消息
    ​ 消除用户犯错误的可能性
    ​ 为所有的数据输入使用有界控件
    ​ 为用户提供正面反馈
    ​ 软件的负面反馈对用户而言是一种侮辱
    ​ 最后一招:改进错误消息框
    ​ 保证始终有礼貌、具有启发性、还要助人为乐
    ​ 澄清问题的范围
    ​ 可选择的方法
    ​ 默认情况程序会做什么
    ​ 丢失了哪些信息
    ​ 消除确认对话框
    ​ 原则1:做,不要问
    ​ 设计软件时,勇往直前给它确信的力量
    ​ 原则2:让所有操作都可以撤销
    ​ 删除或覆盖文件时可将文件移动到暂时目录,待一段时间或物理删除后再删除
    ​ 原则3:提供非模态反馈帮助用户避免犯错误
    ​ 如文档页面应显示真实可打印区域的向导,以避免打印文档超出可用的打印区域


    ​ 对话框设计原则
    ​ (1)把主要的交互操作放在主窗口中
    ​ 对话框适合主交互流之外的功能
    ​ (2)视觉上区分模态与非模态对话框
    ​ 为非模态对话框提供一致的终止命令
    ​ (3)不要用临时对话框作为错误信息框或确认信息框
    ​ 保证用户能够阅读
    ​ (4)不要堆叠标签

    7.4 控件

    (1)命令控件
    (2)选择控件(复选框、列表框、下拉列表)
    (3)显示控件
    滚动条
    适合用于窗口内容和文本导航器
    包含的信息
    当前可见文档的百分比
    总共有多少页
    拖动滑块时,显示页数
    拖动滑块时,显示每一页的第一个句子
    跳到文档开始和末尾的按钮
    (4)输入控件(有界)

    7.5 工具栏

    工具栏上的图标与文本
    不同时显示,因为屏幕空间宝贵,
    工具提示

    图标的4种表示方法
    相似、示例、象征、任意

    7.6 屏幕复杂性度量

    布局复杂度

    布局统一度
    以“视觉上无序的排列有碍于可用性”这一原理为基础

    用户界面设计原理

    结构原理
    简单性原理
    可见性原理
    反馈原理
    成功的反馈就是以能被对方注意到、读到和正确理解的方式来提供信息
    好的出错信息
    以一个能让用户马上知道问题何在的题头开始
    有针对性和简洁地解释问题究竟是什么
    建议解决问题的方法或操作步骤

    宽容原理
    重用原理

    八、交互设计模型与理论

    8.2 预测模型

    GOMS:是关于人类如何执行认知—动作型任务以及如何与系统交互的理论模型

    Goal-目标:用户要达到什么目的

    Operator-操作

    任务执行的底层行为,不能分解

    为达到目标而使用的认知过程和物理行为

    如点击鼠标

    Method-方法

    如何完成目标的过程,即对应目标的子目标序列和所需操作

    如移动鼠标,输入关键字,点击Go按钮

    Selection-选择规则

    确定当有多种方法时选择和方法

    GOMS认为方法的选择不是随机的

    KLM计算

    Filts定律

    大目标、小距离具有优势

    ​ 对选择任务而言,其移动时间随到目标距离的增加而增加,随目标的大小减小而增加

    屏幕元素应该尽可能多的占据屏幕空间

    最好的像素是光标所处的像素

    屏幕元素应尽可能利用屏幕边缘的优势

    ​ 大菜单,如饼型菜单,比其他类型的菜单使用简单

    策略一:缩短当前位置到目标区域的距离;如右键菜单技术

    策略二:增大目标大小以缩短定位时间

    8.3 动态特性建模

    状态转移网

    三态模型

    8.4 语言模型

    BNF

    8.5 系统模型

    Z标记法

    九、以用户为中心的设计

    9.2 设计思想

    4个重要原则

    及早以用户为中心

    综合设计

    及早并持续性地进行测试

    迭代设计

    用户参与

    焦点小组、问卷调查、民族志观察、走查、专家评估、可用性测试

    9.3 用户参与设计

    重要性、形式、参与式设计

    参与形式

    作为设计组成员、以专题讨论或类似会议的形式参与开发过程、存在大量的用户时的折衷方案

    9.4 理解用户工作

    了解用户

    上下文询问法

    观察并与用户交流会比仅仅观察的效果要好

    强调到用户工作的地方,在用户工作时观察,并和用户讨论他的工作

    也被翻译成“情景调查”

    基于“学徒模型”

    用户是师傅,研究人员是学徒

    与观察法的区别

    用户知道研究人员的存在

    也知道他们是研究的一部分

    4个原则

    上下文环境、伙伴关系、解释、焦点

    十、评估的基础知识

    评估:系统化的数据搜集过程

    10.2 评估目标和原则

    目标:评估系统功能的范围和可达性;评估交互中用户的体验;确定系统的某些特定问题。

    原则:依赖于产品的用户;与设计结合进行;在用户的实际工作任务和操作环境下进行;要选择有广泛代表性的用户

    10.3 评估范性和技术

    范型和技术的区别

    范型:快速评估、可用性测试、实地研究、预测性评估

    技术:观察用户、询问用户意见、询问专家意见、测试用户的执行情况、基于模型和理论。预测界面的有效性

    10.4 评估方法的选择

    哪些影响因素

    10.5 评估步骤

    DECIDE评估框架

    决定评估需要完成的总体目标

    发掘需要回答的具体问题

    选择用于回答具体问题的评估范型和技术

    标识必须解决的实际问题,如测试用户的选择

    决定如何处理有关道德的问题

    评估解释并表示数据

    10.6 小规模试验

    十一、评估之观察用户

    真实环境中的观察和受控环境中的观察

    直接观察

    实验室观察和现场观察

    Robson框架:空间、行为者、活动、物体、举止、事件、目标、感觉

    间接观察

    日志和交互记录

    数据记录

    纸笔、音视频、日志和交互记录

    数据分析

    定性分析、定量分析

    十二、评估之询问用户和专家

    访谈、问卷调查、认知走查、启发式评估

    访谈(开放式、结构化、半结构化、集体)有目的的对话过程。

    指导原则

    避免过长的问题

    避免使用复合句

    避免使用可能让用户感觉尴尬的术语或他们无法理解的语言

    避免使用有诱导性的问题

    尽可能保证问题是中性的

    访谈步骤

    开始、热身、主要访谈、冷却、结束

    问卷调查

    用于搜集统计数据和用户意见的常用方法

    认知走查

    启发式评估

    七项启发式原则

    内容一致性、对话简单性、快捷链接、尽可能减轻用户的记忆负担、预防错误、提示信息、内部控制

    十三、评估之用户测试

    定义目标和问题

    选择参与者

    设计测试任务

    测试步骤

    参与者抵达后使用、协议书、就坐后,解释目的和步骤、执行任务前说明、若参与者忘记说出想法或不知所措时提示用、所有任务完成后,询问参与者对某些问题的看法

    数据搜集与分析

    简答题

    10.简要论述界面设计的一般原则。

    1.一致性:整个界面的控制中要使用一致的机制。

    2.兼容性:新的设计应该基于用户以前的经验,使用用户熟悉的表达。

    3.适应性:用户应该处于控制的地位,界面要适应用户的工作速度、个人特征和技术水平等。

    4.经济性: 尽可能减少用户的工作(包括减少用户记忆),设计操作时尽量以最少的步骤来实现,如提供快捷方式等,以达到高效。

    5.结构性:按照逻辑意义将信息分组,在屏幕上有规律的分布。

    6.指导性而不是控制用户:通过提供状态信息、反馈信息出错信息和帮助来指导用户。

    用户的区别

    偶然型用户:既没有计算机应用领域的专业知识,也缺少计算机系统基本知识的用户。

    生疏型用户:经常使用计算机,对计算机性能及操作使用有一定程度的理解和经验。

    熟练型用户:一般是专业技术人员

    专家型用户:对需要计算机完成的工作任务和计算机系统都很精通的通常是计算机专业用户。

    名词解释

    **人机交互学:**是一门研究人、计算机以及他们之间相互联系的方式(交互)的科学。

    GOMS:是关于人类如何执行认知—动作型任务以及如何与系统交互的理论模型。

    多通道交互:一种使用多种通道与计算机通信的人机交互方式。

    **认知心理学:**关注人的高级心理过程,如记忆、语言、思维、感知和问题解决能力等的心理学。

    格式塔心理学:研究人是如何感知一个良好组织的模式的,而不是将其视为一系列相互独立的部分。

    执行隔阂:用户为达目标而制定的动作与系统允许的动作之间的差别。
    评估隔阂:系统状态的实际表现与用户预期之间的差别。

    可用性工程:以提高产品的可用性为目标的先进的产品开发方法论。

    需求:关于目标产品的一种陈述,它指定了产品应做什么,或者应如何工作。

    隐藏:把不是最重要的组件和信息以某种方式隐藏起来,避免分散用户的注意力。

    评估:系统化的数据搜集过程。

    展开全文
  • 深入理解Java虚拟机-垃圾回收器与内存分配策略

    万次阅读 多人点赞 2020-01-04 13:08:32
    Java与C++之间一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述对象已死吗引用计数可达性分析算法再谈引用生存还是死亡回收方法区垃圾收集算法标记-清除...

    本博客主要参考周志明老师的《深入理解Java虚拟机》第二版

    读书是一种跟大神的交流。阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。

    《深入理解Java虚拟机》全书总结如下:

    序号内容链接地址
    1深入理解Java虚拟机-走近Javahttps://blog.csdn.net/ThinkWon/article/details/103804387
    2深入理解Java虚拟机-Java内存区域与内存溢出异常https://blog.csdn.net/ThinkWon/article/details/103827387
    3深入理解Java虚拟机-垃圾回收器与内存分配策略https://blog.csdn.net/ThinkWon/article/details/103831676
    4深入理解Java虚拟机-虚拟机执行子系统https://blog.csdn.net/ThinkWon/article/details/103835168
    5深入理解Java虚拟机-程序编译与代码优化https://blog.csdn.net/ThinkWon/article/details/103835883
    6深入理解Java虚拟机-高效并发https://blog.csdn.net/ThinkWon/article/details/103836167

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。

    概述

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当作Java语言的伴生产物。事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情:

    • 哪些内存需要回收?
    • 什么时候回收?
    • 如何回收?

    经过半个多世纪的发展,目前内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了"自动化"时代,那为什么我们还要去了解GC和内存分配?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些"自动化"的技术实施必要的监控和调节。

    对象已死吗

    垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的,哪些对象是「存活」的,是不可以被回收的;哪些对象已经「死掉」了,需要被回收。

    引用计数法

    Java 中每个具体对象(不是引用)都有一个引用计数器。当一个对象被创建并初始化赋值后,该变量计数设置为1。每当有一个地方引用它时,计数器值就加1。当引用失效时,即一个对象的某个引用超过了生命周期(出作用域后)或者被设置为一个新值时,计数器值就减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。

    • 优点

      引用计数收集器执行简单,判定效率高,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。

    • 缺点

      难以检测出对象之间的循环引用。同时,引用计数器增加了程序执行的开销。所以Java语言并没有选择这种算法进行垃圾回收。

    可达性分析算法

    可达性分析算法又叫根搜索算法,该算法的基本思想就是通过一系列称为「GC Roots」的对象作为起始点,从这些起始点开始往下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 对象之间没有任何引用链的时候(不可达),证明该对象是不可用的,于是就会被判定为可回收对象。

    如下图所示: Object5Object6Object7 虽然互有关联, 但它们到GC Roots是不可达的, 因此也会被判定为可回收的对象。

    在这里插入图片描述

    在 Java 中可作为 GC Roots 的对象包含以下几种:

    • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
    • 方法区中类静态属性引用的对象;
    • 方法区中常量引用的对象;
    • 本地方法栈中 JNI(Native 方法)引用的对象。

    JVM中用到的所有现代GC算法在回收前都会先找出所有仍存活的对象。可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图。下图展示的JVM中的内存布局可以用来很好地阐释这一概念:

    在这里插入图片描述

    再谈引用

    无论是通过引用计数器还是通过可达性分析来判断对象是否可以被回收都设计到「引用」的概念。在 Java 中,根据引用关系的强弱不一样,将引用类型划为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。

    强引用Object obj = new Object()这种方式就是强引用,只要这种强引用存在,垃圾收集器就永远不会回收被引用的对象。

    软引用:用来描述一些有用但非必须的对象。在 OOM 之前垃圾收集器会把这些被软引用的对象列入回收范围进行二次回收。如果本次回收之后还是内存不足才会触发 OOM。在 Java 中使用 SoftReference 类来实现软引用。

    弱引用:同软引用一样也是用来描述非必须对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在 Java 中使用 WeakReference 类来实现。

    虚引用:是最弱的一种引用关系,一个对象是否有虚引用的存在完全不影响对象的生存时间,也无法通过虚引用来获取一个对象的实例。一个对象使用虚引用的唯一目的是为了在被垃圾收集器回收时收到一个系统通知。在 Java 中使用 PhantomReference 类来实现。

    生存还是死亡

    一个对象是否应该在垃圾回收器在GC时回收,至少要经历两次标记过程

    第一次标记:如果对象在进行可达性分析后被判定为不可达对象,那么它将被第一次标记并且进行一次筛选。筛选的条件是此对象是否有必要执行 finalize() 方法。对象没有覆盖 finalize() 方法或者该对象的 finalize() 方法曾经被虚拟机调用过,则判定为没必要执行。

    finalize()第二次标记:如果被判定为有必要执行 finalize() 方法,那么这个对象会被放置到一个 F-Queue 队列中,并在稍后由虚拟机自动创建的、低优先级的 Finalizer 线程去执行该对象的 finalize() 方法。但是虚拟机并不承诺会等待该方法结束,这样做是因为,如果一个对象的 finalize() 方法比较耗时或者发生了死循环,就可能导致 F-Queue 队列中的其他对象永远处于等待状态,甚至导致整个内存回收系统崩溃。finalize() 方法是对象逃脱死亡命运的最后一次机会,如果对象要在 finalize() 中挽救自己,只要重新与 GC Roots 引用链关联上就可以了。这样在第二次标记时它将被移除「即将回收」的集合,如果对象在这个时候还没有逃脱,那么它基本上就真的被回收了。

    回收方法区

    前面介绍过,方法区在 HotSpot 虚拟机中被划分为永久代。在 Java 虚拟机规范中没有要求方法区实现垃圾收集,而且方法区垃圾收集的性价比也很低。

    方法区(永久代)的垃圾收集主要回收两部分内容:废弃常量和无用的类。

    废弃常量的回收和 Java 堆中对象的回收非常类似,这里就不做过多的解释了。

    类的回收条件就比较苛刻了。要判定一个类是否可以被回收,要满足以下三个条件:

    1. 该类的所有实例已经被回收;
    2. 加载该类的 ClassLoader 已经被回收;
    3. 该类的 Class 对象没有被引用,无法再任何地方通过反射访问该类的方法。

    垃圾收集算法

    标记-清除算法

    标记-清除算法(Mark-Sweep)是一种常见的基础垃圾收集算法,它将垃圾收集分为两个阶段:

    • 标记阶段:标记出可以回收的对象。
    • 清除阶段:回收被标记的对象所占用的空间。

    标记-清除算法之所以是基础的,是因为后面讲到的垃圾收集算法都是在此算法的基础上进行改进的。

    优点:实现简单,不需要对象进行移动。

    缺点:标记、清除过程效率低,产生大量不连续的内存碎片,提高了垃圾回收的频率。

    标记-清除算法的执行的过程如下图所示

    在这里插入图片描述

    复制算法

    为了解决标记-清除算法的效率不高的问题,产生了复制算法。它把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾收集时,遍历当前使用的区域,把存活对象复制到另外一个区域中,最后将当前使用的区域的可回收的对象进行回收。

    优点:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片。

    缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。

    复制算法的执行过程如下图所示

    在这里插入图片描述

    现在的商业虚拟机都采用这种算法来回收新生代,在 IBM 的研究中新生代中的对象 98% 都是「朝生夕死」,所以并不需要按照 1:1 的比例来划分空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor。当回收时,将 Eden 和 Survivor 中还存活的对象一次性复制到另一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 空间。 HotSpot 默认 Eden 和 Survivor 的大小比例是 8:1,也就是每次新生代中可用的内存为整个新生代容量的 90%(80%+10%),只有 10% 会被浪费。当然,98% 的对象可回收只是一般场景下的数据,我们没办法保证每次回收后都只有不多于 10% 的对象存活,当 Survivor 空间不够用时,需要依赖其它内存(这里指老年代)进行分配担保。如果另外一块 Survivor 空间没有足够空间存放上一次新生代收集下来存活的对象时,这些对象将直接通过分配担保机制进入老年代。

    标记-整理算法

    在新生代中可以使用复制算法,但是在老年代就不能选择复制算法了,因为老年代的对象存活率会较高,这样会有较多的复制操作,导致效率变低。标记-清除算法可以应用在老年代中,但是它效率不高,在内存回收后容易产生大量内存碎片。因此就出现了一种标记-整理算法(Mark-Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到内存的一端,使他们紧凑的排列在一起,然后对端边界以外的内存进行回收。回收后,已用和未用的内存都各自一边。

    优点:解决了标记-清理算法存在的内存碎片问题。

    缺点:仍需要进行局部对象移动,一定程度上降低了效率。

    标记-整理算法的执行过程如下图所示

    在这里插入图片描述

    分代收集算法

    当前商业虚拟机都采用分代收集的垃圾收集算法。分代收集算法,顾名思义是根据对象的存活周期将内存划分为几块。一般包括年轻代老年代永久代,如图所示:

    在这里插入图片描述

    新生代(Young generation)

    绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为 minor GC

    新生代 中存在一个Eden区和两个Survivor区。新对象会首先分配在Eden中(如果新对象过大,会直接分配在老年代中)。在GC中,Eden中的对象会被移动到Survivor中,直至对象满足一定的年纪(定义为熬过GC的次数),会被移动到老年代

    可以设置新生代老年代的相对大小。这种方式的优点是新生代大小会随着整个大小动态扩展。参数 -XX:NewRatio 设置老年代新生代的比例。例如 -XX:NewRatio=8 指定 老年代/新生代8/1. 老年代 占堆大小的 7/8新生代 占堆大小的 1/8(默认即是 1/8)。

    例如:

    -XX:NewSize=64m -XX:MaxNewSize=1024m -XX:NewRatio=8
    
    老年代(Old generation)

    对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代少得多。对象从老年代中消失的过程,可以称之为major GC(或者full GC)。

    永久代(permanent generation)

    像一些类的层级信息方法数据方法信息(如字节码变量大小),运行时常量池JDK7之后移出永久代),已确定的符号引用虚方法表等等。它们几乎都是静态的并且很少卸载和回收,在JDK8之前的HotSpot虚拟机中,类的这些**“永久的”** 数据存放在一个叫做永久代的区域。

    永久代一段连续的内存空间,我们在JVM启动之前可以通过设置-XX:MaxPermSize的值来控制永久代的大小。但是JDK8之后取消了永久代,这些元数据被移到了一个与堆不相连的称为元空间 (Metaspace) 的本地内存区域

    小结

    当执行一次Minor Collection时,Eden空间的存活对象会被复制到To Survivor空间,并且之前经过一次Minor Collection并在From Survivor空间存活的仍年轻的对象也会复制到To Survivor空间。
    有两种情况Eden空间和From Survivor空间存活的对象不会复制到To Survivor空间,而是晋升到老年代。一种是存活的对象的分代年龄超过-XX:MaxTenuringThreshold(用于控制对象经历多少次Minor GC才晋升到老年代)所指定的阈值。另一种是To Survivor空间容量达到阈值。
    当所有存活的对象被复制到To Survivor空间,或者晋升到老年代,也就意味着Eden空间和From Survivor空间剩下的都是可回收对象,如下图所示。

    在这里插入图片描述

    这时GC执行Minor Collection,Eden空间和From Survivor空间都会被清空,而存活的对象都存放在To Survivor空间。
    接下来将From Survivor空间和To Survivor空间互换位置,也就是此前的From Survivor空间成为了现在的To Survivor空间,每次Survivor空间互换都要保证To Survivor空间是空的,这就是复制算法在新生代中的应用。在老年代则采用了标记-压缩算法。

    JDK8堆内存一般是划分为年轻代老年代不同年代 根据自身特性采用不同的垃圾收集算法

    对于新生代,每次GC时都有大量的对象死亡,只有少量对象存活。考虑到复制成本低,适合采用复制算法。因此有了From SurvivorTo Survivor区域。

    对于老年代,因为对象存活率高,没有额外的内存空间对它进行担保。因而适合采用标记-清理算法标记-整理算法进行回收。

    由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。垃圾回收有两种类型,Minor GC 和 Full GC。

    • Minor GC:新生代垃圾收集。对新生代进行回收,不会影响到年老代。因为新生代的 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般在这里使用速度快、效率高的算法,使垃圾回收能尽快完成。
    • Full GC:也叫 Major GC,对整个堆进行回收,包括新生代和老年代(JDK8 取消永久代)。由于Full GC需要对整个堆进行回收,所以比Minor GC要慢,因此应该尽可能减少Full GC的次数。它的收集频率较低,耗时较长。

    垃圾收集算法小结

    在这里插入图片描述

    HotSpot的算法实现

    枚举根节点

    • 可达性分析枚举GC Roots时 ,必须stop the world
    • 目前JVM使用准确式GC,停顿时并不需要一个个检查,而是从预先存放的地方直接取。(HotSpot保存在OopMap数据结构中)

    安全点

    • 基于效率考虑,生成OopMap只会才特定的地方,称为安全点
    • 安全点的选定方法
      • 抢先式中断:现代JVM不采用
      • 主动式中断:线程轮询安全点标识,然后挂起

    安全区域

    • 对于没有分配cpu的线程(sleep),安全点无法处理,由安全区域解决
    • 安全区域指一段代码中引用关系不会发生变化
    • 线程进入安全区域时,JVM发起GC就不用管这些线程,离开时需要检查GC是否完成,未完成就需要等待

    垃圾收集器

    如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器。不同收集器之间的连线表示它们可以搭配使用。

    在这里插入图片描述

    • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;
    • ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;
    • Parallel Scavenge收集器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;
    • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;
    • Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;
    • CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
    • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

    附加:以下为垃圾回收器的详细说明,可以选择性阅读

    垃圾回收器分类标准

    在这里插入图片描述

    七种垃圾回收器概述

    JVM 中,具体实现有 SerialParNewParallel ScavengeCMSSerial Old(MSC)Parallel OldG1 等。在下图中,你可以看到 不同垃圾回收器 适合于 不同的内存区域,如果两个垃圾回收器之间 存在连线,那么表示两者可以 配合使用

    如果当 垃圾回收器 进行垃圾清理时,必须 暂停 其他所有的 工作线程,直到它完全收集结束。我们称这种需要暂停工作线程才能进行清理的策略为 Stop-the-World。以上回收器中, SerialParNewParallel ScavengeSerial OldParallel Old 均采用的是 Stop-the-World 的策略。

    在这里插入图片描述

    图中有 7 种不同的 垃圾回收器,它们分别用于不同分代的垃圾回收。

    • 新生代回收器:Serial、ParNew、Parallel Scavenge
    • 老年代回收器:Serial Old、Parallel Old、CMS
    • 整堆回收器:G1

    两个 垃圾回收器 之间有连线表示它们可以 搭配使用,可选的搭配方案如下:

    新生代老年代
    SerialSerial Old
    SerialCMS
    ParNewSerial Old
    ParNewCMS
    Parallel ScavengeSerial Old
    Parallel ScavengeParallel Old
    G1G1

    单线程垃圾回收器

    Serial(-XX:+UseSerialGC)

    Serial 回收器是最基本的 新生代 垃圾回收器,是 单线程 的垃圾回收器。由于垃圾清理时,Serial 回收器 不存在 线程间的切换,因此,特别是在单 CPU 的环境下,它的 垃圾清除效率 比较高。对于 Client 运行模式的程序,选择 Serial 回收器是一个不错的选择。

    Serial 新生代回收器 采用的是 复制算法

    Serial Old(-XX:+UseSerialGC)

    Serial Old 回收器是 Serial 回收器的 老生代版本,属于 单线程回收器,它使用 标记-整理 算法。对于 Server 模式下的虚拟机,在 JDK1.5 及其以前,它常与 Parallel Scavenge 回收器配合使用,达到较好的 吞吐量,另外它也是 CMS 回收器在 Concurrent Mode Failure 时的 后备方案

    Serial 回收器和 Serial Old 回收器的执行效果如下:

    在这里插入图片描述

    Serial Old 老年代回收器 采用的是 标记 - 整理算法

    多线程垃圾回收器(吞吐量优先)

    ParNew(-XX:+UseParNewGC)

    ParNew 回收器是在 Serial 回收器的基础上演化而来的,属于 Serial 回收器的 多线程版本,同样运行在 新生代区域。在实现上,两者共用很多代码。在不同运行环境下,根据 CPU 核数,开启 不同的线程数,从而达到 最优 的垃圾回收效果。对于那些 Server 模式的应用程序,如果考虑采用 CMS 作为 老生代回收器 时,ParNew 回收器是一个不错的选择。

    在这里插入图片描述

    ParNew 新生代回收器 采用的是 复制算法

    Parallel Scavenge(-XX:+UseParallelGC)

    ParNew 回收一样,Parallel Scavenge 回收器也是运行在 新生代区域,属于 多线程 的回收器。但不同的是,ParNew 回收器是通过控制 垃圾回收线程数 来进行参数调整,而 Parallel Scavenge 回收器更关心的是 程序运行的吞吐量。即一段时间内,用户代码 运行时间占 总运行时间 的百分比。

    Parallel Scavenge 新生代回收器 采用的是 复制算法

    Parallel Old(-XX:+UseParallelOldGC)

    Parallel Old 回收器是 Parallel Scavenge 回收器的 老生代版本,属于 多线程回收器,采用 标记-整理算法Parallel Old 回收器和 Parallel Scavenge 回收器同样考虑了 吞吐量优先 这一指标,非常适合那些 注重吞吐量CPU 资源敏感 的场合。

    在这里插入图片描述

    Parallel Old 老年代回收器 采用的是 标记 - 整理算法

    其他的回收器(停顿时间优先)

    CMS(-XX:+UseConcMarkSweepGC)

    CMS(Concurrent Mark Sweep) 回收器是在 最短回收停顿时间 为前提的回收器,属于 多线程回收器,采用 标记-清除算法

    在这里插入图片描述

    相比之前的回收器,CMS 回收器的运作过程比较复杂,分为四步:

    1. 初始标记(CMS initial mark)

    初始标记 仅仅是标记 GC Roots直接关联 的对象。这个阶段 速度很快,需要 Stop the World

    1. 并发标记(CMS concurrent mark)

    并发标记 进行的是 GC Tracing,从 GC Roots 开始对堆进行 可达性分析,找出 存活对象

    1. 重新标记(CMS remark)

    重新标记 阶段为了 修正 并发期间由于 用户进行运作 导致的 标记变动 的那一部分对象的 标记记录。这个阶段的 停顿时间 一般会比 初始标记阶段 稍长一些,但远比 并发标记 的时间短,也需要 Stop The World

    1. 并发清除(CMS concurrent sweep)

    并发清除 阶段会清除垃圾对象。

    初始标记CMS initial mark)和 重新标记CMS remark)会导致 用户线程 卡顿,Stop the World 现象发生。

    在整个过程中,CMS 回收器的 内存回收 基本上和 用户线程 并发执行,如下所示:

    由于 CMS 回收器 并发收集停顿低,因此有些地方成为 并发低停顿回收器Concurrent Low Pause Sweep Collector)。

    CMS 回收器的缺点:

    1. CMS回收器对CPU资源非常依赖

    CMS 回收器过分依赖于 多线程环境,默认情况下,开启的 线程数(CPU 的数量 + 3)/ 4,当 CPU 数量少于 4 个时,CMS用户查询 的影响将会很大,因为他们要分出一半的运算能力去 执行回收器线程

    1. CMS回收器无法清除浮动垃圾

    由于 CMS 回收器 清除已标记的垃圾 (处于最后一个阶段)时,用户线程 还在运行,因此会有新的垃圾产生。但是这部分垃圾 未被标记,在下一次 GC 才能清除,因此被成为 浮动垃圾

    由于 内存回收用户线程 是同时进行的,内存在被 回收 的同时,也在被 分配。当 老生代 中的内存使用超过一定的比例时,系统将会进行 垃圾回收;当 剩余内存 不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时采用 Serial Old 算法进行 清除,此时的 性能 将会降低。

    1. 垃圾收集结束后残余大量空间碎片

    CMS 回收器采用的 标记清除算法,本身存在垃圾收集结束后残余 大量空间碎片 的缺点。CMS 配合适当的 内存整理策略,在一定程度上可以解决这个问题。

    G1回收器(垃圾区域Region优先)

    G1JDK 1.7 中正式投入使用的用于取代 CMS压缩回收器。它虽然没有在物理上隔断 新生代老生代,但是仍然属于 分代垃圾回收器G1 仍然会区分 年轻代老年代,年轻代依然分有 Eden 区与 Survivor 区。

    G1 首先将 分为 大小相等Region,避免 全区域 的垃圾回收。然后追踪每个 Region 垃圾 堆积的价值大小,在后台维护一个 优先列表,根据允许的回收时间优先回收价值最大的 Region。同时 G1采用 Remembered Set 来存放 Region 之间的 对象引用 ,其他回收器中的 新生代老年代 之间的对象引用,从而避免 全堆扫描G1 的分区示例如下图所示:

    在这里插入图片描述

    这种使用 Region 划分 内存空间 以及有 优先级 的区域回收方式,保证 G1 回收器在有限的时间内可以获得尽可能 高的回收效率

    G1CMS 运作过程有很多相似之处,整个过程也分为 4 个步骤:

    1.初始标记(CMS initial mark)

    初始标记 仅仅是标记 GC Roots直接关联 的对象。这个阶段 速度很快,需要 Stop the World

    2.并发标记(CMS concurrent mark)

    并发标记 进行的是 GC Tracing,从 GC Roots 开始对堆进行 可达性分析,找出 存活对象

    3.重新标记(CMS remark)

    重新标记 阶段为了 修正 并发期间由于 用户进行运作 导致的 标记变动 的那一部分对象的 标记记录。这个阶段的 停顿时间 一般会比 初始标记阶段 稍长一些,但远比 并发标记 的时间短,也需要 Stop The World

    4.筛选回收

    首先对各个 Region回收价值成本 进行排序,根据用户所期望的 GC 停顿时间 来制定回收计划。这个阶段可以与用户程序一起 并发执行,但是因为只回收一部分 Region,时间是用户可控制的,而且停顿 用户线程 将大幅提高回收效率。

    在这里插入图片描述

    与其它 GC 回收相比,G1 具备如下 4 个特点:

    • 并行与并发

    使用多个 CPU 来缩短 Stop-the-World停顿时间,部分其他回收器需要停顿 Java 线程执行的 GC 动作,G1 回收器仍然可以通过 并发的方式Java 程序继续执行。

    • 分代回收

    与其他回收器一样,分代概念G1 中依然得以保留。虽然 G1 可以不需要 其他回收器配合 就能独立管理 整个GC堆,但它能够采用 不同的策略 去处理 新创建的对象已经存活 一段时间、熬过多次 GC 的旧对象,以获取更好的回收效果。新生代老年代 不再是 物理隔离,是多个 大小相等 的独立 Region

    • 空间整合

    CMS标记—清理 算法不同,G1整体 来看是基于 标记—整理 算法实现的回收器。从 局部(两个 Region 之间)上来看是基于 复制算法 实现的。

    但无论如何,这 两种算法 都意味着 G1 运作期间 不会产生内存空间碎片,回收后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象 时不会因为无法找到 连续内存空间 而提前触发 下一次 GC

    • 可预测的停顿

    这是 G1 相对于 CMS 的另一大优势,降低停顿时间G1CMS 共同的关注点。G1 除了追求 低停顿 外,还能建立 可预测停顿时间模型,能让使用者明确指定在一个 长度M 毫秒的 时间片段 内,消耗在 垃圾回收 上的时间不得超过 N 毫秒。(后台维护的 优先列表,优先回收 价值大Region)。

    内存分配与回收策略

    所谓自动内存管理,最终要解决的也就是内存分配和内存回收两个问题。前面我们介绍了内存回收,这里我们再来聊聊内存分配。

    对象的内存分配通常是在 Java 堆上分配(随着虚拟机优化技术的诞生,某些场景下也会在栈上分配,后面会详细介绍),对象主要分配在新生代的 Eden 区,如果启动了本地线程缓冲,将按照线程优先在 TLAB 上分配。少数情况下也会直接在老年代上分配。总的来说分配规则不是百分百固定的,其细节取决于哪一种垃圾收集器组合以及虚拟机相关参数有关,但是虚拟机对于内存的分配还是会遵循以下几种「普世」规则:

    对象优先在 Eden 区分配

    多数情况,对象都在新生代 Eden 区分配。当 Eden 区分配没有足够的空间进行分配时,虚拟机将会发起一次 Minor GC。如果本次 GC 后还是没有足够的空间,则将启用分配担保机制在老年代中分配内存。

    这里我们提到 Minor GC,如果你仔细观察过 GC 日常,通常我们还能从日志中发现 Major GC/Full GC。

    • Minor GC 是指发生在新生代的 GC,因为 Java 对象大多都是朝生夕死,所有 Minor GC 非常频繁,一般回收速度也非常快;
    • Major GC/Full GC 是指发生在老年代的 GC,出现了 Major GC 通常会伴随至少一次 Minor GC。Major GC 的速度通常会比 Minor GC 慢 10 倍以上。

    大对象直接进入老年代

    所谓大对象是指需要大量连续内存空间的对象,频繁出现大对象是致命的,会导致在内存还有不少空间的情况下提前触发 GC 以获取足够的连续空间来安置新对象。

    前面我们介绍过新生代使用的是标记-清除算法来处理垃圾回收的,如果大对象直接在新生代分配就会导致 Eden 区和两个 Survivor 区之间发生大量的内存复制。因此对于大对象都会直接在老年代进行分配。

    长期存活对象将进入老年代

    虚拟机采用分代收集的思想来管理内存,那么内存回收时就必须判断哪些对象应该放在新生代,哪些对象应该放在老年代。因此虚拟机给每个对象定义了一个对象年龄的计数器,如果对象在 Eden 区出生,并且能够被 Survivor 容纳,将被移动到 Survivor 空间中,这时设置对象年龄为 1。对象在 Survivor 区中每「熬过」一次 Minor GC 年龄就加 1,当年龄达到一定程度(默认 15) 就会被晋升到老年代。

    动态对象年龄判定

    为了更好的适应不同程序的内存情况,虚拟机并不是永远要求对象的年龄必需达到某个固定的值(比如前面说的 15)才会被晋升到老年代,而是会去动态的判断对象年龄。如果在 Survivor 区中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于等于该年龄的对象就可以直接进入老年代。

    空间分配担保

    在新生代触发 Minor GC 后,如果 Survivor 中任然有大量的对象存活就需要老年队来进行分配担保,让 Survivor 区中无法容纳的对象直接进入到老年代。

    本章小结

    本章介绍了垃圾收集的算法,几款JDK1.7中提供的垃圾收集器特点以及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。

    内存回收与垃圾收集器在很多时候都是影响系统性能,并发能力的主要因素之一,虚拟机之所以提供多种不同的收集器以及提供大量的调节参数,是因为只有根据实际应用需求、实现方式选择最优的收集方式才能获取最高的性能。

    展开全文
  • 人机交互学:是一门研究人、计算机以及他们之间相互联系的方式(交互)的科学。 交互:人与计算机之间的直接或间接的通讯 人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易...

    欢迎访问我的个人博客shawnluo.com  !

    一、人机交互基础知识
    人机交互学:是一门研究人、计算机以及他们之间相互联系的方式(交互)的科学。
    交互:人与计算机之间的直接或间接的通讯
    人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易使用。

    为什么学习人机交互?
    从市场角度:用户容忍度降低
    从企业角度:提高生产效率,降低成本
    从个人角度:提高可用性,获取用户主观满意度
    从人性角度:容忍用户出错

    什么是好的交互设计?
    不存在危害的系统,高效且无差错
    日常系统,易学习,不易出错,用户满意
    最好的界面是用户感觉不到界面
    界面设计满足不同用户的身心需求

    交互框架作用:
    提供理解或定义某种事物的一种结构
    能够帮助人们结构化设计过程
    认识设计过程中的主要问题
    还有助于定义问题所涉及的领域 

    执行/评估活动周期 EEC:
    1、最有影响力的框架
    2、定义了活动的四个组成部分
        目标(Goal) ≠意图(Intention)
        执行(Execution) 
        客观因素(World) 
        评估(Evaluation) 

    EEC模型可解释为什么有些界面的使用存在问题
    执行隔阂:用户为达目标而制定的动作与系统允许的动作之间的差别
    评估隔阂:系统状态的实际表现与用户预期之间的差别


    EEC模型不能描述人与系统通过界面进行的通信 
    四个构成部分+四个步骤(翻译过程)
    系统:内核语言
    用户:任务语言
    输入:输入语言
    输出:输出语言

    1、命令行交互
    优点
    专家用户能够快速完成任务;
    较GUI节约系统资源;
    可动态配置可操作选项;
    键盘操作较鼠标操作更加精确;
    支持用户自定义命令 

    缺点
    命令语言的掌握对用户的记忆能力提出较高要求;
    基于回忆的方式(recall memory)
        没有GUI基于识别的方式(recognition memory)容易使用
    键盘操作,出错频率较高;
    要求用户记忆指令的表示方式 
        与可用性理论所强调的“不应要求用户了解计算机底层的实现细节”相违背。

    2、菜单驱动界面
    优点
    基于识别机制,对记忆的需求较低;
    具有自解释性;
    容易纠错;
    适合新手用户。若提供了较好的快捷键功能,则对于专家用户同样适用。
    缺点
    导航方式不够灵活;
    当菜单规模较大时,导航效率不高;
    占用屏幕空间,不适合小型显示设备。
        为节省空间,通常组织为下拉菜单或弹出式菜单;
    对专家用户而言使用效率不高

    3、基于表格的界面
    优点
    简化数据输入;
    只需识别无需学习;
    特别适合于日常文书处理等需要键入大量数据的工作 
    缺点
    占用大量屏幕空间;
    导致业务流程较形式

    4、直接操纵
    自由阶段——指用户执行操作前的屏幕视图;
    捕获阶段——在用户动作(点击、点击拖拽等)执行过程中屏幕的显示情况;
    终止阶段——用户动作执行后屏幕的显示情况。 

    优点
    将任务概念可视化,用户可以非常方便地辨别他们;
    容易学习,适合新手用户;
    基于识别,对记忆的要求不高,可减少错误发生;
    支持空间线索,鼓励用户对界面进行探索;
    可实现对用户操作的快速反馈,具有较高的用户主观满意度。
    缺点
    实现起来比较困难;
    对专家用户而言效率不高;
    不适合小屏幕显示设备;
    对图形显示性能的需求较高;
    不具备自解释性,可能误导用户 

    5、问答界面
    优点
    对记忆的要求较低;
    每个界面具有自解释性;
    将任务流程以简单的线性表示;
    适合新手用户。
    缺点
    要求从用户端获得有效输入;
    要求用户熟悉界面控制;
    纠错过程可能比较乏味。

    6、隐喻界面
    优点
    直观生动
    无需学习 
    局限性
    不具有可扩展性,大量实体时效率低下
    不同用户对同一事物可能产生不同的联想
    紧紧地将我们的理念和物理世界束缚在一起
    寻找恰当的隐喻可能存在困难

    7、自然语言交互
    8、3D虚拟环境导航
    9、笔交互
    10、触摸屏
    11、多通道用户界面

    信息处理模型

    作用:研究人对外界信息的接收、存储、集成、检索和使用,可预测人执行特定任务的效率,
    没有考虑到注意和记忆的重要性 

    扩展的信息处理机模型 


    人类处理机模型
    包含三个交互式组件:
    感知处理器 :信息将被输出到声音存储和视觉存储区域 
    认知处理器 :输入将被输出到工作记忆 
    动作处理器:执行动作

    存在的问题
    把认知过程描述为一系列处理步骤 
    仅关注单个人和单个任务的执行过程,忽视了复杂操作执行中人与人之间及任务与任务之间的互动 
    忽视了环境和其他人可能带来的影响

    格式塔(Gestalt)心理学 
    相近性原则、相似性原则、连续性原则、完整性和闭合性原则 

    人的认知特性
    三个阶段
        感觉记忆
        短时记忆
        长时记忆
    三个阶段之间可以进行信息交换 

    二、交互设计目标与原则  
    设计目标
        可用性目标
        用户体验目标
    简易可用性工程
        可用性属性的度量
        四项关键技术
    设计原则
        一般原则
        黄金规则
        启发式规则


    可用性目标
        (1)易学性(最基本的可用性属性)
        (2)高效率
        (3)易记性
            易记性的影响因素
            位置:将特定对象放在固定位置 
            分组:对事物按照逻辑进行恰当的分组 
            惯例:尽可能使用通用的对象或符号 
            冗余:使用多个感知通道对信息进行编码 
        (4)少出错
            措施
            保证导致灾难性后果错误的发生频率降到最低 
            保证错误发生后迅速恢复到正常状态 
        (5)主观满意度
            观念的转变
                传统软件质量观
                    侧重内部效率和可靠性
                    如程序代码运行时的效率以及灵活性、可维护性 
                人机交互软件质量观
                    转向用户视角

    可用性度量
        常用方法
            选择一些能够代表目标用户群体的测试用户
            让这些用户使用系统执行一组预定的任务
            比较任务的执行情况
            针对多维属性
                取每个可用性属性的平均值
                查看整体分布情况 
        (1)易学性度量
            可用性属性中最容易度量的属性
            找一些从未使用过系统的用户
                能够代表系统的目标用户 
                区分没有任何计算机使用经验的新手用户和具有一般计算机使用经验的用户  
            统计他们学习使用系统直至达到某种熟练程度的时间
        (2)使用效率度量
        (3)易记性度量
        (4)错误率度量
        (5)满意度度量
            不论采用什么样的评价尺度,都应当在大规模测试前进行小规模试点测试  
            
    可用性工程
        以提高产品的可用性为目标的先进的产品开发方法论
        
        完整的可用性工程过程
            了解用户
            竞争性分析
            设定可用性目标
            用户参与的设计
            迭代设计
            产品发布后的工作
        简化
            用户和任务观察
            场景(scenario)
            简化的边做边说(thinking aloud)
            启发式评估 

    交互设计原则
        基本规则
            可学习性
            新用户能用它开始有效的交互并能获得最大的性能
            灵活性
            用户和系统能以多种方式交换信息
            健壮性
            在决定成就和目标评估方面对用户提供的支持程度  

    八条黄金规则
            1. 尽可能保证一致
            2. 符合普遍可用性
            3. 提供信息丰富的反馈
            4. 设计说明对话框以生成结束信息
            5. 预防并处理错误
            6. 让操作容易撤销
            7. 支持内部控制点
            8. 减轻短时记忆负担
            
    十项启发式规则
            系统状态的可见度
            系统和现实世界的吻合
            用户享有控制权和自主权
            一致性和标准化
            避免出错
            依赖识别而非记忆
            使用的灵活性和高效性
            审美感和最小化设计
            帮助用户识别、诊断和恢复错误
            帮助和文档


    三、交互设计过程
    交互设计的基本活动
        标识用户需要并建立需求
        开发满足需求的候选设计方案
        构建设计的交互式版本
        评估设计
    三个关键特征
        以用户为中心
        稳定的可用性标准
        迭代
    设计过程中的问题
        如何选取用户
        如何明确需求
        如何提出候选方案
        如何在候选方案中进行选择
    交互设计生命周期
        星型模型
        可用性工程模型
    交互设计过程管理
        LUCID

    基本活动
    (1)标识用户需要并建立需求
        了解谁是目标用户,交互式产品应提供哪些支持
        这个活动是最基本的
    (2)开发满足需求的候选设计方案
        交互设计的核心活动
            可进一步划分为概念设计和物理设计
    (3)构建设计的交互式版本
        不必是可运行的软件
    (4)评估设计
        评估设计的可用性和可接受性
            用到各种评估标准


    三个关键特征
    以用户为中心
        以用户为中心是交互设计的核心观点
        提供让用户参与评估和提出反馈的机会
    稳定的可用性标准
        项目之初就必须标识特定的可用性和用户体验目标
    迭代
        用户和设计人员都参与设计和讨论需求
        各个活动相互启发,并重复进行
        
    设计过程
    1、选取用户
    2、明确需求
    3、提出候选设计方案
    4、选择设计方案
        决策分为两类:
            第一类:关于可见、可测量的外部特征,例:检索数据库网页的响应时间
            第二类:关于不可见、不可测量的内部特征,例:数据库内部存取机制
        注意力集中在可见、可测量的外部行为上

    交互系统生命周期
    一个交互式系统的所有需求在开始时是无法确定的。
    传统的生命周期模型不适用
    1、星型生命周期模型
        以“评估”为核心
        没有活动次序
        任何两个活动可以相互切换
        可以从任一活动开始

    2、可用性工程生命周期模型
    三个基本任务:
        需求分析
        设计/测试/开发
        安装
        
    交互设计过程管理
        LUCID(合理的以用户为中心的交互设计)
        六个阶段:
            预想
            发现
            设计基础
            设计细节
            构建
            发布
            

    四、交互需求定义

    用户是不同的
    产品是不同的
    人物角色的构建
    场景剧本的构造
    需求获取和分析
        层次化任务分析
    原型

    需求获取是项目设计的第一个阶段

    需求活动
        搜集数据
        解释数据
        提取需求

    产品特性
        功能不同
        物理条件不同
        使用环境不同

    用户特性
        用户差异
            (1)体验水平差异
            设计目标
                让新手快速和无痛苦地成为中间用户
                避免为想成为专家的用户设置障碍
                让中间用户感到愉快
                    因为他们的技能将稳定地处于中间层 
                
            
            (1)新手用户
            特点
                敏感,且很容易在开始有挫折感 
            设计要求
                不能将新手状态视为目标
                让学习过程快速且富有针对性 
                确保程序充分反映了用户关于任务的心智模型 
                无论什么样的帮助,都不应该在界面中固定
                具有向导功能的对话框帮助较好
                    不要使用在线帮助作为学习指导
                    使用单个的指南工具(一般显示在对话框中)
                菜单项应该是解释性的
            
            (2)专家用户
            特点
                对缺少经验的用户有着异乎寻常的影响
                    “专家说不好就不好”
                欣赏更新的且更强大功能 
                不会受到复杂性增加的干扰
            设计要求
                对经常使用的工具集,要能快速访问 
            
            (3)中间用户
            特点
                需要工具,但不需要解释,而需要提示
                知道如何使用参考资料,在线帮助 
                能够区分经常使用和很少使用的功能 
                高级功能的存在让永久的中间用户放心 
            设计要求
                工具提示(Tooltip)是适合中间用户最好的习惯用法 
                在线帮助是永久中间用户的极佳工具 
                常用功能中的工具放在用户界面的前端和中心位置 
                提供一些额外的高级特性 
            
            (2)年龄差异
            (3)文化差异
            (4)健康差异
            
    用户建模
        人物角色
        作用:
        确定产品应该做什么及应有的行为
        与利益相关者、开发者和其他设计者交流
        在设计中达成意见一致和承诺
        衡量设计的效率
        促进产品其他方面的相关工作,如市场推广和营销计划。
        解决产品开发过程中出现的3个设计问题 :
        弹性用户
        自参考设计
        边缘情况统计
        
        建模过程:
        拼凑:采用头脑风暴的方法,产生一些零碎概念或模型的片段,先不去考虑他们的细节。
        组织:将这些片段按照所构造模型的需要进行分组和分类,归并或删除那些冗余重叠的东西
        细节:建立和完善相应细节,补充遗漏的数据
        求精:对模型进行推敲,以便改进和完善
        以上过程循环反复

    需求获取:
        观察:
            直接观察
            间接观察
        场景:
            场景是表示任务和工作结构的“非正式的叙述性描述“
            场景的来源:场景说明通常来自专题讨论或者访谈,目的是解释或讨论有关用户目标的一些问题
        
        
        任务分析
            层次化任务分析(HTA)是应用最广的任务分析技术 
            
            
            
            
            任务分析的用途:
            手册和教学(现有系统)
            需求获取和系统设计(新系统)
                任务分析本身不是需求获取,但有助于需求的完整表达
            详细的接口设计(新系统)
                应用于菜单设计
            
    需求验证:
    一般的需求验证技术:
        需求评审
        测试用例
    交互系统的验证技术:
        原型
            原型分类:
            低保真原型(丢弃型)
                与最终产品不太相似的原型 
                使用与最终产品不同的材料,如纸张、纸板 
                    如PalmPilot掌上电脑的木雕原型 
                优点是简单、便宜、易于制作和修改
            高保真原型(进化型) 
                与最终产品更为接近,使用相同的材料 
                    如使用Visual Basic开发的软件系统原型
                风险
                    用户会认为原型就是系统 
                    开发人员可能认为已找到了一个用户满意的设计 
        

    五、交互式系统的设计
    过早地把重点放在小细节、小部件和精细的交互上会妨碍产品的设计

    设计框架
        定义高层次上的屏幕布局
        定义产品的工作流、行为和组织 
        
        步骤:
        1、定义外形因素和输入方法
        2、定义功能和数据元素
        3、决定功能组合层次
        4、勾画大致的设计框架
        5、构建关键情景场景剧本
        6、通过验证性的场景剧本来检查设计

    简化设计的四种策略:
        转移
        删除
            方法:功能融合、删除视觉混乱、删减文字、不要删减过多
        组织
        隐藏

        删除不必要的
        组织要提供的
        隐藏非核心的

    设计中的折衷
        个性化和配置
        本地化和国际化
        审美学与实用性
        
    软件设计的细节
        加快系统的响应时间
        减轻用户的记忆负担
        减少用户的等待感
            以某种形式的反馈让用户了解操作进行的进度和状态 
                如进度对话框
            以渐进方式向用户呈现处理结果 
                分成多个连续的部分来顺序地把结果提供给用户 
                先传输全局概括,再传输细节
            给用户分配任务,分散用户的注意力(安装软件) 
            减低用户的期望值(本次安装大约需要3分钟) 
        设计好的出错信息
            四个简单原则 
                使用清晰的语言来表达,而不要使用难懂的代码 
                使用的语言应当精炼准确,而不是空泛而模糊的 
                对用户解决问题提供建设性的帮助 
                出错信息应当友好,不要威胁或责备用户 

    交互设计模式
    模式在HCI中的应用还处于起步阶段 
    定位模式、结构模式、行为模式
    模式不是拿来即用的商品,每一次模式的运用都有所不同

    物理结构:
        三种不同的物理结构:
            多窗口
                当用户想要自定义屏幕布局的复杂应用时
                缺点:窗口太多,用户找不到想要的窗口
            单一窗口分页
                简单Web应用最适合
                优点:有效组织空间,是小型手持设备和手机的首选
            平铺窗口
                优点:可看到许多内容而不必管理窗口
                缺点:占据大量屏幕空间
        如何选择:用户是关键
        

    六、可视化设计

    窗口和菜单 
    对话框 
    常用控件 
    工具栏 
    屏幕复杂性度量 
    用户界面设计原理 

    1、窗口
        (1)状态:
            最大化
            最小化
            还原
                平铺(Tile)窗口:允许拖放操作
                重叠(Overlapping)窗口:有效利用屏幕空间
                层叠(Cascade )窗口:可视化组织各窗口
        (2)窗口界面类型
            多文档界面
                优点
                    节省系统资源
                    最小的可视集
                    协同工作区
                    多文档同时可视化
                缺点
                    菜单随活动文档窗口状态变化,导致不一致性
                    文档窗口必须在主窗口内部,减弱多文档显示优势
                    屏幕显示复杂:子窗口可能在父窗口中被最小化
                
            单文档界面
                优点
                    从用户角度出发,以文档为中心
                    界面的视觉复杂性小
                缺点
                    不能管理分散但相关的文档窗口
                    相关文档不能从相同类型的其他文档中分离
                    文档打开过多时,任务栏可能被占满
            标签文档界面
                窗口菜单:包含了当前打开窗口的列表
                
                优点:让用户看到哪些窗口是打开的
                缺点:不允许用户看到两个及以上的窗口内容
            
    2、菜单
        访问系统功能的工具,已经成为窗口环境的标准特征
        必不可少的组成部分
            菜单标题
            菜单选项
            最重要的特性:描述性、一致性
        注意事项:
            菜单应该按语义及任务结构来组织 
            合理组织菜单接口的结构与层次 
            菜单及菜单项的名字应符合日常命名习惯
            菜单选项列表即可以是有序的也可以是无序的 
            为菜单项提供多种的选择途径 
            增加菜单系统的可浏览性和可预期性
            对菜单选择和点取设定反馈标记 
            
    3、对话框
            典型的辅助性窗口
            
            分类:
                模态对话框、非模态对话框
            按用途分类:
                属性对话框、功能对话框、进度对话框(耗费的时间的进度)、公告对话框(阻塞型对话框(错误、警告、确认)、临时对话框)、标签对话框、扩展对话框、级联对话框
            
            
            消除错误信息
                用更健壮的软件取代错误消息
                    消除用户犯错误的可能性
                    为所有的数据输入使用有界控件
                为用户提供正面反馈
                    软件的负面反馈对用户而言是一种侮辱
                最后一招:改进错误消息框
                    保证始终有礼貌、具有启发性、还要助人为乐
                    澄清问题的范围
                    可选择的方法
                    默认情况程序会做什么
                    丢失了哪些信息
            消除确认对话框
                原则1:做,不要问
                    设计软件时,勇往直前给它确信的力量
                原则2:让所有操作都可以撤销
                    删除或覆盖文件时可将文件移动到暂时目录,待一段时间或物理删除后再删除
                原则3:提供非模态反馈帮助用户避免犯错误
                    如文档页面应显示真实可打印区域的向导,以避免打印文档超出可用的打印区域
                    
            
            对话框设计原则
                (1)把主要的交互操作放在主窗口中
                    对话框适合主交互流之外的功能
                (2)视觉上区分模态与非模态对话框
                    为非模态对话框提供一致的终止命令
                (3)不要用临时对话框作为错误信息框或确认信息框
                    保证用户能够阅读
                (4)不要堆叠标签
                
                
    4、控件
        (1)命令控件
        (2)选择控件(复选框、列表框、下拉列表)
        (3)显示控件
            滚动条
                适合用于窗口内容和文本导航器
                包含的信息
                    当前可见文档的百分比
                    总共有多少页
                    拖动滑块时,显示页数
                    拖动滑块时,显示每一页的第一个句子
                    跳到文档开始和末尾的按钮
        (4)输入控件(有界)

    5、工具栏
        工具栏上的图标与文本
        不同时显示,因为屏幕空间宝贵,
        工具提示
        
        
        图标的4种表示方法
            相似、示例、象征、任意

    6、屏幕复杂性度量
        布局复杂度
        
        
        布局统一度
            以“视觉上无序的排列有碍于可用性”这一原理为基础 
            
            
            
    7、用户界面设计原理
        结构原理
        简单性原理
        可见性原理
        反馈原理
            成功的反馈就是以能被对方注意到、读到和正确理解的方式来提供信息  
            
            好的出错信息 
                以一个能让用户马上知道问题何在的题头开始 
                有针对性和简洁地解释问题究竟是什么 
                建议解决问题的方法或操作步骤 
        
        宽容原理
        重用原理
        
    七、交互设计模型与理论
    预测模型
        GOMS
            KLM
        Fitts
    动态特性建模
        状态转移网
        三态模型
    语言模型
        BNF
    系统模型
        Z标记法


    计算用户完成任务的时间:KLM
    描述交互过程中系统状态的变化:动态转移网
    探讨任务的执行方法等:GOMS

    1、预测模型
        能够预测用户的执行情况,但不需要对用户做实际测试
        (1)GMOS
            采用“分而治之”的思想,将一个任务进行多层次的细化
            把每个操作的时间相加就可以得到一项任务的时间 

            ①Goal-目标
                用户要达到什么目的
            ②Operator-操作(Operator:是任务分析到最低层时的行为,是用户为了完成任务所必须执行的基本动作)
                任务执行的底层行为,不能分解
                    为达到目标而使用的认知过程和物理行为
                
                操作种类
                    外部操作
                        用户与系统之间可观测的物理操作
                    心理操作
                        用户内部行为
                        不可观测
                        如假想、猜测等
                操作时间是上下文无关的
                
            ③Method-方法 
                如何完成目标的过程,即对应目标的子目标序列和所需操作
                如移动鼠标,输入关键字,点击Go按钮
            ④Selection-选择规则
                确定当有多种方法时选择和方法
                GOMS认为方法的选择不是随机的
            
            
        
            
        
            
        (2)击键层次模型
            对用户执行情况进行量化预测
                仅涉及任务性能的一个方面:时间
            用途
                预测无错误情况下专家用户在下列输入前提下完成任务的时间
                便于比较不同系统
                确定何种方案能最有效地支持特定任务
            
        
            
        
            
        (3)Fitts定律

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
        
    2、动态特性建模
        (1)状态转移网
            状态转移图
                最常用的状态转移网的形式
                有向图 
                图中的结点表示系统的各种状态
                图中的边表示状态之间可能的转移 
                
                
                
            
        (2)三态模型
            
            
            
            
            
            
            

            
    3、语言模型
            
            
            
    4、系统模型

    欢迎访问我的个人博客shawnluo.com  !

    展开全文
  • 在本教程中,我们将学到构建一个TensorFlow模型的基本步骤,并将通过这些步骤为MNIST构建一个深度卷积神经网络。 安装 在创建模型之前,我们会先加载MNIST数据集,然后启动一个TensorFlow的session。 加载MNIST...
  • 人的感知:通过人体器官和组织进行人与外部世界的信息的交流和传递,人机交互主要通过人的感知来完成,主要包括视觉感知(80%)、听觉感知和触觉感知。 1.视觉(第二版 P10) (1)视觉是人类最重要的感觉通道,...
  • 读书笔记:《人机交互:以用户为中心的设计和评估(第2版)》 Humen-Computer Interaction:User Centered Design and Evaluation 原书作者:董建明/傅利民/Gavriel Salvendy 人机交互学(humen-computer ...
  • 交互图 (顺序图、通信图、鲁棒图、定时图) •交互交互交互的概念 •一次交互就是指在特定语境中,为了实现某一个目标,而在一组对象之间进行交换的一组消息所表示的行为 消息 UML中的4种交互...
  • 原文:How To Write, Deploy, and Interact ...摘要:本文作者以极长的篇幅给出了在私有区块链上编写、部署以及与以太坊进行交互的智能合约的较为完整的代码、相关细节步骤、用户界面等。作者是希望借助他这篇文章,
  • 成本归集与分配

    万次阅读 2019-04-23 20:32:42
    一、归集与分配概念 1、成本归集:通过一定的会计制度以有序的方式进行成本数据的收集或汇总。例如制造费用按车间归集。 2、成本分配:将归集的间接成本分配给成本对象,也叫间接费用的分摊。 3、成本的核算...
  • 设计FMEA步骤三:功能分析

    千次阅读 2020-02-07 12:32:34
    设计功能分析的目的是确保要求/规范中规定的功能被适当地分配给系统要素。无论DFMEA使用什么工具创建,其分析都要用功能术语编写,这点至关重要。 设计功能分析的主要目标是: ● 产品或过程功能可视化 ● 制定功能...
  • 原文:How To Write, Deploy, and Interact with Ethereum Smart ...摘要:本文作者以极长的篇幅给出了在私有区块链上编写、部署以及与以太坊进行交互的智能合约的较为完整的代码、相关细节步骤、用户界面等。作者是
  • 原始人的除引发的闲聊

    千次阅读 2013-11-23 19:34:37
    现在多少人知道乘法和除是怎么一回事。Oh!NO!乘法口诀小学生都会,除是乘法的逆运算,超级详细的竖式演算规则,好像是小学三年级前的四则混合运算章节里教的...然而我要说的是,大错特错!你学会的仅仅是...
  • 网络市场调研的步骤与方法

    千次阅读 2007-10-22 19:53:00
    网络市场调研的步骤与方法 一、网络市场调研的一般步骤 网络 市场调研 与传统的 市场调研 一样,应遵循一定的方法与...当你开始搜索时,你可能无法精确地找到你所需要的重要数据,不过你肯定会沿路发现一些其他价值
  • -、通过hostapd、dhcp和... 买手机之前一个星期内,我通过互联网,非常详细的了解了一遍android。我打算将它打造成一种超级装备:因为我用的系统是fedora17系统,笔记本自带的网卡支持AP,所以我打算通过ssh达
  • SAP成本核算步骤简介

    千次阅读 2012-10-15 09:10:18
    接下来结合国内工业企业成本核算基础知识简单阐述一下其在SAP CO模块的实现,在SAP中,FI和CO模块是分开的,当然两者同时紧密联合,兴趣的读者自己可以通过熟悉SAP系统去总结一下其CO模块成本核算实现方式和国内传统...
  • 多无人机(UAV)协同任务分配

    万次阅读 多人点赞 2019-03-22 13:33:53
    多无人机协同任务规划即是根据一组特定条件的约束,以实现某个准则函数的最优或次优为目标,将某项作战任务分解成一些子任务并分配给多无人机系统中的各个无人机分别去完成的过程。 通常多无人机任务规划可以分成两...
  • JVM:自动内存管理-垃圾收集器与内存分配策略

    千次阅读 多人点赞 2021-01-12 12:27:38
    Java与C++之间一堵由内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 一、概述:Java堆和方法区这两个区域有着很显著的不确定性 二、对象已死? 1、引用计数、引用计数器的缺陷 2...
  • KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera... 图文全来自原论文或本人翻译,如不正,敬请指出。 摘要      KinectFusion使用户可以手持Kinect移动,仅用Kinect的
  • 使用内网穿透 笔者已经贴心的将内网穿透的工具奉上,包括使用方式,免费的哦,操作步骤很简单:内网穿透 如此一来,每当配置的行为触发之后,推送的接口就会向你的接口推送数据了。 如何向美团发送请求? 这里就拿...
  • 倍分DID详解 (二):多时点 DID (渐进DID)

    万次阅读 多人点赞 2019-11-23 23:56:21
      ...在 「连享会 - 倍分系列推文」—— 「倍分DID详解 (一):传统 DID」 文中,我们详细介绍了 DID 模型的估计,平行趋势的检验以及政策的动态效果的展示等主题,并通过模拟的方式给出了...
  • 数据分类怎么做? 7个步骤轻松搞定

    千次阅读 2018-07-14 16:40:10
    背 景越来越多深思远虑、高瞻远瞩的企事业单位都已经意识到:...一天,我们突然想在这些数据中搜索一些价值的东西,但是现有的很多数据都是冗余、过时和琐碎(ROT)的,甚至是未知的、价值不明确的“暗数据”...
  • GRASP通用职责分配软件模式

    千次阅读 2012-11-18 00:00:12
    它的核心思想是“职责分配(Responsibility Assignment)”。GRASP提出了几个基本原则,用来解决面向对象设计的一些问题。 Craig Larman在《Applying UML and Patterns》一书中提出了GRASP设计模式的概念。作者称其...
  • CentOS 7中Docker安装详细步骤 ( 资源 )

    千次阅读 2018-05-29 15:21:00
    安装分两种比较常见的情况:一种是Ubuntu环境下安装,一种是CentOS环境下进行安装,Ubuntu环境下的安装参见《第一本Docker书》,书中详细的步骤,此处 只讨论CentOS环境下的安装。本文用的版本为CentOS7.1。 ...
  •  内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共 1024M 的内存,分配了 521M 的内存一直不回收,那么可以用的内存只有 521M 了,仿佛泄露掉了一部分;通俗一点讲的话,内存泄漏就是【占着茅坑不拉...
  • JVM篇·垃圾收集器与内存分配策略

    千次阅读 2021-06-17 13:42:36
    概念:在对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加一,当引用失效时,计数值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但当遇到循环引用时就无法正确处理; 强引用:引用赋值...
  • 背景 如今的社交类游戏,大多采用分布式服务器架构,也就是说所有区服的数据存储在一个集群中,玩家可以无阻碍交互,一同游玩。...而如果游戏中海量的小团体, 要求每隔一定周期为全服所有团体分配一个实...
  • 垃圾收集器与内存分配策略

    千次阅读 2019-07-12 11:15:56
    从名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“标记—清除”算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括: 初始标记-短暂,仅仅只是标记一下GC ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,933
精华内容 10,773
关键字:

交互分配法的步骤有