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

网站开发毕设开题报告怎么写php 网站 发布

网站开发毕设开题报告怎么写,php 网站 发布,成都开发网站建设,excel怎么做网页1.前言 1.1C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中#xff0c;一个对象如果不再使用#xff0c;需要手动释放#xff0c;否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收#xff0c;而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的…1.前言 1.1C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中一个对象如果不再使用需要手动释放否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的是不再使用的对象在系统中未被回收内存泄漏的积累可能会导致内存溢出。 1.2Java的内存管理 Java中为了简化对象的释放引入了自动的垃圾回收Garbage Collection简称GC机制。通过垃圾回收器来对不再使用的对象完成自动的回收垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。 2.方法区的回收 方法区中能回收的内容主要就是不再使用的类。 判定一个类可以被卸载。需要同时满足下面三个条件 此类所有实例对象都已经被回收在堆中不存在任何该类的实例对象以及子类对象。加载该类的类加载器已经被回收。该类对应的 java.lang.Class 对象没有在任何地方被引用。 由于我们自己编写的类是由应用程序类加载器加载的而这个加载器在运行过程中是不会被回收的所以我们自己编写的类只要被加载就不会被回收 3.堆回收 3.1引用计数法和可达性分析法 引用计数法 引用计数法会为每个对象维护一个引用计数器当对象被引用时加1取消引用时减1。引用计数法的优点是实现简单但是它也存在缺点主要有两点 每次引用和取消引用都需要维护计数器对系统性能会有一定的影响存在循环引用问题所谓循环引用就是当A引用BB同时引用A时会出现对象无法回收的问题。 补充查看垃圾回收日志 如果想要查看垃圾回收的信息可以使用-verbose:gc参数。语法 -verbose:gc 可达性分析算法 Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类垃圾回收的根对象GC Root和普通对象对象与对象之间存在引用关系。 下图中A到B再到C和D形成了一个引用链可达性分析算法指的是如果从某个到GC Root对象是可达的对象就不可被回收而GC Root对象正常情况下是不会被回收的。 哪些对象被称之为GC Root对象呢 线程Thread对象它会关联线程栈帧中的方法参数、局部变量等。系统类加载器加载的java.lang.Class对象它会关联类中的静态变量。监视器对象用来保存同步锁synchronized关键字持有的对象。本地方法调用时使用的全局对象一般不用关注。 3.2五种对象引用 强引用 可达性算法中描述的对象引用一般指的是强引用即是GCRoot对象对普通对象有引用关系只要这层关系存在 普通对象就不会被回收。 软引用 软引用相对于强引用是一种比较弱的引用关系如果一个对象只有软引用关联到它当程序内存不足时就会将软引用中的数据进行回收。在JDK 1.2版之后提供了SoftReference类来实现软引用软引用常用于缓存中。 内存不足时虚拟机尝试进行垃圾回收。如果垃圾回收仍不能解决内存不足的问题回收软引用中的对象。如果依然内存不足虚拟机会抛出OutOfMemory异常。 创建软引用对象 将对象使用软引用包装起来继承SoftReference类的方式来实现软引用 软引用中的对象如果在内存不足时回收SoftReference对象本身也需要被回收。如何知道哪些SoftReference对 象需要回收呢 SoftReference提供了一套队列机制 软引用创建时通过构造器传入引用队列在软引用中包含的对象被回收时该软引用对象会被放入引用队列通过代码遍历引用队列将SoftReference的强引用删除 引用队列里存放的是所有已经被回收数据的软引用对象 弱引用 弱引用的整体机制和软引用基本一致区别在于弱引用包含的对象在垃圾回收时不管内存够不够都会直接被回收。在JDK 1.2版之后提供了WeakReference类来实现弱引用弱引用主要在ThreadLocal中使用。弱引用对象本身也可以使用引用队列进行回收。 虚引用 虚引用也叫幽灵引用/幻影引用不能通过虚引用对象获取到包含的对象。虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知。Java中使用PhantomReference实现了虚引用直接内存中为了及时知道 直接内存对象不再使用从而回收内存使用了虚引用来实现。 终结器引用 最后这两种引用在常规开发中是不会使用的。终结器引用指的是在对象需要被回收时终结器引用会关联对象并放置在Finalizer类中的引用队列中在稍后由一条由FinalizerThread线程从队列中获取对象然后执行对象的finalize方法在对象第二次被回收时该对象才真正的被回收。在这个过程中可以在finalize方法中再将自身对象使用强引用关联上但是不建议这样做。 3.3垃圾回收算法评价标准 Java垃圾回收过程会通过单独的GC线程来完成但是不管使用哪一种GC算法都会有部分阶段需要停止所有的用户线程。这个过程被称之为Stop The World简称STW如果STW时间过长则会影响用户的使用。 ①吞吐量 吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值即吞吐量 执行用户代码时间 / 执行用户代码时间 GC时间。吞吐量数值越高垃圾回收的效率就越高程序执行的效率也越高。 ②最大暂停时间 最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。最大暂停时间越短用户使用系统时受到的影响就越短。 ③堆使用效率 不同垃圾回收算法对堆内存的使用方式是不同的。比如标记清除算法可以使用完整的堆内存。而复制算法会将堆内存一分为二每次只能使用一半内存。 上述三种评价标准堆使用效率、吞吐量以及最大暂停时间不可兼得。 一般来说堆内存越大需要回收的对象可能就越多最大暂停时间就越长。如果想要减少最大暂停时间可能会将很长的一次的回收拆分成多次这样会做很多重复的准备工作就会降低吞吐量。 垃圾回收算法没有最好与最坏不同的垃圾回收算法适用于不同的场景。 3.4垃圾回收算法 ①标记清除算法 标记清除算法的核心思想分为两个阶段 标记阶段将所有存活的对象进行标记。Java中使用可达性分析算法从GC Root开始通过引用链遍历出所有存活对象。清除阶段从内存中删除没有被标记也就是非存活对象。 标记清除算法的优缺点 优点实现简单只需要在第一阶段给每个对象维护标志位第二阶段删除对象即可。缺点 ①碎片化问题由于内存是连续的所以在对象被删除之后内存中会出现很多细小的可用内存单元。如果我们需要的是一个比较大的空间很有可能这些内存单元的大小过小无法进行分配。②分配速度慢。由于内存碎片的存在需要维护一个空闲链表极有可能发生每次需要遍历到链表的最后才能获得合适的内存空间。 ②复制算法 复制算法的核心思想是 准备两块空间From空间和To空间每次在对象分配阶段只能使用其中一块空间From空间在垃圾回收GC阶段将From中存活对象复制到To空间将两块空间的From和To名字互换 演示过程 将堆内存分割成两块From空间 To空间对象分配阶段创建对象。 GC阶段开始将GC Root搬运到To空间将GC Root关联的对象搬运到To空间清理From空间并把名称互换 复制算法的优缺点 优点 ①吞吐量高复制算法只需要遍历一次存活对象 复制到To空间即可比标记-整理 算法少了一次遍历的过程因而性 能较好但是不如标记-清除算法因为标记清除算法不需要进行对象的移动②不会产生碎片化空间复制算法在复制之后就会将对象按顺序放 入To空间中所以对象以外的区域都是可 用空间不存在碎片化内存空间。缺点 内存使用效率低每次只能让一半的内存空间来为创 建对象使用 ③标记整理算法 标记整理算法也叫标记压缩算法是对标记清理算法中容易产生内存碎片问题的一种解决方案。 核心思想分为两个阶段 标记阶段将所有存活的对象进行标记。Java中使用可达性分析算法从GC Root开始通过引用链遍历出所有存活对象。 整理阶段将存活对象移动到堆的一端。清理掉存活对象的内存空间。 标记整理算法的优缺点 优点 ①内存使用效率高整个堆内存都可以使用不会像复制算法只能使用半个堆内存②不会发生碎片化在整理阶段可以将对象往内存的一侧进行移动剩下的空间都是可以分配对象的有效空间缺点 整理阶段的效率不高整理算法有很多种比如Lisp2整理算法需要对整个堆中的对象搜索3次整体性能不佳。可以通过TwoFinger、表格算法、ImmixGC等高 效的整理算法优化此阶段的性能 ④分代GC重点 现代优秀的垃圾回收算法会将上述描述的垃圾回收算法组合进行使用其中应用最广的就是分代垃圾回收算法(Generational GC)。分代垃圾回收将整个内存区域划分为年轻代和老年代年轻代又划分为Eden区伊甸园区和幸存者区包括S0和S1 调整内存区域的大小 对象回收的执行流程 分代回收时创建出来的对象首先会被放入Eden伊甸园区。随着对象在Eden区越来越多如果Eden区满新创建的对象已经无法放入就会触发年轻代的GC称为 Minor GC或者Young GC。Minor GC会把需要eden中和From需要回收的对象回收把没有回收的对象放入To区。接下来S0会变成To区S1变成From区。当eden区满时再往里放入对象依然会发生Minor GC。 此时会回收eden区和S1(from)中的对象并把eden和from区中剩余的对象放入S0接下来S0会变成From区S1变成To区。 注意每次Minor GC中都会为对象记录他的年龄初始值为0每次GC完加1。如果Minor GC后对象的年龄达到阈值最大15默认值和垃圾回收器有关对象就会被晋升至老年代。当老年代中空间不足无法放入新的对象时先尝试minor gc如果还是不足就会触发Full GCFull GC会对整个堆进行垃圾回收。 如果Full GC依然无法回收掉老年代的对象那么当对象继续放入老年代时就会抛出Out Of Memory异常。 对象晋升的特殊情况 当 Eden 区没有足够空间进行分配时虚拟机将发起一次 Minor GC。GC 期间虚拟机又发现对象无法存入 Survivor幸存者 空间所以只好通过 分配担保机制 把新生代的对象提前转移到老年代中去而此时该对象的年龄则不需要达到阈值。 为什么分代GC算法要把堆分成年轻代和老年代 可以通过调整年轻代和老年代的比例来适应不同类型的应用程序提高内存的利用率和性能。新生代和老年代使用不同的垃圾回收算法新生代一般选择复制算法老年代可以选择标记-清除和标记-整理 算法由程序员来选择灵活度较高。分代的设计中允许只回收新生代minor gc如果能满足对象分配的要求就不需要对整个堆进行回收(full gc)STW时间就会减少。 3.5垃圾回收器 如果说收集算法是内存回收的方法论那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现更加没有万能的垃圾收集器我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。 JDK 默认垃圾收集器 JDK 8Parallel Scavenge新生代 Parallel Old老年代JDK 9 ~ JDK20: G1 垃圾回收器的组合关系 由于垃圾回收器分为年轻代和老年代除了G1之外其他垃圾回收器必须成对组合进行使用。 具体的关系图如下 添加JVM参数-XX:UseSerialGC新生代、老年代都将使用串行回收器添加JVM参数-XX:UseParNewGC 新生代使用ParNew回收器 老年代使用串行回收器(JDK9废弃)添加JVM参数-XX:UseParNewGC XX:UseConcMarkSweepGC 新生代使用ParNew回收器老年代使用CMS回收器。添加JVM参数-XX:UseParallelGC 或 -XX:UseParallelOldGC可以使用 Parallel Scavenge Parallel Old这种组合。添加JVM参数-XX:UseG1GC 打开G1的开关 JDK9之后默认不需要打开 年轻代-Serial垃圾回收器 Serial是是一种单线程串行回收年轻代的垃圾回收器采用复制算法回收。 优点单CPU处理器下吞吐量非常出色缺点多CPU下吞吐量不如其他垃圾回收器堆如果偏大会让用户线程处于长时间的等待适用场景Java编写的客户端程序或者硬件配置有限的场景 老年代-SerialOld垃圾回收器 SerialOld是Serial垃圾回收器的老年代版本采用单线程串行回收回收算法采用标记-整理算法 优点和缺点与Serial垃圾回收器一样适用场景①与Serial垃圾回收器搭配使用②作为 CMS 收集器的后备方案 添加JVM参数-XX:UseSerialGC新生代、老年代都将使用串行回收器。 年轻代-ParNew垃圾回收器 ParNew垃圾回收器本质上是对Serial在多 CPU下的优化使用多线程进行垃圾回收。  优点多CPU处理器下停顿时间较短缺点吞吐量和停顿时间不如G1所以在JDK9之后不建议使用适用场景JDK8及之前的版本中与CMS老年代垃圾回收器搭配使用 添加JVM参数-XX:UseParNewGC 新生代使用ParNew回收器老年代使用串行回收器。 添加JVM参数-XX:UseParNewGC XX:UseConcMarkSweepGC 新生代使用ParNew回收器老年代使用CMS回收器。 老年代-CMS(Concurrent Mark Sweep)垃圾回收器 CMS垃圾回收器关注的是系统的暂停时间允许用户线程和垃圾回收线程在某些步骤中同时执行减少了用户线程的等待时间。 从名字中的Mark Sweep这两个词可以看出CMS 收集器是一种 “标记-清除”算法实现的它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤 初始标记用极短的时间标记出GC Roots能直接关联到的对象。并发标记标记所有的对象用户线程不需要暂停。重新标记由于并发标记阶段有些对象会发生了变化存在错标、漏标等情况需要重新标记。并发清理清理死亡的对象用户线程不需要暂停。 优点并发收集、低停顿缺点 ①CMS使用了标记-清除算法在垃圾收集结束之后会出现大量的内存碎片当有不足以提供整块连续的空间给新对象/晋升为老年代对象时又会触发FullGC。②无法处理浮动垃圾在执行并发清理步骤时用户线程也会同时产生一部分可回收对象但是这部分可回收对象只能在下次执行清理是才会被回收。如果在清理过程中预留给用户线程的内存不足就会出现Concurrent Mode Failure一旦出现此错误时便会切换到SerialOld收集方式。③CMS收集器对CPU资源非常敏感,在并发阶段虽然不会导致用户线程停顿但是会因为占用了一部分CPU资源如果在CPU资源不足的情况下应用会有明显的卡顿。 年轻代-Parallel Scavenge垃圾回收器 Parallel Scavenge是JDK8默认的年轻代垃圾回收器 多线程并行回收关注的是系统的吞吐量。具备自动调整堆内存大小的特点。 Parallel Scavenge允许手动设置最大暂停时间和吞吐量。 Oracle官方建议在使用这个组合时不要设置堆内存的最大值垃圾回收器会根据最大暂停时间和吞吐量自动调整内存大小。 设置最大暂停时间 -XX:MaxGCPauseMillisn 设置每次垃圾回收时的最大停顿毫秒数。当我们把最大暂停时间设置更小时Parallel Scavenge回收器会将堆内存减小以减少最大停顿时间。 设置吞吐量 -XX:GCTimeRation 设置吞吐量为n用户线 程执行时间 n/n 1 自动调整内存大小默认开启 -XX:UseAdaptiveSizePolicy设置可以让垃圾回收器根据吞吐量和最大停顿的毫秒数自动调整内存大小 注比较短的最大暂停时间和比较高的吞吐量其实是矛盾的所以如果同时设置了这两者Parallel Scavenge回收器可能只能尽力达成其中一个目标。建议多次测试将两者调成合理的值。 优点吞吐量高而且手动可控。为了提高吞吐量虚拟机会动态调整堆的参数缺点不能保证单次的停顿时间适用场景后台任务不需要与用户交互并且容易产生大量的对象。比如大数据的处理大文件导出 老年代-Parallel Old垃圾回收器 Parallel Old是为Parallel Scavenge收集器 设计的老年代版本利用多线程并发收集。 优点并发收集在多核CPU下效率较高缺点暂停时间会比较长适用场景与Parallel Scavenge配套使用 添加JVM参数-XX:UseParallelGC 或 -XX:UseParallelOldGC可以使用 Parallel Scavenge Parallel Old这种组合。 G1垃圾回收器重点 G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征. JDK9及之后默认的垃圾回收器是G1Garbage First垃圾回收器。JDK9及之后强烈建议使用G1垃圾回收器。 Parallel Scavenge关注吞吐量允许用户设置最大暂停时间 但是会减少年轻代可用空间的大小。 CMS关注暂停时间但是吞吐量方面会下降。 而G1设计目标就是将上述两种垃圾回收器的优点融合 支持巨大的堆空间回收并有较高的吞吐量。 支持多CPU并行垃圾回收。 允许用户设置最大暂停时间。 G1垃圾回收器 – 内存结构 G1出现之前的垃圾回收器内存结构一般是连续的如下图 G1的整个堆会被划分成多个大小相等的区域称之为区Region区域不要求是连续的。分为Eden、Survivor、Old区。Region的大小通过堆空间大小/2048计算得到也可以通过参数-XX:G1HeapRegionSize32m指定(其 中32m指定region大小为32M)Region size必须是2的指数幂取值范围从1M到32M。 年轻代回收Young GC 年轻代回收Young GC回收Eden区和Survivor区中不用的对象。会导致STWG1中可以通过参数-XX:MaxGCPauseMillisn默认200 设置每次垃圾回收时的最大暂停时间毫秒数G1垃圾回收器会尽可能地保证暂停时间。 执行流程 新创建的对象会存放在Eden区。当G1判断年轻代区即伊甸园区和幸存者区不足max默认60%无法分配对象时需要回收时会执行 Young GC。标记出Eden和Survivor区域中的存活对象根据配置的最大暂停时间 选择某些区域和其他垃圾回收器有很大区别将存活对象复制到一个新的Survivor区中年龄1清空这些区域。 后续Young GC时与之前相同只不过Survivor区中存活对象会被搬运到另一个Survivor区。当某个存活对象的年龄到达阈值默认15将被放入老年代。 特殊情况部分对象如果大小超过Region的一半会直接放入老年代这类老年代被称为Humongous区。比如堆内存是 4G每个Region是2M只要一个大对象超过了1M就被放入Humongous区如果对象过大会横跨多个Region。多次回收之后会出现很多Old老年代区此时总堆占有率达到阈值时-XX:InitiatingHeapOccupancyPercent 默认45%会触发混合回收MixedGC。回收所有年轻代和部分老年代的对象以及大对象区。采用复制算法来完成。 G1在进行Young GC的过程中会去记录每次垃圾回收时每个Eden区和Survivor区的平均耗时以作为下次回收时的参考依据。这样就可以根据配置的最大暂停时间计算出本次回收时最多能回收多少个Region区域了。 比如 -XX:MaxGCPauseMillisn默认200每个Region回收耗时40ms那么这次回收最多只能回收4个Region。 混合回收Mixed GC 混合回收分为初始标记、并发标记、最终标记、并发清理G1对老年代的清理会选择存活度(存活的对象数/总对象数)最低的区域来进行回收这样可以保证回收效率最高这也是G1Garbage first名称的由来。 FULL GC 注意如果清理过程中发现没有足够的空Region存放转移的对象会出现Full GC。单线程执行标记-整理算法 此时会导致用户线程的暂停。所以尽量保证应该用的堆内存有一定多余的空间。 优缺点 优点 ①对比较大的堆如超过6G的堆回收时延迟可控②不会产生内存碎片③并发标记采用SATB算法效率高缺点JDK8之前还不够成熟适用场景JDK8最新版本、JDK9之后建议默认使用
http://www.yutouwan.com/news/165496/

相关文章:

  • 建筑工程网人才网长沙seo智优营家
  • 谷歌怎么做网站优化网站开发分析报告
  • 品牌设计公司网站钢铁网站哪家做的好
  • 网站建设是属于什么岗位网站网域名查询
  • 医院网站方案手机图片生成网页链接
  • 大型电商网站建设wordpress如何做产品页
  • 做海报创意网站珠宝网站设计文案
  • 西宁知名网站设计公司开发网站可用性监控
  • 最好的ppt模板网站培训设计软件
  • 惠城营销网站制作长沙软件开发培训机构
  • 新手要如何让网站被收录网站建设报价乱不一
  • 报名网站辽宁省建设银行一般网站字体
  • 永年县网站山东省建设节能协会网站
  • 优化什么建立生育支持政策体系降低生育养育教育成本长沙seo平台
  • 网站开发设计南邮区块链开发语言和工具
  • 免费电子商务网站建设长沙服装定制
  • 美橙互联建站网站被截止wordpress内容页不显示图片
  • 房产网站制作商丘购物网站开发设计
  • 塑胶 东莞网站建设图片网站怎么做优化
  • 下载黑龙江建设网官网网站园林景观设计案例网站
  • 赤峰建网站的电话织梦网站站标
  • 网站设计培训课程百度云网盘资源搜索引擎
  • 机械做卖产品网站陕西网站建设价位多少
  • 做现货去哪些网站营销好呢产品摄影
  • 一般网站建设中的推广费用重庆响应式网页建设公司
  • 甘肃建设体网站首页用adsl做网站备案
  • 上海金山网站建设公司小智logo在线制作
  • 网站页面设计报价公司部门等级划分
  • 网站首页布局设计工具5网站建站
  • 企业网站建设价格表研发项目管理系统