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

沈阳市网站建设_网站建设公司_阿里云_seo优化

空间有了怎么做网站,中国定制家具网,swoole 网站开发,wordpress汉化版博客JVM 可达性分析法 1. 垃圾回收器的基本概念 什么是垃圾回收器#xff1a;JVM 为 Java 提供了垃圾回收机制#xff0c;其实是一种偏自动的内存管理机制。简单来说#xff0c;垃圾回收器会自动追踪所有正在使用的对象#xff0c;并将其余未被使用的对象标记为垃圾#xff…JVM 可达性分析法 1. 垃圾回收器的基本概念 什么是垃圾回收器JVM 为 Java 提供了垃圾回收机制其实是一种偏自动的内存管理机制。简单来说垃圾回收器会自动追踪所有正在使用的对象并将其余未被使用的对象标记为垃圾不需要开发者手动进行垃圾回收JVM 自动进行垃圾回收释放内容。 为什么进行垃圾回收如果不进行垃圾回收内存迟早都会被消耗空因为我们在不断的分配内存空间而不进行回收。除非内存无限大我们可以任性的分配不回收但是事实并非如此。所以垃圾回收是必须的。 哪些内存需要回收哪些内存需要回收是垃圾回收机制第一个要考虑的问题所谓“要回收的垃圾”无非就是那些不可能再被任何途径所使用的对象。无需再使用的对象会被标记为垃圾等待JVM回收此部分内存。 TipsJava中通过可达性分析法来检测对象是否为垃圾如果不可达则将对象标记为垃圾会被 JVM 回收接下来我们学习可达性分析法。 2. 可达性分析法基本原理 方法原理通过一系列称为GC Roots的对象作为起始点从这些节点向下搜索搜索所走过的路径称为引用链即GC Roots到对象不可达时则证明此对象是不可用的。 那么问题又来了如何选取 GCRoots 对象呢在 Java 语言中可以作为 GCRoots 的对象包括下面几种 虚拟机栈栈帧中的局部变量区也叫局部变量表中引用的对象方法区中的类静态变量属性引用的对象方法区中常量引用的对象本地方法栈中 JNINative方法引用的对象。 Tips看了如上的原理与 GC Roots 选择的描述感觉概念性问题比较抽象难于理解我们继续通过示例来进一步理解可达性分析法。 3. 可达性分析法示例 上文中提到了可达性分析法是通过 GC Roots 为起点的搜索有四种对象可以作为 GC Roots那么我们通过如下示意图来理解下何为不可达对象。 GC Roots 四种类型解释从上图中我们可以看到四种 GC Roots。这里我们对这四种 GC Roots 做一下更为细致的解释。 虚拟机栈中的引用的对象我们在程序中正常创建一个对象对象会在堆上开辟一块空间同时会将这块空间的地址作为引用保存到虚拟机栈中如果对象生命周期结束了那么引用就会从虚拟机栈中出栈因此如果在虚拟机栈中有引用就说明这个对象还是有用的这种情况是最常见的全局的静态的对象也就是使用了 static 关键字由于虚拟机栈是线程私有的所以这种对象的引用会保存在共有的方法区中显然将方法区中的静态引用作为 GC Roots 是必须的常量引用就是使用了 static final 关键字由于这种引用初始化之后不会修改所以方法区常量池里的引用的对象也应该作为 GC RootsNative 方法引用对象这一种是在使用 JNI 技术时有时候单纯的 Java 代码并不能满足我们的需求我们可能需要在 Java 中调用 C 或 C 的代码因此会使用 native 方法JVM 内存中专门有一块本地方法栈用来保存这些对象的引用所以本地方法栈中引用的对象也会被作为 GC Roots。 从上图来理解可达性分析法就会非常简单四种 GC Roots 无非是 Java 中的引用对象从GC Roots 出发类似于我们使用开发工具看代码发现某部分代码用不到了我们就会删除这部分代码。其实可达性分析法也是如此发现某些对象不可达了就会被垃圾回收器收集。 从上图中来看对象 ABCDEF 为可达对象而对象 GHIJK 为不可达对象会被标记为垃圾对象最终被垃圾回收器回收。 ​ JVM 四种引用 1. 可达性分析的四种引用类型 上节内容讲解了可达性分析可达性分析的 GC Roots 均为引用对象那么引用对象有 4 种引用类型如下 强引用软引用弱引用虚引用。 2. 强引用 定义强引用就是指在程序代码之中普遍存在的类似Object obj new Object()这类的引用只要强引用还存在垃圾收集器永远不会回收掉被引用的对象。当内存空间不足Java 虚拟机宁愿抛出 OutOfMemoryError 错误使程序异常终止也不会靠随意回收具有强引用的对象来解决内存不足的问题。 代码示例 public class DemoTest {public static void main(String[] args) {Object obj new Object(); // 强引用} } 代码块12345在强引用的定义中有这样一句话“只要强引用还存在垃圾收集器永远不会回收掉被引用的对象。” 那么有没有办法将强引用消除呢? 消除强引用示例代码 public class DemoTest {public static void main(String[] args) {Object obj new Object(); // 强引用obj null; //消除强引用} }如果不使用强引用时可以赋值 objnull显示的设置 obj 为 null则 gc 认为该对象不存在引用这时候就可以回收此对象。 3. 软引用 定义软引用用来描述一些还有用但并非必需的对象。对于软引用关联着的对象如果内存充足则垃圾回收器不会回收该对象如果内存不够了就会回收这些对象的内存。 在 JDK 1.2 之后提供了 SoftReference 类来实现软引用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列ReferenceQueue联合使用如果软引用所引用的对象被垃圾回收器回收Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 软引用使用场景Android 应用图片 软引用主要应用于内存敏感的高速缓存在 Android 系统中经常使用到。一般情况下Android 应用会用到大量的默认图片这些图片很多地方会用到。如果每次都去读取图片由于读取文件需要硬件操作速度较慢会导致性能较低。所以我们考虑将图片缓存起来需要的时候直接从内存中读取。 但是由于图片占用内存空间比较大缓存很多图片需要很多的内存就可能比较容易发生 OutOfMemory 异常。这时我们可以考虑使用软引用技术来避免这个问题发生。 SoftReference 可以解决 OOM 的问题每一个对象通过软引用进行实例化这个对象就以cache的形式保存起来当再次调用这个对象时那么直接通过软引用中的 get() 方法就可以得到对象中的资源数据这样就没必要再次进行读取了直接从 cache 中就可以读取得到当内存将要发生 OOM 的时候GC 会迅速把所有的软引用清除防止 OOM 发生。 4. 弱引用 定义弱引用描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前垃圾收集器工作之后无论当前内存是否足够都会回收掉只被弱引用关联的对象。Java 中的类 WeakReference 表示弱引用。 代码示例 import java.lang.ref.WeakReference;public class Main {public static void main(String[] args) { WeakReferenceString sr new WeakReferenceString(new String(hello)); System.out.println(sr.get());System.gc(); //通知JVM的gc进行垃圾回收System.out.println(sr.get());} }结果验证第二个输出结果是 null这说明只要 JVM 进行垃圾回收被弱引用关联的对象必定会被回收掉。 hello null5. 虚引用 定义虚引用顾名思义就是形同虚设与其他几种引用都不同虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用那么它就和没有任何引用一样在任何时候都可能被垃圾回收。虚引用在 Java 中使用 java.lang.ref.PhantomReference 类表示。 作用虚引用主要用来跟踪对象被垃圾回收的活动。 虚引用与软引用和弱引用的区别虚引用必须和引用队列ReferenceQueue联合使用。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象的内存之前把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列那么就可以在所引用的对象的内存被回收之前采取必要的行动。 使用示例虚引用必须和引用队列ReferenceQueue联合使用 import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; public class Main {public static void main(String[] args) {ReferenceQueueString queue new ReferenceQueueString();PhantomReferenceString pr new PhantomReferenceString(new String(hello), queue);System.out.println(pr.get());} }JVM 常见的垃圾回收算法 1. 垃圾回收算法种类 我们先来讨论一个问题垃圾回收算法有几种 如果单纯从一些博客或者论坛上的内容来说部分作者会将垃圾回收分为如下 4 种算法 标记-清除Mark-Sweep算法复制coping算法标记-整理Mark-Compact算法分代收集算法。 但是这种分类是不准确的准确来说垃圾回收只有 3 种算法 标记-清除Mark-Sweep算法复制coping算法标记-整理Mark-Compact算法。 为什么会有所谓的“分代收集算法”呢 此处我们埋下一个伏笔后文中我会在适当的地方给予解释。 2. 标记-清除Mark-Sweep算法 标记 - 清除Mark-Sweep算法是最基本的算法。 基本概念标记-清除算法就如同它的名字一样分为“标记”和“清除”两个阶段 首先标记出所有需要回收的对象这就是标记阶段标记完成后统一回收所有被标记的对象这就是所谓的清除阶段。 缺点这种算法的不足主要体现在效率和空间。 从效率的角度讲标记和清除两个过程的的效率都不高从空间的角度讲标记清楚后会产生大量不连续的内存碎片内存碎片太多可能会导致以后程序运行过程中在需要分配较大对象时无法找到足够的连续内存而不得不提前触发一次垃圾回收动作。 为了更加透彻的理解标记-清除Mark-Sweep算法我们来看下如下示意图通过直观的图形展示彻底搞懂标记-清除Mark-Sweep算法。 3. 复制coping算法 Tips前文提到过标记-清除Mark-Sweep算法从效率的角度讲标记和清除两个过程的的效率都不高为了提升效率我们引出了复制coping算法。 基本概念复制算法是为了解决效率问题而出现的它将可用的内存分为两块每次只用其中的一块当这一块内存用完了就将还存活着的对象复制到另外一块上面然后再把已经使用过的内存一次性清理掉。这样每次只需要对整个半区进行内存回收内存分配的执行过程如下图所示 缺点不过这种算法有个缺点内存缩小为原来的一半这样代价太高了。 现在的商用模拟机都采用这种算法来回收新生代不过研究表明11的比例非常不科学因此新生代的内存被划分为一块较大的Eden空间和两块较小的Survivor空间每次使用Eden和其中一块Survivor。 每次回收时将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor空间上最后清理掉Eden和刚才使用过的Survivor空间。 HotSpot虚拟机默认Eden区和Survivor区的比例为81意思是每次新生代中可用内存空间为整个新生代容量的90%。当然我们没有办法保证每次回收都只有不多于10%的对象存活当Survivor空间不够用时需要依赖老年代进行分配担保Handle Promotion。 4. 标记-整理Mark-Compact算法 Tips复制算法在对象存活率较高的场景下要进行大量的复制操作效率还是很低。并且每次只使用一半的内存空间资源浪费严重。标记-整理Mark-Compact算法解决了内存利用率的问题并且减少了大量复制的问题。 根据老年代的特点有人提出了另外标记-整理Mark-Compact算法标记过程与标记-整理Mark-Compact算法一样不过不是直接对可回收对象进行整理而是让所有存活对象都向一端移动然后清理掉边界以外的内存。标记-整理算法的工作过程如图 5. 分代收集 问题我们上文埋下了伏笔分代清理到底是不是第四种算法呢 解答不是我们通常称之为分代收集理论或称之为分代收集思想。目前虚拟机基本都采用分代收集理论来进行垃圾回收。 分代收集理论结合了以上的 3 种算法根据对象的生命周期的不同将内存划分为几块然后根据各块的特点采用最适当的收集算法。准确的说分代收集理论就是在不同的内存区域使用不同的算法它是以上 3 种算法的使用者。 因此说分代清理并非是一种单独的算法而是一种收集理论。 MinorGC、MajorGC、FullGC垃圾回收介绍 MinorGC 新生代垃圾回收 JDK1.8 堆内部结构 从年轻代空间包括 Eden 和 Survivor 区域回收内存被称为 Minor GC也叫Young GC。因为Java对象大多具备朝生夕死的特征所以MinorGC非常频繁一般回收速度也比较快。一般采用复制算法。 说明Minor GC可能会引发STW暂停其他用户的线程需要等JVM垃圾回收结束后用户线程才恢复运行。 Minor GC 触发条件 Eden伊甸园区满了新new的对象需要分配到新生代的Eden伊甸园区当Eden区的空间不够的时候需要进行MinorGC策略回收 Major GC老年代垃圾回收 Major GC指发生在老年代的GC。 Major GC触发条件 老年代空间不足时会先尝试触发Minor GC。Minor GC之后空间还不足则会触发Major GC。 说明发生在老年代的GC 基本上进行一次Major GC 就会伴随进行一次 Minor GC。Major GC 的速度一般会比 Minor GC 慢 10 倍并且STW的时间更长。 Full GC 新生代老年代垃圾回收 Full GC可以理解为Major GCMinor GC组合后进行的一整个过程是清理JVM整个堆空间年轻代和老年代空间。 Full GC触发条件 调用System.gc()方法时可通过-XX: DisableExplicitGC 参数来禁止调用System.gc()当方法区空间不足时Minor GC后存活的对象大小超过了老年代剩余空间Minor GC时中Survivor幸存区空间不足时判断是否允许担保失败不允许则触发Full GC。允许并且每次晋升到老年代的对象平均大小老年代最大可用连续内存空间也会触发Full GCCMS GC异常CMS运行期间预留的内存无法满足程序需要就会出现一次“Concurrent Mode Failure”失败会触发Full GC STWStop The World垃圾回收发生过程中会产生应用程序的停顿现象。停顿产生的时候整个应用程序线程都会被暂停有点应用程序像卡死的情况。 JVM 垃圾回收器分类 1. 前言 本节主要讲解 7 种垃圾回收器其中有 3 种垃圾回收器是作用于年轻代垃圾回收的收集器另外 3 种圾回收器是作用于老年代垃圾回收的收集器剩余的 1 种垃圾回收器能够同时作用于年轻代和老年代。 7 种垃圾回收器以及其作用的内存区域如下图所示 2. Serial收集器 基本概念Serial收集器是最基本、发展历史最久的收集器这个收集器是采用复制算法的单线程的收集器。 Tips从概念上来看我们需要注意Serial收集器的两个特点一个是采用复制算法另外一个是单线程收集。 单线程的收集器单线程一方面意味着他只会使用一个 CPU 或者一条线程去完成垃圾收集工作另一方面也意味着他进行垃圾收集时必须暂停其他线程的所有工作直到它收集结束为止。 不过实际上到目前为止,Serial收集器依然是虚拟机运行在 Client 模式下的默认新生代收集器因为它简单而高效。Serial 收集器运行过程如下图所示 3. Parnew收集器 基本概念Parnew 收集器其实就是Serial收集器的多线程版本除了使用多线程进行垃圾收集外其余行为和 Serial 收集器完全一样但是他却是 Server 模式下的虚拟机首选的新生代收集器。 Tips从概念上来看我们需要注意Parnew收集器的两个特点一个是采用复制算法另外一个是多线程收集。 特点 除了 Serial 收集器外目前只有它能与 CMS 收集器配合工作。CMS 收集器第一次实现了让垃圾收集器与用户线程基本上同时工作Parnew 收集器默认开启的收集线程数与 CPU 数量相同在 CPU 数量非常多的情况下可以使用 -XX:ParallelGCThreads 参数来限制垃圾收集的线程数。 Parnew 收集器运行过程如图所示 4. Parallel Scavenge收集器 基本概念Parallel Scavenge 收集器也是一个新生代收集器也采用了复制算法也是并行的多线程收集器。Parallel Scavenge 收集器的目标是达到一个可控制的吞吐量。Parallel Scavenge 收集器是虚拟机运行在 Server 模式下的默认垃圾收集器。被称为“吞吐量优先收集器”。 Tips从概念上来看我们需要注意Parallel Scavenge收集器的三个个特点一个是采用复制算法一个是多线程收集一个是达到控制吞吐量的目标。 Parallel Scavenge 收集器运行过程同 Parnew 收集器一样 控制吞吐量CMS 等收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间而 Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量。所谓吞吐量就是 CPU 用于运行用户代码时间与 CPU 总消耗时间的比值即吞吐量运行用户代码时间/运行用户代码时间垃圾收集时间。 空间吞吐量参数介绍虚拟机提供了-XXMaxGCPauseMills 和 -XXGCTimeRatio 两个参数来精确控制最大垃圾收集停顿时间和吞吐量大小。不过不要以为前者越小越好GC 停顿时间的缩短是以牺牲吞吐量和新生代空间换取的。由于与吞吐量关系密切Parallel Scavenge 收集器也被称为“吞吐量优先收集器”。 Parallel Scavenge 收集器有一个参数 -XXUseAdaptiveSizePolicy 参数这是一个开关参数这个参数打开之后就不需要手动指定新生代大小、Eden 区和 Survivor 参数等细节参数了虚拟机会根据当前系统的运行情况以及性能监控信息动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。 如果对于垃圾收集器运作原理不太了解以至于在优化比较困难的时候可以使用 Parallel Scavenge收集器配合自适应调节策略把内存管理的调优任务交给虚拟机去完成。 5. Serial Old收集器 基本概念 Serial Old 收集器同样是一个单线程收集器作用于老年代使用“标记-整理算法”这个收集器的主要意义也是在于给 Client 模式下的虚拟机使用。 Serial Old 收集器运行过程如图所示 6. Parallel Old收集器 基本概念 Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本使用多线程和“标记-整理算法”进行垃圾回收。 这个收集器在 JDK 1.6 之后的出现“吞吐量优先收集器”终于有了比较名副其实的应用组合在注重吞吐量以及 CPU 资源敏感的场合都可以优先考虑 Parallel Scavenge收集器Parallel Old收集器 的组合。 Parallel Scavenge 收集器Parallel Old 收集器 的组合运行过程如下图所示 7. CMS收集器 基本概念CMSConrrurent Mark Sweep连续标记扫描收集器是以获取最短回收停顿时间为目标的收集器。使用标记-清除算法。 收集步骤收集过程分为如下四步 初始标记标记 GCRoots 能直接关联到的对象时间很短并发标记进行 GCRoots Tracing可达性分析过程时间很长重新标记修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录时间较长并发清除回收内存空间时间很长。其中并发标记与并发清除两个阶段耗时最长但是可以与用户线程并发执行。 CMS 收集器运行过程如下图所示: 8. G1收集器 基本概念G1 是目前技术发展的最前沿成果之一HotSpot开发团队赋予它的使命是未来可以替换掉 JDK1.5 中发布的 CMS 收集器。 与其他GC收集器相比G1收集器具有以下特点 并发和并行使用多个 CPU 来缩短 Stop The World 停顿时间与用户线程并发执行分代收集独立管理整个堆但是能够采用不同的方式去处理新创建对象和已经存活了一段时间、熬过多次 GC 的旧对象以获取更好的收集效果空间整合基于标记-整理算法无内存碎片产生可预测的停顿能建立可预测的停顿时间模型能让使用者明确指定在一个长度为 M 毫秒的时间片段内消耗在垃圾收集器上的时间不得超过N毫秒。 在G1之前的垃圾收集器收集的范围都是整个新生代或者老年代而 G1 不再是这样。使用 G1 收集器时Java 堆的内存布局与其他收集器有很大差别它将整个Java堆划分为多个大小相等的独立区域Region虽然还保留有新生代和老年代的概念但新生代和老年代不再是物理隔离的了它们都是一部分可以不连续Region 的集合。 9. 小结 本节主要讲解了 7 种垃圾收集器Serial 收集器Parnew 收集器Parallel Scavenge 收集器Serial Old 收集器Parallel Old 收集器CMS 收集器和G1 收集器。 其中专门针对年轻代的收集器有 Serial 收集器Parnew 收集器和 Parallel Scavenge 收集器专门作用于老年代的收集器有Serial Old 收集器Parallel Old 收集器和 CMS 收集器而 G1 收集器即能够作用于年轻代也能够作用于老年代。
http://www.ihoyoo.com/news/46562.html

相关文章:

  • 相亲网站怎么做的网站交易截图可以做证据吗
  • html5购物网站wordpress分类多重筛选
  • 河北省建设集团有限公司网站php网站模板源码下载
  • 徐州做网站谁家最专业找别人做淘客网站他能改pid吗
  • 马鞍山网站建设咨询电代理办公司注册大概多少钱
  • 网站流量统计工具网站建设与网页制作实训报告
  • 网站开发平台选择ip地址免费
  • 替别人做网站管理员甘肃百度推广电话
  • 网站搭建报价表义乌开锁做网站哪个好
  • 网站建站网站建站重庆seo论
  • 机票便宜网站建设做阿里云网站空间
  • 网站被百度降权了怎么办雄安移动网站建设
  • 网站设计 导航条营销策划方案步骤
  • 如何做好电子商务网站开发企业网站网络营销
  • 网站备案中国开头wordpress获取当前分类
  • 网站关键字被百度收录wordpress添加追番
  • 做目的旅游网站的南昌网站全新开发
  • 企业建站技术wordpress无法超链接
  • 石景山网站建设公司vi设计基本要素
  • 网站建设对于电子商务的意义杂志 wordpress
  • jsp网站开发简单代码网站后台账号密码获取
  • 设置 wap网站广东米可信息技术有限公司
  • 会展相关网站建设情况wordpress页面文件路径
  • 网站如果直接点击拨打电话企业网站建设ppt模板
  • 山东省示范校建设网站pc网站和移动网站
  • 联合易网做网站小学生手工
  • 网站建设中颜色的感染力广告策划书模板word
  • 广州网站设计后缀江门市建设工程投标网站
  • 丰台网站开发公司asp网站开发的实训报告
  • asp网站制作免费模板下载全媒体运营师报考条件