继续创造并加速增长!这是我参加“掘金每日计划·六月挑战”的第一天,单击以查看活动的详细信息
生活很短,最好抚养狗
作者:Brucebat.sun
公共帐户:布鲁斯巴特的伪技术鱼池
我相信,无论是知道爪哇的新手还是在工作场所混合了多年的老鸟,他都听说过与JVM的深度调整有关的原则。就作者而言,了解JVM调整是间歇性进行的,但是真正的实际活动从未进行过。直到一段时间以前,当我在网上测试时,我发现机器显然被卡住了,我真的有一个练习理论的机会。由于在热的时候被称为“击打铁”,而这种调整的经验仍然很热,作者正准备与过去的学习理论结合起来进行小摘要。
下面我们将根据以下三个部分讨论和总结:
有必要在这里清楚地表明,由于作者仍然使用JDK1.8进行开发,并且在生产环境中使用的垃圾收集器为CMS,因此以下讨论和摘要将更多地基于这样的基本环境配置。
在这一部分中,我们将不关注JVM的记忆区域和Java内存模型等知识点,而是专注于JVM -Memory Automation Management提供的极为重要的能力。此功能不仅是其中之一JVM的最重要特征,也是JVM的根本原因。
JVM的内存自动化管理主要处理以下两件事:
应当指出,前者的执行策略将受到后者的执行策略的影响,这意味着经典收集理论不仅将应用于对象内存(或垃圾)集合阶段,而且还将在对象内存中扮演角色分销
在分裂中收集的理论:收集该分区的理论主要基于两个代理假设的 - 武器点和强调。垃圾收集,死亡越困难。一般而言,不同区域(新一代和年龄)的不同区域根据物体的年龄进行分配,但是在每个Areathe收集规则中,都会进一步划分。垃圾收集器将根据上述不同区域的不同区域分别回收。除以对象内存。每次都只会回收它们的每个部分。GC回收类型。
Java中有这样的句子:一切都是对象。当我们使用Java语言进行业务逻辑写作时,所有逻辑操作和数据处理都封装在类中。在实际使用中,我们需要创建一个相应类的对象实例来执行特定的方法。在此过程中,我们创建的对象需要分配特定的内存空间,以维护对象自己的信息和hold.jvm的一些信息。在内存分配过程中遵循以下原则:
对象内存的自动回收机制,即我们经常听到的垃圾恢复机制。对象的自动回收机制的目的是删除不再在内存空间中使用的对象,并释放需要需要内存空间的对象的位置。
让我们进一步探索出于上述目的的原因吗?这主要是由Java对象的特征“垂死”引起的。在运行Java应用程序的过程中,将诞生大量对象,大量对象将死亡(不再使用)。执行正常操作。这就像您只吃一顿饭菜一样。你不能再吃一顿饭或火锅。刚度的末端肿胀和破裂。
为此,JVM需要做以下三件事:
要处理的第一件事是通过可访问的分析算法完成的。目前,市场上已知的垃圾收集器是根据该算法生存的。
对第二件事的处理将根据处理第三件事的不同方法进行不同的逻辑执行,主要分为两种类型,标记死亡的所有对象或标记所有幸存的对象。执行对象标记时,JVM需要暂停用户线程。这个过程生动地描述为“阻止世界”。
处理第三件事的主要方法有三种:清除,复制和组织。
直接去除意味着删除所有标记为死亡中的物体中的物体。这种回收方法将导致大量不连续的内存片段生成内存空间。连续可用的内存空间并触发新的垃圾收集动作。
复制操作中对象的逻辑与对象的逻辑和直接删除中的逻辑相反。复制操作将将所有标记为从原始内存区域生存的对象复制到另一个空闲的连续内存空间,然后将原始空间直接引导到原始空间。需要将空间分为两个(半划分复制)或三个(Appel回收)。该方法回收可以确保记忆空间中没有内存片段,但是当对象存活率高较高时,此方法的回收效率大大减少。
为了解决复制操作中存在的问题,组织操作采用所有标记对象的运动到内存空间的末端。移动完成后,将清除剩余的空间以进行内存回收。
从上面的分析中,我们可以看到,在实现内存恢复过程中,JVM需要暂停用户线程(遵循-up为STW),主要在以下两个阶段中:
用户线程的悬架将带来应用程序响应的延迟(这是我们需要调整的目标之一),延迟级别取决于标记的速度和复制/完成速度。这两个将受到要处理的对象数量的影响,并在基于一致性的快照的废物收集前提下,对象数量的数量取决于内存空间的大小。
SO -CALLED:Cheng也是Xiao He,而他被击败了。JVM提供的内存自动化管理能力确实为我们的开发带来了很大的便利,使开发人员可以更多地专注于应用程序本身的逻辑,但是它可以使其更加专注还带来便利并带来一些新问题。对于应用程序,通常会更加关注两个指标 - 响应速度和吞吐量。前者在交互式应用中吸引了更多的关注,而后者在批处理任务处理程序中更加有价值,因此对这两个指标的关注将在不同的系统中有所不同。在JVM中,这两个指标的质量将受垃圾收集过程的停顿影响。
响应速度是指用户程序执行单个用户请求的时间。用户程序执行用户请求的效率将受到资源分配情况的影响,此处提到的资源将包括计算资源(CPU)时间)和存储资源(内存),有时会受到IO资源的影响。在这里,我们主要讨论讨论的前两个。从上述分析中,可以看出,如果您想提高响应速度,则需要在请求执行过程中为用户提供足够的CPU时间和内存。在JVM中,这意味着需要改进垃圾收集的效率。后者将受到硬件资源的限制。在这里,我们更关心如何在修复硬件资源时优化前者。
吞吐量是指在整个程序操作过程中整个程序运行时间中用户程序的运行时间的比例。特定的计算公式如下:
$ $ thyput = frac {用户程序运行时间} {用户程序运行时间 +垃圾收集和运行时间} $ o
从上面的公式可以看出,吞吐量的改善还需要优化垃圾收集的效率,但应注意的是,在响应速度提高和吞吐量提高中,垃圾收集效率提高的重点。垃圾收集的主要因素主要受到两个方面的影响,一个是垃圾收集的频率,另一个是单个垃圾收集的时间。
为了响应速度,垃圾收集效率的判断将仅限于用户请求执行的生命周期。对于相同的请求,用户线程的执行时间相同。只要在此请求中可以减少垃圾收集时间,就可以提高响应速度。因为单个用户请求的执行时间不会很长,并且在执行过程中可能会发生垃圾收集的数量周期相对较小,垃圾收集的效率将集中在减少垃圾收集的停顿。
对于吞吐量,需要在整个应用程序的生命周期内判断垃圾收集的效率。与整个应用程序的运行时间相比,应用程序的长时间运行时间,单个垃圾收集停止的优化是并不是很明显,但是总体收集频率的降低会带来明显的垃圾收集和操作时间。
在以前的内容中,我们说市场上的经典垃圾收集器基于发电理论。垃圾收集器实际上会根据不同年龄的区域回收垃圾回收。这一代的次要GC,主要的GC(只有CMS会执行此行为),对整个新一代和一些旧一代作用(只有G1才能执行这种行为),并作用于整个Java桩和方法Areafull GC。因此,在进行实际调整时,我们还需要结合收集理论以调整相应的内容。
经过先前的分析后,我们可以了解到有两个调整目标:为了提高响应速度,需要减少垃圾收集的停止和垃圾收集频率以增加吞吐量。我们假设必须满足垃圾收集器的标记和回收速度。需要扫描标签的对象越多(或扫描标记所需的内存区域越大),垃圾收集的停止时间越长。因此,如果要减少垃圾收集的停顿,则需要减少相应的内存区域的大小。但是,内存区域的大小决定了分配对象时是否有足够的空间分配。如果没有物体分配的空间,JVM将触发相应的GC类型用于回收存储空间以确保对象的空间分布操作。这意味着内存空间越大,垃圾收集频率越低,记忆空间越少,垃圾收集的频率就越高。这为我们带来了第一个要调整的内容,即Java桩内存。
结合内存分配策略,我们可以知道,对于Java桩内存,我们可以调整新一代的大小,伊甸园区域的比例和新一代的幸存者区域以及直接分配对象的直接分配大小在老年时,收集理论的理论告诉我们,绝大多数物体都是“死于生命和死亡”,因此我们需要确保“短暂的”对象(尤其是短活的“对象)(尤其是那些尤其是优化响应速度或吞吐量或吞吐量。“短活”的大物体可以分配给新一代足够的空间,以防止此类物体错误地分配给老年。在此类物体中进入老年,它将很容易地引起全GC降低垃圾收集的效率。这需要新一代或幸存者区域的大小,或者有必要调整访问权限旧对象存储器。当然,此调整仍需要根据两个主要指标的优化进行。
除了调整记忆外,您还可以通过调整对象的年龄判断来优化垃圾收集的效率。在足够的幸存者空间的情况下,您可以适当提高促进老年人的目标年龄的年龄判断。这样,可以在老年中避免大量物体并造成频繁的全GC。
基本上,调整处理基本上可以通过上述两种方式完成,但是有时基于当前垃圾收集器的调整无法达到理想情况。然后解决提出问题的人。哈哈哈?只是开玩笑,此时,您可以根据应用程序的实际操作更改使用的垃圾收集器,并使用更合适或更高级的垃圾收集器来解决我们的问题。
朋友,如果这仍然不好,您可能需要查看您的代码是否写了一点。
上述一些分析和摘要基于垃圾收集者或以前的经典垃圾收集者。它们不是非常适用于G1和ZGC等新一代。主要原因是,随着垃圾收集器的继续发展,例如对上述新一代新一代的调节不再需要手动处理。G1集合已根据应用程序进行动态调整,以确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保程序确保该程序确保该计划确保该计划确保该计划确保该计划确保程序确保程序确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划确保该计划以确保该计划在最佳情况下执行的程序。这也是我看到一些论坛或观看了一些博客时,我看到有人评论了JVM可能会意识到将来的内存自动化管理,并且没有任何人工调整是必需的。
最后,流行病仍在继续。我希望每个人都能每天关注保护,身体健康并保持良好的心情~~
参考信息原始文本:https://juejin.cn/post/710282592078906591