精华内容
下载资源
问答
  • 首先,构建了煤矿井下工程全生命周期过程体系;然后,根据全生命周期各个过程以及子过程组成逻辑关系,选用Visual Object Net++软件对煤矿井下工程全生命周期、设计与计划阶段、施工与控制阶段、考核与结算阶段...
  • 信息系统的生命周期

    2011-04-19 23:52:00
    信息系统的生命周期可以分为四个阶段,形成、开发、运维、消亡。 形成阶段主要包括概念形成,可行性分析,需求调研 开发阶段主要包括系统分析,系统设计,系统实施和系统验收 运维阶段主要包括保障系统正常运行 ...

    信息系统的生命周期可以分为四个阶段,形成、开发、运维、消亡。

    形成阶段主要包括概念形成,可行性分析,需求调研

    开发阶段主要包括系统分析,系统设计,系统实施和系统验收

    运维阶段主要包括保障系统正常运行

    消亡阶段主要包括系统的下线

    典型的信息系统生命周期:

    2011041923441977.jpg

    项目是孕育一个产品的过程,是产品生命周期的开始阶段。一般包括 启动、计划、实施、收尾四个阶段。

    产品的生命周期从产品的研发,产品投入使用,直到消亡。

    所以项目周期是产品周期的一部分。

    PS:

    XP编程:极限编程 适用于小型或者中型的软件开发团队,用户需求模糊多变。

    运维阶段的四种类型:

    1、排错性维护:修改测试阶段没有发现的bug

    2、完善性维护:客户的心需求

    3、适应性维护:由于软件外部环境、数据环境等因素引起的软件修改

    4、预防性维护:在客户提出维护之前,自行对软件进行修改,提高软件的可维护性和可靠性

    转载于:https://www.cnblogs.com/Clivia/archive/2011/04/19/test002.html

    展开全文
  • 信息系统项目管理基础、项目管理知识体系构成、IPMA/IPMP、PRINCE1、组织结构对项目的影响、信息系统项目的生命周期信息系统项目典型生命周期、单个项目的管理过程 根据考试大纲,本章知识点会涉及单选题型,约占...

    项目基础管理

    信息系统项目管理基础、项目管理知识体系构成、IPMA/IPMP、PRINCE1、组织结构对项目的影响、信息系统项目的生命周期、信息系统项目典型生命周期、单个项目的管理过程

    根据考试大纲,本章知识点会涉及单选题型,约占6~12分


     
    1. 项目管理基础

    项目的定义
     PMI (Project Management Institute 美国项目管理协会) 在《项目管理知识体系指南》中将项目定义为提供一项独特产品、服务或成果所做的临时性努力

    项目的特点
     1. 临时性(一次性),有明确的开始和结束时间
     2. 独特的产品、服务或成果
     3. 逐步完善
     4. 资源约束
     5. 目的性

    项目的三个目标:时间、成本和质量

    项目的四大要素:时间、成本、质量、范围 

     

    项目目标的特性:

    • 优先性。不同目标在项目的不同阶段,根据不同需要,其重要性也不一样
    • 层次性。 项目目标的描述需要有一个从抽象到具体的层次结构
    • 多目标性。 通过一个项目的实施,实现一系列的目标,满足多方面 的需求。项目目标基本表现为三方面,即时间、成本、质量标准),三个目标之间往往存在冲突

    项目经理在项目中的责任
      在时间、成本、质量和项目范围之间进行权衡以保证项目的成功

    日常运作 VS 项目
     1. 日常运作是持续不断和重复进行的,而项目时临时性的、独特的 
     2. 两者有本质的不同。项目的目标是实现其目标,然后结束项目,而持续进行的日常运作的目标一般是为了维持经营
     3. 项目的实现机制与日常运作大相径庭,因为当宣布的目标实现时,项目即结束
       
      
     
    项目管理就是把各种知识、技能、手段和技术应用于项目活动之中,以达到项目的要求
    项目管理是通过应用和综合诸如启动、计划、实施、监控、收尾等项目管理过程来进行的
    管理一个项目包括:
      识别要求;
      确定清楚而又能够实现的目标;
      权衡质量、范围和成本方面互不相让的要求;
      使技术规格说明书、计划和方法适用于各种各样项目干系人的不同需求和期望等内容
      项目团队应考虑文化与社会环境、国际与政治环境、自然环境

    制约项目成功的四个因素: 范围、进度、成本、质量

    项目组合

     

    项目集

    2. 项目知识体系构成

     有效的管理要求项目管理组至少能理解和使用五方面的专门知识领域:

       1. 项目管理知识体系
       2. 应用领域的知识、标准和规定
       3. 项目环境知识
       4. 通用的项目管理知识和技能
       5. 软技能和人际关系技能

      考题:某人是资深的职能经理,被提拔为项目经理,但是执行过程中出现了很多问题,甲方不验收,问怎么样才能管好项目。

      答案要围绕这5个方面去回答。

     2-1. 项目管理知识体系

       项目管理知识体系描述了对于项目管理领域来说独特的知识以及其他管理领域交叉的部分、美国项目管理协会颁发的PMBOK(十大过程组、五大知识领域)是大的项目管理知识体系的子集

     

    2-2. 应用领域的知识、标准和规定

     应用领域的知识包含:

     1) 职能部门和支持,如法律、产品、产品和库存管理等

      2) 技术因素,如计算机软件、计算机网络、计算机系统集成

      3) 管理专业领域,如政府合同

      4) 工业组织,如汽车、工业和金融服务

      国际化标准组织(International Organization for Standardization,ISO)中的标准和规则

      标准是“一致同意并由公认的机构批准的文件,该团体提供通用的和可重复使用的规则、指南、活动或其结果的特征”

      规则是政府强制的要求,包括使用的管理条款、并强制遵守。 

      标准和规则之间有很大的一块灰色区,如果甲方把标准放在合同中,该标准就成了强制性要求。

     2-3. 项目环境知识

     项目团队考虑文化与社会环境、国际与政治环境、自然环境

     2-4. 通用的项目管理知识和技能

     通用的管理包括计划、组织、人事、执行和控制一个正在运行的企业的运作

     2-5. 软技能

      有效的沟通、领导能力、激励、谈判和冲突管理、问题解决等

     

    3. IPMP/PMP

      IPMA(International project Management Association )国际项目管理协会,非营利性国际学术组织

      ICB (IPMA Competent Baseline) 是IPMA建立的知识体系,划分为28分核心要素和14个附加要素

     

     IPMP (International project Management Professional ) 是 IPMA在全球推行的死机项目管理专业资质认证体系的总称

     IPMP 证书分为A级、B级、C级、D级,授予不同的证书,C级相当于美国的PMP

     美国项目管理知识体系(Project Management Body of Knowledge)PMBOK ,目前为2018年的第6版。分为10大知识领域:

     范围管理、时间管理、成本管理、质量管理、人力资源管理、沟通管理、采购管理、风险管理、整体管理、干系人管理

     速记词:范时整沟质 成人风采 干杯

     

    4. PRINCE2

       PRINCE2 是 (Project IN Controlled Environment)受控制环境下的项目管理,PRINCE2是这种方法的第二个重要版本,由英国商务部(OGC)所有

       PRINCE2描述了如何以一种逻辑性的、有组织的方法,按照明确的步骤对项目进行管理

      它不是一种工具也不是一种技巧,而是基于流程的结构化项目管理方法。在国际上被称为项目管理王者认证

      PRINCE2 四要素:原则、流程、主题和项目环境。

      七个原则:持续业务验证、吸取经验教训、明确定义的角色的职责、按阶段管理、例外管理、关注产品、根据项目环境剪裁

      主题包括:商业论证、组织、质量、计划、风险、变更、进展

      PRINCE2 包括以下流程:准备、指导、启动、阶段控制流程、阶段边界管理、产品交付管理流程、项目收尾流程

     

     

    5. 组织结构对项目的影响

    以项目为基础的组织是指他们的业务主要有项目组成,分为两种:

    1) 其主要收入是源自依照合同,为他人履行项目的组织

    2) 采用项目进行管理的组织

    项目结构组织有以下几种:

    项目经理的定义

    2个目标:

    1)使项目目标与组织的战略目标一致
    2)使团队中的每个人朝同一方向努力人
    朝同一方向努力
    三个技能 :项目管理技术、领导力、战略和商务管理技能
     
    三个层面:过程层面、认知层面、背景层面
     
    五大关系:项目内部关系、项目所在组织关系、项目所在行业关系、项目与项目管理职业的关系、项目与其他职业的关系
     
     

     

    5-1. 职能型组合

     由职能经理进行项目协调,在职能部门里组织几个员工参加项目

     职能型的优点:

    1. 便于知识、职能和经验交流

    2. 清晰的职业生涯晋升路线

    3. 沟通交流简单、责任和权限清晰

    4. 重复性工作为主的过程管理

    职能型的缺点:

    1. 职能利益大于项目

    2. 项目横向之间联系薄弱,部门之间沟通、协调难度大

    3. 项目经理缺少权利、权威

    4. 项目发展方向不明、缺少项目基准

     

    5-2. 项目型组合

    项目型组织优点:

    1. 责权分明、利于统一指挥

    2. 目标明确单一

    3. 沟通简单、方便

    4. 决策快

    项目型组织缺点:

    1. 管理成本过高,对项目经理的专业性要

    2. 项目环境比较封闭,不利于沟通技术知识分享

    3. 员工缺乏事业上的连续性和保障

     

    5-3. 矩阵型组合

      

     

    6. 信息系统生命周期

      通用的生命周期模型

     1. 成本与人力投入在开始时较低,在工作执行期间达到最高,并在项目结束时迅速回落。

     2. 风险与不确定性在项目开始时最大,并在项目整个生命周期里随着决策的制定和可交付成果的验收而逐步降低

    ** 越早地投入项目管理,获得成功的可能性越大,减少损失的可能性越大

     阶段与关系阶段的两种基本类型:

     顺序关系、交叠关系

     在交叠关系中,一个阶段在前一个阶段完成之前就开始,可作为进度压缩的一种技术,被称为“快速跟进”,可能增加返工的风险

     

    7. 信息系统项目典型生命周期模型

      7.1 瀑布型

       

       最典型的预见性的方法,严格遵循预先计划的需求分析、设计、编码、集成、测试、维护的步骤顺序进行。强调各阶段之间的先后顺序,不可以并行操作
       步骤成果作为衡量进度的方法,例如需求规格,设计文档,测试计划和代码审阅等等。

     

     7.2 快速原型

      适用于用户需求不明确的项目不要求对系统做全免、详细的调查和分析。先快速开发一个原型系统,再通过反复修改来实现用户的最终系统需求。

     调产品以用户为中心,先开发出原形,和用户进行持续沟通,最终确定需求,并设计出最终的产品。氛围 进化型和抛弃型。

     原型具有的特征:实际可行、具有最终系统的基本特征、构造方便 快速 造价低

                
      7.3 迭代型

      

      是一种与传统的瀑布式开发相反的,事先不能完整定义产品需求,计划多期开发的软件开发过程,不再强调开发工作的序列化过程,而是将这些过程并行化,分为多个阶段,每个阶段都包含这些工作,只是不同阶段,不同的比例。    
     每一次迭代都包括了需求分析、设计、实现与测试。
     采用这种方法,开发工作可以在需求被完整地确定之前启动,并在一次迭代中完成系统的一部分功能或业务逻辑的开发工作,再通过客户的反馈来细化需求,并开始新一轮的迭代。
     迭型核心是工作流从技术角度描述其静态组成部分,包括:业务建模、需求获取、分析和设计、实现、测试和部署
                

      7.4 螺旋开发

       它将瀑布模型的线性和原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂高风险的系统
       螺旋模型”刚开始规模很小,不需要在刚开始的时候就把所有事情都定义的清清楚楚,当项目被定义得更好、更稳定时,逐渐展开
       实现功能然后听取客户的意见,之后再进入到下一个阶段。如此不断轮回重复,直到得到您满意的最终产品。
       螺旋模型的四个象限分别标志每个周期所划分的四阶段:制订计划、风险分析、实施工程和客户评估

       螺旋模型有两个显著的特点:一是采用循环的方式逐步加深系统定义和实现的深度,降低风险;二是确定一系列里程碑,确保项目开发过程中的相关利益者都支持可行满意的系统解决方案


                  
     7.5 敏捷开发

      以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。把一个大项目分为多个相互联系、可独立运行的小项目,并分别完成,在此过程中软件一直处于可用的状态

     更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队
     能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用
     缺点:随着项目规模增长,面对面的沟通就愈加困难,因此敏捷方法更适用于较小的队伍

     敏捷开发的原则:快速迭代、 让开发和测试都参与需求讨论、多沟通尽量减少文档、做好产品原型、及早考虑测试

     

     7.6 V模型

       V模型特点:

    •     V模型体现的主要思想是开发和测试同等重要,左侧代表的开发活动,右侧代表的是测试活动
    •     V模型针对每个开发阶段,都有一个测试级别与之对应
    •     开发依旧是开发生命周期中的阶段,与瀑布模型不同的是,有多个测试级别与开发阶段对应
    •     适用于需求明确变更不频繁的情形

    单元测试
    集成测试:主要关注点是系统是够能否成功编译,实现主要的业务功能,系统各个模块之间数据能否正常通信
    系统测试
    验收测试
     

      V模型有2种,目前都对,在没有特别说明的情况下,默认第一种

     

     

      7.7 喷泉模型

      主要用于描述面向对象的开发过程,体现了面向对象开发过程的迭代和连续性,该模型认为软件开发过程自下而上周期的各阶段是相互迭代和无间隙的特性

     

     8. 单个项目的管理过程

       项目管理各过程组成的5个过程组可以对应到PDCA戴明环:

       即“计划Plan - 执行Do - 检查Check - 行动Act” 循环

       

      P:  计划,设定为达到目标所必须的方法或标准
      D:  实施,按计划逐步实施具体工作
      C:  确认,确认或检查实施的效果
      A:  措施,确认实际效果与计划差异,并根据需要采取措施

    四个过程不是运行一次就结束,而是周而复始的进行,一个循环完了,解决一些问题,未解决的问题进入下一个循环,这样阶梯式上升

     

     项目管理过程租

     五大过程组

     启动过程租:定义并批准项目或项目阶段,包括 制定项目章程 识别干系人 两个过程

     计划过程组:定义和细化目标,并为实现项目而要达到的目标和完成项目要解决的问题范围而规划必要的行动路线

     执行过程组:整合人员和其他资源,在项目的生命期或某个阶段执行项目管理计划

     监督和控制过程组:定期测量和监控项目绩效情况,识别与项目管理计划的偏差,以便在必要时采取纠正措施,确保项目或阶段目标达成

     收尾过程组:正式验收产品、服务或工作成果,有序的结束项目或项目阶段

     十大知识领域:

     十大知识领域、五大过程组关系图

     

     

    展开全文
  • jdk1.8内存示意图: ...在整个程序执行过程中,JVM中运行时数据区(内存)会用来存储程序执行期间需要用到数据和相关信息。 因此,在Java中我们常常说到内存管理就是针对这段空间进行管理..

    在这里插入图片描述
    在这里插入图片描述
    jdk1.8内存示意图:
    在这里插入图片描述
    好的,说完内存结构,我们再说下文件加载与运行:
    在这里插入图片描述
    JVM = 类加载器 classloader + 执行引擎 executionengine + 运行时数据区域 runtime data area

    首先Java源代码文件被Java编译器编译为字节码文件,然后JVM中的类加载器加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM中的运行时数据区(内存)会用来存储程序执行期间需要用到的数据和相关信息。

    因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)

    1、程序计数器(每条线程独立私有)

    程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器

    字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支 循环 跳转 异常处理 线程恢复等基础功能都需要依赖这个计数器来完成

    jvm的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现

    2、Java虚拟机栈(JVM stacks)

    stacks也是线程私有 描述的是java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

    每一个方法从调用到执行完成的过程,就对应栈帧从入栈到出栈的过程
    在这里插入图片描述
    静态分派(重载)
    虚拟机(准确地说是编译器)在重载时是通过参数的静态类型而不是实际类型作为判定依据的。并且静态类型是编译期可知的,因此,在编译阶段,Javac编译器会根据参数的静态类型决定使用哪个重载版本
    动态分派(重写)
    invokevirtual指令的运行时解析过程大致分为以下几个步骤:
    1)找到操作数栈顶的第一个元素所指向的对象的实际类型,记作C。
    2)如果在类型C中找到与常量中的描述符和简单名称都相符的方法,则进行访问权限校
    验,如果通过则返回这个方法的直接引用,查找过程结束;如果不通过,则返回
    java.lang.IllegalAccessError异常。
    3)否则,按照继承关系从下往上依次对C的各个父类进行第2步的搜索和验证过程。
    4)如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。

    在概念模型中,两个栈帧作为虚拟机栈的元素,相互之间是完全独立的,但是大多数虚拟机的实现里都会作一些优化处理,令两个栈帧出现一部分重叠。让下栈帧的部分操作数栈与上面栈帧的部分局部变量表重叠在一起,这样在进行方法调用返回时就可以共用一部分数据,而无须进行额外的参数复制传递了,重叠过程如下图:
    在这里插入图片描述
    动态链接:
    符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接。
    (一个方法调用另一个方法,或者一个类使用另一个类的成员变量时,需要知道其名字,符号引用就相当于名字,这些被调用者的名字就存放在Java字节码文件里(.class 文件)。
    名字是知道了,但是Java真正运行起来的时候,如何靠这个名字(符号引用)找到相应的类和方法
    需要解析成相应的直接引用,利用直接引用来准确地找到。)

    局部变量表:
    存放八种基本数据类型、对象引用(reference类型,不一定是本身 也可能是指向对象地址的指针或者句柄)、returnAddress(指向字节码指令的地址(64位的long和double会占用两个局部变量空间(Slot)(字宽),其他为1个)
    局部变量表的内存空间在编译期间完成分配(执行时不会改变空间大小)
    stackOverflowError:线程请求的栈深度大于虚拟机所允许的深度
    OutOfMemoryError:虚拟机栈动态拓展时无法申请到足够的内存
    操作数栈:
    与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。

    3、本地方法栈(为JVM使用到的Native方法服务)

    和虚拟机栈类似 区别是本地方法栈执行Native方法服务

    4、 java堆(Heap)(唯一目的:存放对象实例)

    Java堆时JVM管理内存中最大的一块,java堆是被所有线程共享的一块内存区域,在JVM启动时创建.
    java堆是垃圾收集器管理的主要区域,因此很多时候也被称做"GC堆".
    内存回收的角度:现在收集器基本都采用分代收集算法.
    heap可以处于物理上不连续的内存空间中,只要逻辑上连续即可.
    可以通过配置(-Xmx和-Xms)来拓展堆空间.

    5 方法区(描述为堆的一个逻辑部分,但是与堆是分开的 Non-Heap)

    各个线程共享的内存区域,用于存储已被加载的类信息,常量,静态变量,即时编译器编译后的代码。
    JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但它有另外一个名字叫Non-Heap(非堆)。根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
    方法区被分为两个主要的子区域:

    1、持久代 :
    这个区域会存储包括类定义、结构、字段、方法(数据及代码)以及常量在内的类相关数据。它可以通过-XX:PermSize及-XX:MaxPermSize来进行调节。如果它的空间用完了,会导致java.lang.OutOfMemoryError: PermGenspace的异常。
    而JDK8开始,持久代已经被彻底删除了,取代它的是另一个内存区域也被称为元空间。
    Class 在被 Loader 时就会被放到 持久代(PermGen space )中。持久代是 JDK7及之前, HotSpot 虚拟机 对 方法区 的一个落地实现。在JDK8被移除。
    Metaspace(元空间)是 JDK8及之后, HotSpot 虚拟机 对 方法区 的新的实现。
    元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
    为什么要做这个转换:
    1)字符串存在永久代中,容易出现性能问题和内存溢出。

    2)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

    3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

    4)Oracle 可能会将HotSpot 与 JRockit 合二为一。

    方法区存储的是每个class的信息:
    1.类加载器引用(classLoader)
    2.运行时常量池
    所有常量、字段引用、方法引用、属性
    3.字段数据
    每个方法的名字、类型(如类的全路径名、类型或接口) 、修饰符(如public、abstract、final)、属性
    4.方法数据
    每个方法的名字、返回类型、参数类型(按顺序)、修饰符、属性
    5.方法代码
    每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结 束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引
    特点

    常量池随永久代的变化

    几种常量池:

    (1)静态常量池:即*.class文件中的常量池,在Class文件结构中,最头的4个字节存储魔数,用于确定一个文件是否能被JVM接受,接着4个字节用于存储版本号,前2个为次版本号,后2个主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。

    这种常量池占用class文件绝大部分空间,主要用于存放两大类常量:字面量和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串、基础数据、声明为final的常值等符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:类和接口的全限定名、字段名称描述符、方法名称描述符。类的加载过程中的链接部分的解析步骤就是把符号引用替换为直接引用,即把那些描述符(名字)替换为能直接定位到字段、方法的引用或句柄(地址)。

    (2)运行时常量池:虚拟机会将各个class文件中的常量池载入到运行时常量池中,即编译期间生成的字面量、符号引用,总之就是装载class文件。为什么它叫运行时常量池呢?因为这个常量池在运行时,里面的常量是可以增加的。如:“+”连接字符生成新字符后调用 intern()方法、生成基础数据的包装类型等等。

    (3)字符串常量池 :字符串常量池可以理解为是分担了部分运行时常量池的工作。加载时,对于class文件的静态常量池,如果是字符串就会被装到字符串常量池中。

    (4)整型常量池:Integer,类似字符串常量池。管理-128–127的常量。类似的还有Character、Long等常量池(基本数据类型没有哦,Double、Float也没有常量池)

    总结就是:
    class文件有常量池存放这个类的信息,占用了大多数空间。但是运行时所有加载进来的class文件的常量池的东西都要放到运行时常量池,这个运行时常量池还可以在运行时添加常量。字符串常量池、Integer等常量池则是分担了运行时常量池的工作,

    在永久代移除后,字符串常量池也不再放在永久代了,但是也没有放到新的方法区—元空间里,而是留在了堆里。运行时常量池当然是随着搬家到了元空间里,毕竟它是装类的重要等信息的,有它的地方才称得上是方法区。
    在这里插入图片描述

    1.方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只允许一个线程去装载它,而其它线程必须等待。
    
    2.方法区的大小不必是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。
    
    3.方法区也可被垃圾收集,当某个类不在被使用(不可触及)时,JVM将卸载这个类,进行垃圾收集
    

    如果想查看更详细的常量池的内存实现细节,调到我的另一篇文章String创建内存的分配以及方法区常量池之间的关系

    类加载

    首先提下上面的方法区,是各个线程共享的内存区域,用于存储被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码,运行时常量池(1.6之前)。在HotSpot上也被称为“永久代”。

    这一区域主要的知识点是类加载的过程,这一过程分为五个阶段,分别是加载,验证,准备,解析,初始化

    加载
    虚拟机需要完成以下三件事:

    1、通过一个类的全限定名来获取定义此类的二进制字节流
    2、将这个字节流所代表的静态数据结构转换为方法区的运行时数据结构
    3、在内存中生成一个代表这个类的java.lang.Class对象,做为方法区这个类的各种数据结构的访问入口。
    简单来说,就是先通过全类名把文件加载到二进制字节流,然后转换为方法区的数据结构,再生成class对象,做为访问入口。
    类加载器
    对于1中的这一操作,需要用到类加载器模块。这个类加载器在用于判断两个类是否相等时用到。也就是只有再同一个类加载器加载的前提下,再去比较是否相等才有意义。这里的相等包括:equals、isAssignableForm、instanceof等
    双亲委派模型
    java虚拟机通过双亲委派模型来实现类加载器。所谓的双亲委派模型如下图:
    在这里插入图片描述
    从上到下分别为:

    启动类加载器,加载<JAVA_HOME>/lib目录下(或通过-Xbootclasspath参数指定的目录下),能被java虚拟机识别的
    文件名(如:rt.jar)类库加载虚拟机内存中。开发者不能直接使用
    扩展类加载器,加载<JAVA_HOME>/lib/ext目录下(或java.ext.dirs系统变量所指定的目录下),所有的类库,参被开发者使用
    应用程序类加载器,加载类路径下(ClassPath)的所有类库,开发者可以直接使用
    自定义类加载器,自己定义的类加载器。
    双新委派模型的加载查找过程也是自顶向下的,如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。这些父加载器的组织方法一般不通过继承,而是通过组合来复用。

    验证
    确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

    文件格式验证:验证字节流是否符合Class文件格式的规范,如:是否以模数0xCAFEBABE开头、主次版本号是否在当前虚拟机处理范围内等等。
    元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求;如:这个类是否有父类,是否实现了父类的抽象方法,是否重写了父类的final方法,是否继承了被final修饰的类等等。
    字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如:操作数栈的数据类型与指令代码序列能配合工作,保证方法中的类型转换有效等等。
    符号引用验证:确保解析动作能正确执行;如:通过符合引用能找到对应的类和方法,符号引用中类、属性、方法的访问性是否能被当前类访问等等。
    验证阶段是非常重要的,但不是必须的。可以采用-Xverify:none参数来关闭大部分的类验证措施。

    准备
    为类变量分配内存并设置类变量初始值,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:
    只对static修饰的静态变量进行内存分配、赋默认值(如0、0L、null、false等)。
    对final的静态字面值常量直接赋初值(赋初值不是赋默认值,如果不是字面值静态常量,那么会和静态变量一样赋默认值)。

    解析
    解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,即将内存的class类与其方法区的数据(变量,常量,静态变量,方法名,返回类型,修饰符等等信息)绑定在一起。
    符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。
    直接引用可以是
    (1)直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
    (2)相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
    (3)一个能间接定位到目标的句柄
    直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。

    假设:一个类有一个静态变量,该静态变量是一个自定义的类型,那么经过解析后,该静态变量将是一个指针,指向该类在方法区的内存地址。

    初始化
    初始化阶段是执行类构造器<clinit>()方法的过程,虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他 线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。(单例模式静态内部类的实现方式就是根据这一原理)。
    以下五种情况下才会触发初始化操作:

    1)遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初
    始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字
    实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常
    量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
    2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化, 则需要先触发其初始化。
    3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父 类的初始化。
    4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个 类),虚拟机会先初始化这个主类。
    5)当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后 的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄 所对应的类没有进行过初始化,则需要先触发其初始化。

    clinit 与 init

    在编译生成class文件时,编译器会产生两个方法加于class文件中,一个是类的初始化方法clinit, 另一个是实例的初始化方法init

    clinit是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用clinit方法。
    clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的
    clinit是class类构造器对静态变量,静态代码块进行初始化。
    虚拟机会保证在子类的clinit方法执行之前,父类的clinit方法已经执行完毕。

    注意事项:

    1. 如果类中没有静态变量或静态代码块,那么clinit方法将不会被生成。

    2. 在执行clinit方法时,必须先执行父类的clinit方法,但不是通过继承来的。

    3. clinit方法只执行一次。

    4. static变量的赋值操作和静态代码块的合并顺序由源文件中出现的顺序决定。

    init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法
    init是instance实例构造器,对非静态变量解析初始化
    init指的是实例构造器,主要作用是在类实例化过程中执行,执行内容包括成员变量初始化和代码块的执行。

    注意事项:
    
    1. 如果类中没有成员变量和代码块,那么clinit方法将不会被生成。
    
    2. 在执行init方法时,必须先执行父类的init方法。
    
    3. init方法每实例化一次就会执行一次。
    
    3. init方法先为实例变量分配内存空间,再执行赋默认值,然后根据源码中的顺序执行赋初值或代码块。
    
    public class Test{
    static{
    i=0;//给变量赋值可以正常编译通过
    System.out.print(i);//这句编译器会提示"非法向前引用"
    //因为加载顺序是 静态变量->静态初始化代码块
    }
    static int i=1;
    }
    

    顺带提一句执行顺序:
    父类(静态变量,静态初始代码块)
    子类(静态变量,静态初始代码块)
    父类非静态(变量,代码块,构造函数)
    子类非静态(变量,代码块,构造函数)

    static class Parent{
        public static int A=1;
        static{
        A=2;}
        static class Sub extends Parent{
        public static int B=A;
        }
        public static void main(String[]args){
        System.out.println(Sub.B);//结果是2
        }
    }
    

    注意:接口中不能使用静态语句块,但仍然有静态变量初始化的赋值操作,因此接口与类一样都会生成<clinit>()方法。

    但接口与类不同的是,执行接口的<clinit>()方法不需要先执行父接口的<clinit>()方法。

    只有当父接口中定义的变量使用时,父接口才会初始化。 另外,接口的实现类在初始化时也一样不会执行接口的<clinit>()方法。

    接口中的属性都是static final类型的常量,因此在准备阶段就已经初始化。

    对象的生命周期

    JVM规定,所有的对象实例和数组都要在堆上分配;堆的主要作用就是用来分配给对象生存的空间。
    先来看看java对象是如何分配的。
    TLAB分配
    JVM在内存新生代Eden Space中开辟了一小块线程私有的区域,称作TLAB(Thread-local allocation buffer)。默认设定为占用Eden Space的1%。在Java程序中很多对象都是小对象且用过即丢,它们不存在线程共享也适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。也就是说,Java中每个线程都会有自己的缓冲区称TLAB(Thread-local allocation buffer),每个TLAB都只有一个线程可以操作。TLAB结合bump-the-pointer技术可以实现快速的对象分配,而不需要任何的锁进行同步,也就是说,在对象分配的时候不用锁住整个堆,而只需要在自己的缓冲区分配即可。
    java对象分配过程:

    1. 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在堆上分配,则进入选项2.
    2. 如果tlab_top + size <= tlab_end,则在在TLAB上直接分配对象并增加tlab_top 的值, 如果现有的TLAB不足以存放当前对象则3.
    3. 重新申请一个TLAB,并再次尝试存放当前对象。如果放不下,则4.
    4. 在Eden区加锁(这个区是多线程共享的),如果eden_top + size <= eden_end则将对象存放在Eden区, 增加eden_top 的值,如果Eden区不足以存放,则5.
    5. 执行一次Young GC(minor collection)。
    6. 经过Young GC之后,如果Eden区任然不足以存放当前对象,则直接分配到老年代。

    有分配就要回收,java堆的回收,主要解决三个问题:什么时候可以回收?什么时候回收?怎么回收?

    可达性分析(什么时候可以回收?)
    在这里插入图片描述

    安全点(什么时候回收?)
    安全点的选定基 本上是以程序“是否具有让程序长时间执行的特征”为标准进行选定的;“长时间 执行”的最明显特征就是指令序列复用,例如方法调用、循环跳转、异常跳转等,所以具有 这些功能的指令才会产生Safepoint
    安全区域(什么时候回收?)
    安全区域是指在一段代码片段之中,引用关系不会发生变化。在这个区域中的任意地方 开始GC都是安全的。
    垃圾回收器(怎么回收?)
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 第二个问题:系统信息的生命周期是什么样的? 系统规划阶段:对目前所在的组织环境,现状进行初步调查,根据组织的发展战略,研究信息化的必要性和可能性,拟定方案。对方案进行可行性研究,审议通过后...
       我的思考:为什么要定义信息系统的生命周期?生命周期是什么样的?

    第一个问题:由于信息系统一般都投资大,风险大,复杂度高,难度大,为了能够工程化(提高项目成功的概率),有必要将其划分成多个阶段,在不同的阶段有不同的目标,使用不同的工作方法,各阶段的任务由不同的人来负责,这个过程称为信息系统的生命周期。

    第二个问题:系统信息的生命周期是什么样的?

    关于信息系统项目管理学习-信息系统生命周期的几点思考

    关于信息系统项目管理学习-信息系统生命周期的几点思考

    • 系统规划阶段:对目前所在的组织环境,现状进行初步调查,根据组织的发展战略,研究信息化的必要性和可能性,拟定方案。对方案进行可行性研究,审议通过后,输出系统设计任务书(建设规划,实施规划)
    • 系统分析阶段:根据上阶段的系统设计任务书确定的范围,对现系统进行详细调查,指出目前的问题和局限性,确定新系统的逻辑模型,输出系统说明书。
    • 系统设计阶段:根据上阶段的系统说明书,设计具体实现逻辑模型的技术方案,即物理模型,输出系统设计说明书。
    • 系统实施阶段:根据上阶段的系统设计说明书,付诸于具体实施,包括资源采购,安装调试,编码,测试,培训,切换上线等,输出实施进展报告和系统测试分析报告。
    • 系统运维阶段:系统投入运行阶段,记录运行情况,变更,发布,评估系统效益
      关于信息系统项目管理学习-信息系统生命周期的几点思考
    展开全文
  • 信息生命周期管理,不仅是某种或几种软硬件产品,而是一种结合了人员、流程、技术,旨在有效管理数据和信息的战略。信息生命周期管理是一种信息管理模型,是一种针对信息主动管理的过程,宗旨在保证信息传播的连续性...
  • 无意的或不正确的修改软件或数据可用性确保系统和信息的可用性认证建立用户或信息系统的身份的信任的系统授权建立资源的访问权限审计/记录建立用户操作和关键系统过程的历史记录会话管理确保会话保持系统和经过验证...
  • 企业信息系统安全的生命周期

    千次阅读 2015-01-16 15:43:32
    在企业信息系统安全这每个主要阶段及其子阶段中,都要反复运用系统过程,包括需求分析,功能分析,综合分析,系统分析与控制,因此在企业信息系统安全生命周期中,完成过程实施需求时,就能有效地运用系统基本原则...
  • Servlet的生命周期

    2020-03-03 14:21:42
    上一篇博客介绍了关于Servlet的基本信息和如何使用访问Servlet,这篇博客介绍一下关于Servlet的生命周期 Servlet生命周期可被定义为从创建直到毁灭的整个过程,以下是Servlet遵循的过程: Servlet通过调用init()...
  • 信息系统的生命周期 一般来说,信息系统的生命周期分为 4 个阶段,即产生阶段、开发阶段、运行阶段和 消亡阶段。 1.信息系统的产生阶段 信息系统的产生阶段,也是信息系统的概念阶段或者是信息系统的需求...
  • activity生命周期方法调用过程  Activity为Android4大组件之一。Activity作为Android表现层(presentation layer),每个屏幕都是一个Activity(或由Activity继承而来),在Activity中使用View去构建图形化界面来...
  • 信息系统的生命周期包括: 大体上可以为5个阶段: 1.系统规划 :可行性分析与项目开发计划 ...如果从项目管理的角度来看的话,信息系统项目的生命周期又可以划分为:启动、计划、执行、监督和控制、收尾五大过程组 ...
  • 建立了面向产品生命周期的质量信息模型,具体阐述了面向产品生命周期信息模型概念、特点,分析了面向产品生命周期质量信息模型组成及各子模块之间演变过程。在此基础上提出了基于访问层、业务逻辑层和数据层...
  • Activity为Android4大组件之一。Activity作为Android的表现层(presentation layer),每个屏幕都是一个Activity(或由Activity继承而来),在Activity中使用View去构建图形化界面来展现...Activity的生命周期不是...
  • Spring的生命周期

    2019-06-21 17:53:19
    我举一个Bean在BeanFacotary的生命周期。首先Bean在容器中实例化,然后会根据Bean定义的信息配置所有属性。之后会检查有没有实现相应的接口调用其方法SetBeanName和SetBeanFacotory传入ID和自身的工厂。之后再检查...
  • java的生命周期

    2018-12-24 23:10:06
    java虚拟机就识别这种文件,java的生命周期就是class文件从加载到消亡的过程。  关于加载,其实,就是将源文件的class文件找到类的信息将其加载到方法区中, 然后在堆区中实例化一个java.lang.Class对象,作为方法...
  • 的生命周期

    2019-02-19 14:00:53
    java虚拟机就识别这种文件,java的生命周期就是class文件从加载到消亡的过程。 关于加载,其实,就是将源文件的class文件找到类的信息将其加载到方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中...
  • 一个Maven项目的搭建需要经历几个过程,而这几个过程整个被称为maven的生命周期,下面对maven的生命周期进行讲解 Maven项目的搭建需要经历:(默认生命周期) 编译 compile 测试 test 打包 package 安装 ...
  • Spring bean的生命周期

    2016-01-29 16:10:10
    Spring bean生命周期 在传统的Java应用中,Bean的生命周期非常简单。...理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。 1.容器寻找Bean的定义信息并且将其实例化。
  • Spring bean生命周期 在传统的Java应用中,Bean的生命周期非常简单。...理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。 1.容器寻找Bean的定义信息并且将其实例化。
  • Maven命令的生命周期

    2019-12-31 10:56:41
    Maven命令,比如mvn compile、mvn install、mvn package等,一直让我很迷惑,如果... 校验项目是否正确并且所有必要的信息可以完成项目构建过程。 initialize(初始化) 初始化构建状态,比如设置属性...
  • 信息系统开发方法-生命周期

    千次阅读 2020-06-29 21:35:14
    生命周期按阶段划分,提出是组织、管理和控制信息系统开发过程的一种基本框架,原则性地指导两部分工作: 1.管理:强调进程安排、资源分配、评估、控制、反馈 2.开发:强调任务和开发文档 一般将生命周期法划分...
  • bean的生命周期

    2011-02-17 17:43:03
    在传统的Java应用中,Bean...理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程。 1. 容器寻找Bean的定义信息并且将其实例化。2.受用依赖注入,Spring按照Bean定义信息配...
  • 生命周期模型 开发阶段 zhengkai.blog.csdn.net 适用项目 瀑布模型 计划,需求,设计,编码,测试,运行维护 需求确定,变化小;升级项目或者以前开发过类似项目 螺旋模型 制定计划,风险分析,实施过程,...
  • 除了卡制造过程之外,智能卡的生命周期还依赖于其中所存有的应用。例如,与信用卡的芯片相比,GSM卡的结构显然有所不同。然而,不同应用类型的卡仍有许多共同的地方。  150 10202-1标准试图对所有制造方法,以及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,877
精华内容 750
关键字:

信息的生命周期过程