当前位置 > 首页 > 国际新闻 > 正文

JVM笔记(三)_运维_DavidSoCool的博客-CSDN博客
  • 发布时间:2020-03-09
  • www.zzqgjd.cn
  • 1垃圾收集

    1.1如何确定对象是垃圾?

    如果你想回收垃圾,你必须首先知道什么样的对象是垃圾。

    1.1.1引用计数

    对于一个对象,只要应用程序持有对该对象的引用,该对象就不是垃圾。如果一个对象没有任何指针来引用它,它就是垃圾。

    渎职:如果上诉机构互相引用,它将永远不会被回收。

    1.1.2可达性分析

    通过气相色谱根对象,开始向下查看对象是否可以用作气相色谱根:类加载器、线程、虚拟机堆栈的局部变量表、静态成员、常量引用、局部方法堆栈的变量等。

    1.2垃圾收集算法

    已经能够确定一个对象为垃圾,那么接下来要考虑的就是回收,如何回收?

    必须有相应的算法,下面是常见的垃圾收集算法。

    1.2.1标记-扫描)

    1。标记

    找出内存中需要回收的对象并将其标记出来

    此时将扫描堆中的所有对象以确定需要回收的对象,这需要

    ?2.清除

    清除要回收的标记对象并释放相应的内存空间?清除

    defect

    标志后,将会产生大量不连续的内存碎片。太多的空间碎片可能导致无法找到足够的连续内存,并且在进程中需要分配更大的对象时,必须提前触发另一个垃圾收集操作。(1)标记和清除既耗时又低效(2)会产生大量不连续的内存片段。太多的空间碎片可能导致无法找到足够的连续内存,并且在程序运行过程中需要分配较大的对象时,必须提前触发另一个垃圾收集操作。

    1.2.2 Copying)

    将内存分成两个相等的区域,每次只使用其中一个,如下图所示:

    当一个内存用完时,将幸存的对象复制到另一个上,然后清空一次已用的内存空间。

    劣势:空间利用率降低。

    1.2.3标记-压缩)

    标记过程仍与“标记-清除”算法相同,但下一步不是直接清理可回收对象,而是将所有活动对象移动到一端,然后直接清理末端边界外的内存。

    让所有有生命的物体移动到一端来清理边界上的意外记忆。

    1.3 Generation Collection Algorithm

    由于上面介绍了三种垃圾收集算法,在堆内存中使用哪一种?

    年轻区:复制算法(对象分配后生命周期较短,年轻区的复制效率相对较高)

    老区:标记清除或标记排序(老区的对象存活时间较长,所以不需要复制和复制,为什么不做标记后再清理呢)?

    1.4垃圾收集器

    如果收集算法是内存恢复的方法,那么垃圾收集器就是内存恢复的具体实现,简单地说,它就是失败的地方。

    1.4.1串行采集器

    串行采集器是一种有着悠久发展历史的基本采集器。它曾经(在JDK1.3.1之前)是新一代虚拟机集合的唯一选择。

    它是单线程收集器,这不仅意味着它只使用一个CPU或一个收集线程来完成垃圾收集,更重要的是,它需要在垃圾收集过程中挂起其他线程。

    1.4.2 ParNew Collector

    优点:简单高效,具有高单线程收集效率

    缺点:收集过程需要挂起所有线程

    算法:复制算法

    应用范围:新生代

    应用:默认新生代收集器处于客户端模式?

    1 . 4 . 3 ParallelsCavenge Collector

    Parallel扫气收集器是新一代收集器。它也是一个使用复制算法的收集器和一个并行多线程收集器。它看起来和ParNew一样,但是ParallelScavenge更关注系统的吞吐量。

    吞吐量=运行用户代码的时间/(运行用户代码垃圾收集时间)

    例如,虚拟机总共运行100分钟,垃圾收集时间为1分钟,吞吐量=(100-1)/100=99%。

    如果吞吐量较高,意味着垃圾收集时间较短,那么用户代码可以充分利用CPU资源,尽快完成程序的计算任务。

    1.4.4串行旧收集器

    串行旧收集器是串行收集器的旧版本,也是单线程收集器。不同的是它采用“标记-排序计算方法”,其操作过程与串行采集器相同。

    1.4.5并行旧收集器

    并行旧收集器是并行清除收集器的旧版本,它使用多线程和“标记和排序算法”进行垃圾收集。

    吞吐量优先级

    1.4.6 CMS收集器

    CMS(并发标记扫描)收集器是一种旨在获得最短回收暂停时间的收集器。整个过程分为4个步骤。

    (1)初始标记?Csminitialmark标记气相色谱根可以关联的对象?停止世界-非常快

    (2)并发标记?用于气相色谱根追踪的CMS并发标记

    (3)重新标记?CMS备注?由于用户程序更改而修改并发标记的内容?停止世界(4)和净化?由于收集器线程可以在整个过程中通过并发标记和并发清除与用户线程一起工作,因此,CMS收集器的内存回收过程通常与用户线程同时执行。

    优点:并发收集,低暂停。

    缺点:在同时期将会产生大量空间碎片,吞吐量将会下降。

    1,并行性和并发性

    G1功能

    1,并行性和并发性

    2,分代收集(分代的概念仍然保留)

    3,空间整合(它作为一个整体属于“标记和组织”算法,不会造成空间碎片)

    4,可预测的暂停(比CMS更高级的是,用户可以清楚地指定长度为m毫秒的时间段)。垃圾收集所花费的时间不得超过n毫秒)

    当使用G1收集器时,Java堆的内存布局与其他收集器大不相同。它将整个Java堆分成多个大小相等的独立区域。虽然新一代和老一代的概念仍然保留,但新一代和老一代不再是物理上孤立的,它们都是部分区域的集合(不需要连续性)。

    工作过程可分为以下步骤

    1。初始标记?标记gcrooms可以关联的对象并修改TAMS值。临时

    2,用户线程的并发标记需要从gcrooms执行可达性分析,以找出幸存的对象。与用户线程

    3的并发执行。最终标记纠正由于在并发标记阶段并发执行用户程序而改变的数据。需要挂起用户线程

    4并过滤和回收吗?对每个区域的恢复值和成本进行排序,并根据用户预期的气相色谱暂停时间制定恢复计划?

    1.4.8垃圾收集器分类

    只有一个垃圾收集线程可以执行,用户线程被挂起。它适用于内存较小的嵌入式设备。

    并行收集器[吞吐量优先]-并行清除,并行旧

    多个垃圾收集线程并行工作,但用户线程仍在等待。它适用于科学计算、背景处理等交互式场景。

    并发收集器[暂停时间优先]-CMS、G1

    用户线程和垃圾收集线程同时执行(但不一定并行执行,也可以交替执行)。垃圾收集线程在执行时不会暂停用户线程的操作。它适用于具有相对时间要求的场景,例如网络。

    1.4.9了解吞吐量和暂停时间

    暂停时间-垃圾收集器对垃圾收集终端应用程序执行响应的时间

    吞吐量-运行用户代码的时间/(运行垃圾收集用户代码的时间)

    暂停时间越短,越适合需要与用户交互的程序,良好的响应速度可以改善用户体验。高吞吐量可以有效地利用CPU时间尽快完成程序的计算任务。它主要适用于没有太多交互的后台操作。

    摘要:这两个指标也是评估垃圾收集器优势的标准。事实上,调整是基于观察者的两个变量。

    1.4.10如何选择合适的垃圾收集器

    官方网站: SE/8/DOCS/TECHNOTES/Guides/VM/GCTUNING/Collectors。如果内存小于100兆,使用串行收集器;如果是单核且没有暂停时间要求,则使用串行或JVM来选择;如果暂停时间允许超过1秒,则使用串行或JVM来选择

    如果响应时间很重要并且不能超过1秒,那么G1收集使用并发收集器

    吗?

    1.4.11再次理解G1

    JDK 7开始使用,JDK 8非常成熟,JDK 9默认垃圾收集器,适合新老一代。

    确定是否需要G1收集器?

    (1)超过50%的堆被活动对象占据

    (2)对象分配和提升的速度变化很大

    (3)垃圾收集时间相对较长

    1.4.12如何打开所需的垃圾收集器

    serial?

    ?-XX:使用串行?

    -XX:UseSerial Goldgc

    parallel(吞吐量优先):

    -XX:使用并行代码?

    -XX:使用并行收集器(响应时间优先)?

    -XX:使用ConcMarkSweepGC?

    -XX:使用1g GC

    数据源?

    白云信息网 版权所有© www.zzqgjd.cn 技术支持:白云信息网 | 网站地图