当前位置: 首页 > news >正文

崇左市网站建设_网站建设公司_UI设计师_seo优化

开源php建站系统,网站建设开发流程按钮,做的比较简约的网站,网站的开发包括哪两项文章目录 一、JVM 执行流程二、类加载三、双亲委派模型四、垃圾回收机制#xff08;GC#xff09; 一、JVM 执行流程 程序在执行之前先要把java代码转换成字节码#xff08;class文件#xff09;#xff0c;JVM 首先需要把字节码通过一定的方式 类加载器#xff08;Clas… 文章目录 一、JVM 执行流程二、类加载三、双亲委派模型四、垃圾回收机制GC 一、JVM 执行流程 程序在执行之前先要把java代码转换成字节码class文件JVM 首先需要把字节码通过一定的方式 类加载器ClassLoader 把文件加载到内存中 运行时数据区Runtime Data Area 而字节码 文件是 JVM 的一套指令集规范并不能直接交个底层操作系统去执行因此需要特定的命令解析器 执 行引擎Execution Engine将字节码翻译成底层系统指令再交由CPU去执行而这个过程中需要调 用其他语言的接口本地库接口NativeInterface 来实现整个程序的功能这就是这4个主要组成部分的职责与功能。 总结来看 JVM 主要通过分为以下 4 个部分来执行 Java 程序的它们分别是 类加载器ClassLoader运行时数据区Runtime Data Area执行引擎Execution Engine本地库接口Native Interface JVM 运行时数据区 VM 运行时数据区域也叫内存布局但需要注意的是它和 Java 内存模型(Java Memory Model简称 JMM完全不同属于完全不同的两个概念它由以下 5 大部分组成 Nartiye Method Stacks就表示是JVM内部的C代码就是给调用native方法JVM内部方法准备的栈空间。也就是说C根本不需要虚拟机的他是直接把代码编译成native code,也就是cpu能识别的机器指令。但是java因为有跨平台需求需要用jvmJVM Stacks给java代码使用的栈 注意 这里的栈和数据结构里面的栈并不是同一个意思此处所说的栈指代的就是JVM一块特殊的存储空间对于JVM虚拟栈而言是存储的就是方法与方法之间的调用关系。本地方法栈存储的就是native方法的调用关系。 整个栈空间内部包含很多元素一个元素称之为一个栈帧一个栈帧里包含这个方法的入口地址、方法参数、返回地址、局部变量等 这个栈也是先进后出的但是和数据结构里面的栈是更广泛通用的概念progarm counter pegister程序计数器这是记录当前执行到那一条指令堆是JVM中空间最大的区域new出来的对象就是放在堆上的类的成员变量也是放在堆上的一个进程对应一份堆对应N个栈而栈是每个线程都有独立的栈一个进程对应一个虚拟机两个进程就是两个JVM元数据去方法区主要是常量池静态成员变量类对象就存在这判断某个变量在啥区域 局部变量在栈上 普通成员变量在堆上 静态成员变量在方法区元数据区 二、类加载 类加载简单理解就是.class文件从文件硬盘被加载的内存中元数据这样的过程 1.加载 1通过一个类的全限定名来获取定义此类的二进制字节流。 2将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各种数据的访问入口。 简单来说就是把.class文件找到打开文件读取文件把文件内容读到内存中。 2.验证 这一阶段的目的是确保Class文件的字节流中包含的信息符合java虚拟机规范 这里在说一下类对象实际究竟是什么 这是java虚拟机规范里面标准的类对象结构也就是说在我们java代码写好之后点击运行首先要做的就是将我们代码里面的定义类进行重新定义书写书写的格式就是按照这种类似C结构体的方式去书写这就是我们.class文件。 注意.class文件和类对象是同一个东西的不同形态类对象是我们描述内存里实际存储的对象class文件是这个对象以文件的形式打开后呈现的样子。 3.准备 准备阶段是正式为类中定义的变量即静态变量被static修饰的变量分配内存并设置类变量初始值 的阶段 简单来说给类对象分配内存空间先在元数据占个位置将静态成员变量赋值为0。 4.解析 针对字符串常量进行初始化将符号引用转化为直接引用。一个字符串常量得有一块内存空间存这个字符的实际内容还得有一个引用来保存这个内存空间的起始地址。 在类加载之前字符串常量此时处于.class文件中此时这个引用记录的并不是字符串常量正在的地址而是他在文件中的偏移量或者说占位符或者说符号引用 只有在类加载之后才真的把这个字符常量放到内存中才有了内存地址这个引用才被真正的赋值成内存地址直接引用。 就像看电影之前我只知道自己相对位置只有坐下来之后才知道自己的实际位置 5.初始化 初始化阶段Java 虚拟机真正开始执行类中编写的 Java 程序代码将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。加载父类执行静态代码块的代码等 但是一个类啥时候会被加载并不是java程序一运行就会加载而是真正用到的时候才会去加载懒汉模式 常见的类加载时机 1.构造类的实例new 了一个对象 2.调用这个类的静态方法使用静态属性因为静态的都和类绑定在一起只有类被加载了静态属性才会赋值 3.如果加载一个子类需要先加载其父类 4.如果加载过后续就不需要重新加载 还不太明白的同学可以去看这篇文章 https://blog.csdn.net/Strange_boy/article/details/125717606?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169200970816800226573234%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257Drequest_id169200970816800226573234biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2blogtop_positive~default-1-125717606-null-null.268v1koosearchutm_term%E7%B1%BB%E5%8A%A0%E8%BD%BD%E7%9A%84%E8%BF%87%E7%A8%8Bspm1018.2226.3001.4450 三、双亲委派模型 双亲委派模型描述的是在加载中找.class文件怎么去找的问题 JVM默认提供了三个类加载器 BootstrapClassLoader负责加载标准库中的类。(这是java规范要求提供哪些类无论哪种jvm的实现都会提供这些类) ExtensionClassLoader负责加载JVM扩展库中的类规范之外由实现JVM厂商、组织提供的额外功能 ApplicationClassLoader:负责加载用户提供的第三方库、用户项目代码中的类 三种构成父子关系这个并不是说父类子类的那种继承关系单纯只是比如说ApplicationClassLoader有一个parent引用指向ExtensionClassLoader 上述类是如何配合工作的呢 首先加载一个类的时候先从ApplicationClassLoader开始但是他并不是真加载而是委托给自己的父亲ExtensionClassLoader去加载但是ExtensionClassLoader也委托给自己的父亲去加载BootstrapClassLoader,当BootstrapClassLoader发现没有上层了那么就开始自己加载去所有自己的标准库目录里面的类如果找到就加载如果没找到就有子类加载进行加载。ExtensionClassLoader也是一样最后才是ApplicationClassLoader加载用户定义的类。在ApplicationClassLoader加载完如果还有类没有加载那么ApplicationClassLoader下面也没有子类了就会抛出异常。 之所以这样安排是因为JVM实现这个功能的逻辑是用递归写的目的是为了防止用户创建了一些奇怪的类比如说用户写了个java.lang.String类这样就保证JVM先加载的一定是JVM标准库里的java.lang.String类而不是用户自定义的这个。这样就保证起码标准库和三方库的类不会加载错误所以最多也就是用户自己定义的类加载错误。 四、垃圾回收机制GC 垃圾回收机制就是帮我们回收不再使用的内存。 在C或者C中我们new或者malloc一块空间实际上是在堆上申请了一块内存空间JAVA类似堆上申请和栈上申请是不同的因为堆申请的内存空间必须手动释放C用free 或者delete,但是栈实际上方法执行结束了就自动释放了。堆的这个特性在个人电脑上可能没有太大影响随着进程结束堆的空间即使没回收也会回收。但是如果是服务器就需要考虑这个问题了因为服务器的进程是一直存活的会运行很长时间如果我们用完堆不及时回收的话可能会导致剩余空间越来越少。 GC运行虽然很省心可以帮我们自动回收一些不用的空间但是GC也会带来更大的系统开销对程序的执行效率肯定是会有影响的。因为C追求极致的性能所以并不引入GC机制 注意我们在之前的编程中比如说释放scanner 释放statement,这些不是释放内存而是释放文件。 所以通过上面的背景我们知道GC是针对堆中的数据进行垃圾回收GC是以对象为基本单位进行回收的而不是字节等这样设定的目的就是为了简单。 GC实际工作过程 1.找到垃圾、判定垃圾 关键思路 抓住这个对象看他到底有没有“引用”指向他。 如果一个对象有引用那么就有可能被使用但是如果么有引用那么就一定不会再被使用了。 那么怎么去做就能判断对象是不是被引用了呢 引用计数这不是java的做法而是python/php的方式 给对象增加一个引用计数器每当有一个地方引用它时计数器就1当引用失效时计数器就-1任何时刻计数器为0的对象就是不能再被使用的即对象已死。引用计数法实现简单判定效率也比较高。 但是这个方法的缺点在于内存空间浪费的空间是比较大的。在主流的JVM中没有选用引用计数法来管理内存最主要的原因就是引用计数法无法解决对象的循环引用问题。可达性分析 java中的对象都是通过引用来指向并访问的 一般是一个引用指向一个对象这个对象里的成员又指向别的对象。 实际上整个java中的对象都是通过这样的链式或者树形结构给串起来的。 可达性分析就是把所有这些对象组织的结构看做树从根节点区去遍历所有能被访问到的对象标记为可达不能可达的就会作为垃圾进行回收。 上述操作类似与树遍历这种操作相对于计数来说效率上会慢一点但是会解决循环引用问题此外这个可达性分析不是每时每刻都需要做隔一段时间分析一下就可以了。 可达性遍历的起点一个代码中可能由多个起点可能是 1.栈上的局部变量 2.常量池中的对象 3.静态变量。 如何清除垃圾 标记清除 标记-清除算法是最基础的收集算法。算法分为标记和清除两个阶段 : 首先标记出所有需要回收的 对象在标记完成后统一回收所有被标记的对象。后续的收集算法都是基于这种思路并对其不足加以改进而已。 标记-清除算法的不足主要有两个 : 效率问题 : 标记和清除这两个过程的效率都不高空间问题 : 标记清除后会产生大量不连续的内存碎片空间碎片太多可能会导致以后在程序运行中 需要分配较大对象时无法找到足够连续内存而不得不提前触发另一次圾收集。 复制算法 复制算法是为了解决标记-清理的效率问题。它将可用内存按容量划分为大小相等的两块每次只使 用其中的一块。当这块内存需要进行垃圾回收时会将此区域还存活着的对象复制到另一块上面然后 再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收内存分配 时也就不需要考虑内存碎片等复杂情况只需要移动堆顶指针按顺序分配即可。此算法实现简单运 行高效。算法的执行流程如下图 : 这样是解决了标记算法里面碎片空间的问题但是也有缺点就是空间利用率低如果垃圾少有效对象多复制成本就会加大。 3.整理标记 复制收集算法在对象存活率较高时会进行比较多的复制操作效率会变低。因此在老年代一般不能使用 复制算法。 针对老年代的特点提出了一种称之为标记-整理算法。标记过程仍与标记-清除过程一致但后续步 骤不是直接对可回收对象进行清理而是让所有存活对象都向一端移动然后直接清理掉端边界以外的内存。流程图如下: 但是这个做法效率也不高如果搬运空间比较大开销也还是比较大的。 分代回收 基于上述我们可以将垃圾回收分为不同的场景不同场景使用不同的算法 分代咋分的 实际就基于经验规律如果一个东西存在的时间比较长那么大概率还会存在很长时间。这个经验会与java中的对象也是存在的有相关的实验证明所以可以根据对象生命周期的长短来使用不同的算法。 此时我们对对象引入一个概念对象的年龄对象的年龄用GC扫过的轮次为基本单位扫过一轮没有被销毁就是一岁扫过两轮没有被销毁就是两岁。 所以JVM按照对象的年龄将堆划分为多个区域 刚刚new出来的放入伊甸区年龄是0岁经过一轮之后被放入幸存区。幸存区相对于伊甸区来说要小很多这是因为大部分的对象都是朝生夕死的生命周期是很短的。从伊甸区到幸存区用的就是复制算法到了幸存区之后还是还是要接受周期性的GC考验如果变成垃圾就会被释放如果不是垃圾就拷贝到另外一个幸存区,这 两个幸存区同一时刻只会用一个对象在一轮轮的GC扫描中在两个幸存区中来回拷贝由于幸存区体积不大此处空间浪费也可以接受。如果这个对象已经在两个幸存区中拷贝多次就会进入老年代针对老年代也会周期性的GC扫描但频率会更低如果老年代对象扫描为垃圾就用标记整理的方式进行释放。
http://www.lebaoying.cn/news/57056.html

相关文章:

  • 韩国学校网站模板中国十大品牌网
  • 河南省住房和城乡建设厅网站确认书网站公众平台建设方案
  • php网站优点海天建设集团公司网站
  • 手机网站制作相关文章python做网站框架
  • 校园图书回收网站建设怒江州建设局网站企业备案网站
  • 营销型类型网站有哪些类型wordpress模板 国内
  • 网络优化网站 s怎么做网络彩票网站
  • 长春网站建设免费咨询自己制作图片文字图片
  • 门户和网站的区别苏州制作企业网站公司
  • 河北秦皇岛建设局网站黄山地区建设行业网站
  • php网站插件删除或添加百度提升排名
  • 网站开发后怎么转安卓app昆明有几个区
  • 凡科建站价格设计工作室取什么名字好
  • 怎样做网站的用户分析三河seo
  • 漯河北京网站建设公司网站可以只做移动端吗
  • 专业网站建设代理商网站广告位投放
  • 餐饮酒店网站怎么做wordpress导入失败
  • 运营网站团队建设网站seo服务
  • 免费的招聘网站wordpress显示用户列表
  • 价格合理的网站建设南京建设局的网站首页
  • 建网站花费世界500强企业排名第一
  • 山东建设信息网站遵义市网站建设
  • 简历模板网站免费公司网页网站建设ppt模板
  • 天元建设集团有限公司蒙阴分公司网站seo优化排名
  • 中考管理系统登录网站WordPress做saas
  • 无锡网站建设 app宜昌网站模板
  • 纪检监察网站建设情况汇报网站开发中的服务抽离
  • 网站建设文章缩略图网络营销外包顾问
  • seo外链群发网站用php做的订票网站
  • 连接国外网站的app手机站和微网站的区别