返回顶部
首页 > 资讯 > 后端开发 > Python >如何有效管理JVM中的垃圾?
  • 667
分享到

如何有效管理JVM中的垃圾?

2024-04-02 19:04:59 667人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

前言 都说JVM是大牛们玩的技术,其实未必,如果面试官和你你谈到Java内存管理,那么首先,我建议你首先要了解Java垃圾收集的工作原理。 因为经常在运行JAVA应用程序时,大多数开

前言

都说JVM是大牛们玩的技术,其实未必,如果面试官和你你谈到Java内存管理,那么首先,我建议你首先要了解Java垃圾收集的工作原理。 因为经常在运行JAVA应用程序时,大多数开发者是使用JVM自动帮你管理GC垃圾回收器(完全不关注,JVM自动完成回收),码农们只关注业务代码实现,不需要关注JVM是怎么管理的,对大家而言,更多人只知道程序正在运行中。但是老铁们,当你写的JAVA程序开始面临性能下降时,码农与架构师的区别就来了,所有的性能问题其实归根到底就是我们的GC回收效率变低了。

因此,让我们首先了解什么是JVM GC模型,然后,我们可以看到如何控制它并分析GC日志以查找应用程序中发生的任何差异。

一、什么是自动垃圾收集?

自动垃圾收集是指对堆内存的查看,并识别哪些对象正在使用哪些对象,以及删除未使用的对象的过程。

首先我们看一下自动GC垃圾收集,它的步骤如下:

1.标记(Marking)

该过程的第一步称为标记。其实就是垃圾收集器识别哪些内存正在使用,哪些内存不在使用的地方。

如果必须扫描系统中的所有对象,将是一个非常耗时的过程。

2.正常删除(Normal Deletion)

正常删除是指移除未引用的对象,留下引用的对象和指向空闲空间的指针。

3.压缩删除(Deletion with Compacting)

要进一步提高性能,除了删除未引用的对象外,还可以压缩剩余的引用对象。

通过将引用的对象移动到一起,这使得新的内存分配更加容易和快速。

二、全自动回收管理

当正在进行垃圾收集时,如果你的应用程序在该时间段内没有响应时,其实我们的期望是,GC应该花费最少的时间来回收它; 当然, 如果花费很多时间,则证明你的应用GC设置是有问题滴。

我们来看看下面的JVM内存模型,它分为不同的部分。JVM堆内存在物理上分为两部分 - Young Generation(新生代)和Old Generation(老年代)。

1.首先,将所有新的对象都分配给伊Eden space(伊甸园)。两个Survivor Space(幸存者区)都是空的。

2.当Eden space(伊甸园)填满时,会触发一个小的垃圾收集。

3.引用的对象被移动到第一个幸存者空间。清除Eden space(伊甸园)时,将删除未引用的对象。

4.下次要GC回收时,Eden space(伊甸园)空间也会发生同样的事情。删除未引用的对象,并将引用的对象移动到幸存者空间。但是,在这种情况下,它们被移动到第二个幸存者空间(S1)。

5.在较小的GC之后,当老化的对象达到一定的年龄阈值(在该示例中为8)时,它们从新生代晋升到老年代。

最终,将对老一代进行主要的GC回收,清理和压缩该空间。

三、如何在Java中调整垃圾收集的优化参数呢?

垃圾收集是指当JVM不再需要对象时,需要将它回收,释放内存。它包括查找不再使用的对象,释放与这些对象关联的内存,并偶尔压缩堆以防止内存碎片。

垃圾收集器使用一个或多个线程来执行回收工作。一般来说,为了完成跟踪对象引用及在内存中移动对象的工作,它需要确保应用程序线程当前没有使用这些对象,如果应用程序线程正在使用对象,GC回收时会导致对象的内存位置发生变化,可能发生不可预测的事情。这就是垃圾收集器在执行某些任务时必须暂停所有应用程序线程的原因。这些暂停有时被称为Stop-The-World暂停(吊炸天,全世界都被停止,哈哈)。

3.1调整堆大小

垃圾收集调优的第一步是**调整堆的大小。**这是因为如果堆太小,则会发生太多的GC回收回收内存次数,这会降低整体应用程序吞吐量。如果堆太大,那么GC回收次数会更少,但GC需要很长的时间,那么你的系统响应时间指标会受到影响。并行收集器特别容易受到堆大小的影响,因此如果你需要大的堆并且暂停时间较短,那么你应该尝试使用G1GC收集器。

**备注:**自从Java 9和Shenandoah垃圾收集器被视为还处于“实验性”阶段,不推荐使用并发标记扫描(CMS)收集器。但如果你正在运行在线交互式应用程序,那么系统会默认选择G1GC收集器,如果你正在运行脱机批处理应用程序,那么并行收集器应该是你的首选,这是我给大家的建议。

**堆的大小由两个值控制:**使用ms标志指定的初始值和使用mx标志指定的最大值。

-Xms1g -Xmx8g

堆的初始大小和最大大小,可以由JVM根据工作负载自动调整堆大小。如果JVM遇到内存压力并且观察到GC执行次数过多,它会不断增加堆,直到内存压力消失为止,或直到堆达到其最大值为止。如果内存压力很低,JVM还可以通过缩小堆大小来决定减少暂停时间。这个过程称为自适应大小调整**,**它不仅可以调整堆的整体大小,还可以调整年轻代和老代的大小和比例。

当然,如果你想调整GC行为和大小,**我建议你可以选择关闭自适应大小调整。**这可以节省JVM,这是计算堆大小所需的一小段时间。你可以通过将标志设置UseAdaptiveSizePolicy为false 来执行此操作。

-XX:-UseAdaptiveSizePolicy

此外,将初始堆大小设置为与最大堆大小相同的值,或将初始新生代大小设置为与最大新生代大小相同的值,这样操作可以有效地关闭自适应大小调整。

一般来说堆大小的最大设置准则就是**最大堆大小不应超过计算机上的物理内存量。**如果你运行多个JVM,则最大堆大小的总和不应超过计算机的物理内存。

3.2调整GC性能

在G1GC中,调整参数MaxGCPauseMillis执行以下所有优化以尝试实现指定的暂停时间目标:

  • 调整堆的大小
  • 更快开始后台处理
  • 调整要提升为旧一代的对象的期限阈值
  • 调整混合GC循环期间处理的旧区域数

3.3修复并发模式失败

**G1GC是一个并发收集器。**这意味着当应用程序线程仍在运行时,垃圾收集进程的某些阶段可以并发运行。并且由于正在运行的应用程序可以继续产生垃圾,我们可能会遇到应用程序耗尽旧代内存而垃圾收集器仍在垃圾收集过程中的情况。也就是说,正在运行的应用程序生成的垃圾比它清理的速度快。**这种情况称为并发模式故障,**具体取决于故障发生的时间。如果您在GC日志中看到很多这些错误; 解决方案是增加堆的大小,更早地启动G1后台处理,或者通过使用更多后台线程来加速GC处理。

要更频繁地执行G1后台活动,您可以降低触发G1循环的阈值。这是通过减少InitiatingHeapOccupancyPercent标志的值来实现的。

-XX:InitiatingHeapOccupancyPercent=45

默认情况下,此标志设置为45。这意味着**当堆填充45%时会触发GC循环。**减少此值意味着GC会更早且更频繁地触发。但应注意的是,该值不会设置为太低而导致GC过于频繁发生的数字。

要增加后台线程数,请使用该ConcGCThreads标志。

-XX:ConcGCThreads=4

此标志的默认值设置为ParallelGCThreads加2 的值除以4.只要计算机上有足够的CPU可用,就可以增加此值而不会导致任何性能损失。

四、总结

如果调整堆大小并调整收集器对你不起作用,**那么你可以尝试另一个收集器。如果你仍然没有取得好成绩,那么你需要考虑调整应用程序代码本身的问题了,好了,写了这么多,希望对大家有帮助。

到此这篇关于如何有效管理JVM中的垃圾?的文章就介绍到这了,更多相关JVM垃圾管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何有效管理JVM中的垃圾?

本文链接: https://lsjlt.com/news/129278.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何有效管理JVM中的垃圾?
    前言 都说JVM是大牛们玩的技术,其实未必,如果面试官和你你谈到Java内存管理,那么首先,我建议你首先要了解Java垃圾收集的工作原理。 因为经常在运行JAVA应用程序时,大多数开...
    99+
    2024-04-02
  • JVM调优之垃圾定位、垃圾回收算法、垃圾处理器的区别有哪些
    本篇内容主要讲解“JVM调优之垃圾定位、垃圾回收算法、垃圾处理器的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JVM调优之垃圾定位、垃圾回收算法、垃...
    99+
    2024-04-02
  • 如何理解JVM全部垃圾回收器
    如何理解JVM全部垃圾回收器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的7种收集器,其适用的范围如图所示Serial、ParNew、Parallel Scaveng...
    99+
    2023-06-19
  • JVM教程之内存管理和垃圾回收(三)
    JVM内存组成结构JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:1)堆所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survi...
    99+
    2023-05-31
    jvm 内存管理 垃圾回收
  • JVM中常见的垃圾收集器有哪些
    这篇文章主要介绍了JVM中常见的垃圾收集器有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java...
    99+
    2023-06-02
  • 快速理解Java垃圾回收和jvm中的stw
    Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与J...
    99+
    2023-05-31
    java jvm ava
  • jvm垃圾收集的基本原则有哪些
    JVM垃圾收集的基本原则有以下几个:1. 引用计数:每个对象都有一个与之关联的计数器,当对象被引用时,计数器加1;当对象的引用被释放...
    99+
    2023-09-25
    jvm
  • win10如何清理垃圾
    本文小编为大家详细介绍“win10如何清理垃圾”,内容详细,步骤清晰,细节处理妥当,希望这篇“win10如何清理垃圾”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。解决方法在电脑桌面上,点击“此电脑”,管理。 选择...
    99+
    2023-07-01
  • macbookairM1如何清理垃圾
    这篇文章主要讲解了“macbookairM1如何清理垃圾”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“macbookairM1如何清理垃圾”吧! macb...
    99+
    2022-12-27
    macbookair
  • jvm垃圾回收机制的原理是什么
    JVM(Java虚拟机)的垃圾回收机制是自动管理内存的一种机制,它通过识别和释放不再被程序使用的对象,以防止内存泄漏和内存溢出等问题...
    99+
    2023-09-25
    jvm
  • 怎么理解JVM1.4.1版本中的JVM垃圾收集策略
    本篇文章给大家分享的是有关怎么理解JVM1.4.1版本中的JVM垃圾收集策略,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们分析了引用计数、复制、标记-清除和标记-整理这些经...
    99+
    2023-06-17
  • JVM中垃圾收集算法的示例分析
    这篇文章给大家分享的是有关JVM中垃圾收集算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是垃圾本文要讲的是垃圾收集算法,那么首先要确定的问题就是什么是垃圾,也就是哪些对象是要被回收的,对此有...
    99+
    2023-06-15
  • JVM中垃圾回收机制的示例分析
    这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、...
    99+
    2023-06-29
  • 如何查看JVM使用的默认的垃圾收集器
    查看JVM使用的默认的垃圾收集器查看步骤cmd执行命令:java -XX:+PrintCommandLineFlags -version输出如下(举例):针对上述的-XX:UsePa...
    99+
    2024-04-02
  • C++ 内存管理中的自动垃圾回收
    c++++ 中自动垃圾回收需要使用第三方工具或库。可以使用智能指针或垃圾回收器库。智能指针自动释放底层对象,而垃圾回收器库使用算法跟踪不再使用的数据结构。案例:使用智能指针 std::s...
    99+
    2024-05-04
    c++ 垃圾回收 垃圾回收器 标准库
  • 如何理解Dotnet的垃圾回收
    本篇内容介绍了“如何理解Dotnet的垃圾回收”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在说垃圾回收之...
    99+
    2024-04-02
  • 如何掌握JAVA性能调优和jvm垃圾回收
    这篇文章主要介绍“如何掌握JAVA性能调优和jvm垃圾回收”,在日常操作中,相信很多人在如何掌握JAVA性能调优和jvm垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 如何理解Java垃圾回收
    这篇文章主要介绍“如何理解Java垃圾回收”,在日常操作中,相信很多人在如何理解Java垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java垃圾回收”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • win10磁盘垃圾如何清理
    在Windows 10中,可以通过以下几种方法清理磁盘垃圾:1. 使用系统自带的磁盘清理工具:- 按下Win + X键,选择“文件资...
    99+
    2023-09-01
    win10
  • win11如何清理磁盘垃圾
    要清理磁盘垃圾,可以按照以下步骤操作:1. 使用磁盘清理工具:在Win11中,可以使用内置的磁盘清理工具来清理垃圾文件。打开“设置”...
    99+
    2023-09-01
    win11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作