使用正确的垃圾收集器将Java内存使用量降至最低

大小对于软件至关重要。 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势。 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序。

这种方法减少了磁盘空间,构建时间和启动时间。 但是,它对RAM使用管理没有足够的帮助。 众所周知,Java在许多情况下会消耗大量内存。 同时,许多人还没有注意到Java在内存使用方面已经变得更加灵活,并且提供了满足微服务需求的功能。 在本文中,我们将分享我们的经验,如何在Java进程中调整RAM的使用以使其更具弹性,并获得更快的扩展和更低的总体拥有成本(TCO)的好处。

缩放有三个选项:垂直,水平以及两者的组合。 为了最大化结果,首先您需要以最佳方式设置垂直缩放。 然后,当您的项目水平增长时,单个容器内的预配置资源消耗将被复制到每个实例,效率将成比例地增长。

如果配置正确,则垂直缩放可完美适用于微服务和整体,可根据容器内的当前负载优化内存和CPU使用率。 选定的垃圾收集器是主要的基础砖之一,其设置会影响整个项目。

OpenJDK有五种广泛使用的垃圾收集器解决方案:

  • G1
  • 平行
  • ConcMarkSweep(CMS)
  • 序列号
  • 雪兰多

让我们看看它们在缩放方面的表现以及可以应用哪些设置来改善结果。

为了进行测试,我们将使用一个示例Java应用程序来帮助跟踪JVM垂直缩放结果: https : //github.com/jelastic/java-vertical-scaling-test

将为每个GC测试启动以下JVM启动选项:

java -XX:+Use[gc_name]GC -Xmx2g -Xms32m -jar app.jar [sleep]

哪里:

  • [gc_name]将替换为特定的垃圾收集器类型
  • Xms是扩展步骤(本例中为32 MB)
  • Xmx是最大缩放限制(本例中为2 GB)
  • [sleep]是内存加载周期之间的间隔(以毫秒为单位),默认为10

目前,为了完全释放未使用的资源,需要调用Full GC。 它可以通过各种选项轻松启动:

  • jcmd <pid> GC.run –执行外部调用
  • System.gc() – 源代码内
  • jvisualvm –通过出色的VisualVM故障排除工具手动进行
  • -javaagent:agent.jar –可插入的常用方法。 Github repo Java Memory Agent上提供了开源自动化附件。

可以在输出日志中跟踪内存使用情况,或使用VisualVM进行更深入的查看。

G1垃圾收集器

对于Java生态系统来说,好消息是,从JDK 9开始,默认情况下启用了现代收缩的G1垃圾收集器。 如果使用较低版本的JDK,则可以使用-XX:+UseG1GC参数启用G1。

G1的主要优势之一是能够压缩可用的内存空间,而无需花费较长的暂停时间和不提交未使用的堆的能力。 我们发现,对于在OpenJDK或HotSpot JDK上运行的Java应用程序进行垂直扩展,此GC是最佳选择。

为了更好地了解JVM在不同的内存压力级别下的行为,我们将运行以下三种情况:1)快速,2)中速和3)内存使用量增长缓慢。 这样,我们可以检查G1人机工程学的智能程度以及GC如何处理不同的内存使用动态。

内存使用量快速增长

java -XX:+UseG1GC -Xmx2g -Xms32m -jar app.jar 0

内存在25秒内从32 MiB增长到1 GiB。

G1内存使用量快速增长

G1内存使用量快速增长

如果内存使用量增长非常快,则根据其内部自适应优化算法,JVM人体工程学将忽略Xms扩展步骤,并更快地保留RAM。 结果,相对于实际使用量的快速增长(蓝色),我们看到了JVM(橙色)的RAM分配要快得多。 因此,即使出现负载峰值,使用G1还是安全的。

中等内存使用量增长

java -XX:+UseG1GC -Xmx2g -Xms32m -jar app.jar 10

在4个周期内,内存在90秒内从32 MiB增长到1 GiB。

有时,要使JVM符合人体工程学,需要几个周期才能找到最佳的RAM分配算法。

G1中型内存使用量增长

G1中型内存使用量增长

如我们所见,JVM在第4 周期中对人体工程学进行了调整,以使垂直扩展在可重复的周期中非常有效

内存使用量增长缓慢

java -XX:+UseG1GC -Xmx2g -Xms32m -jar app.jar 100

内存从32 MiB增长到1 GiB,增量时间增长了大约300秒。 非常灵活和高效的资源扩展符合我们的期望-令人印象深刻。

G1内存使用量增长缓慢

G1内存使用量增长缓慢

如您所见,橙色区域(保留的RAM)随着蓝色区域(实际使用)的增长而缓慢增加。 因此,没有过量使用或不必要保留的内存。

重要提示:激进堆或垂直缩放

用于提高Java应用程序性能的流行JVM配置通常会阻碍有效地垂直扩展的能力。 因此,您需要在优先级之间进行选择,这些优先级对于您的应用程序最重要。

广泛使用的设置之一是激活积极堆,以最大程度地利用堆的物理内存。 让我们分析一下使用此配置时发生的情况。

java -XX:+UseG1GC -Xmx2g -Xms2g

要么

java -XX:+UseG1GC -Xmx2g -XX:+AggressiveHeap
G1激进堆

G1激进堆

如我们所见,保留堆(橙色)是恒定的,并且不会随时间变化,因此容器中没有JVM的垂直缩放。 即使您的应用程序仅使用可用RAM的一小部分(蓝色),其余部分也无法与其他进程或其他容器共享,因为它已完全分配给JVM。

因此,如果要垂直扩展应用程序,请确保未启用主动堆(参数应为-XX:-AggressiveHeap ),也不-XX:-AggressiveHeap -Xms定义为与-Xmx一样高(例如,不要声明-Xmx2g -Xms2g ) 。

并行垃圾收集器

并行是高吞吐量GC,默认情况下在JDK8中使用。 同时,它不适合内存缩减,因此不适合进行灵活的垂直缩放。 为了确认这一点,让我们对示例应用程序进行测试:

java -XX:+UseParallelGC -Xmx2g -Xms32m -jar app.jar 10
平行垃圾收集器

平行垃圾收集器

如我们所见,未使用的RAM不会释放回OS。 带有并行GC的JVM可以永久保留它,甚至不考虑显式的Full GC调用。

因此,如果您希望根据应用程序负载从垂直缩放中受益,请将Parallel更改为JDK中可用的收缩GC。 它将所有活动对象打包在一起,删除垃圾对象,并取消提交未使用的内存并将其释放回操作系统。

串行和ConcMarkSweep垃圾收集器

Serial和ConcMarkSweep也在缩小垃圾收集器,并且可以垂直扩展JVM中的内存使用量。 但是与G1相比,它们需要4个完整的GC周期才能释放所有未使用的资源。

让我们看看这两个垃圾收集器的测试结果:

java -XX:+UseSerialGC -Xmx2g -Xms32m -jar app.jar 10
串行垃圾收集器

串行垃圾收集器

java -XX:+UseConcMarkSweepGC -Xmx2g -Xms32m -jar app.jar 10
ConcMarkSweep垃圾收集器

ConcMarkSweep垃圾收集器

从JDK9开始,可以使用新的JVM选项-XX:-ShrinkHeapInSteps加快内存释放速度,该选项在第一个完整GC周期后立即减少已提交的RAM。

雪兰多亚垃圾收集器

Shenandoah是垃圾收集器中的一颗冉冉升起的新星,该垃圾收集器已经被视为即将推出的JVM垂直扩展最佳解决方案。

与其他服务器相比,主要的不同是能够异步收缩(取消提交未使用的RAM并将其释放给OS),而无需调用Full GC。 Shenandoah可以在检测到可用内存后立即压缩活动对象,清理垃圾并将RAM释放回OS。 省略Full GC的可能性可以消除相关的性能下降。

让我们看看它在实践中如何工作:

java -XX:+UseShenandoahGC -Xmx2g -Xms32m -XX:+UnlockExperimentalVMOptions -XX:ShenandoahUncommitDelay=1000 -XX:ShenandoahGuaranteedGCInterval=10000 -jar app.jar 10

在这里,我们添加了雪南多厄可用的一些额外参数:

  • -XX:+UnlockExperimentalVMOptions –启用下面列出的uncommit选项所需
  • -XX:ShenandoahUncommitDelay=1000 –垃圾收集器将开始取消提交超过此时间(以毫秒为单位)的未使用内存。 请注意,当应用程序想要取回内存时,将延迟设置得太低可能会导致分配停顿。 在实际部署中,建议使延迟大于1秒
  • -XX:ShenandoahGuaranteedGCInterval=10000 -这样可以保证在指定的时间间隔(以毫秒为单位)内的GC周期
雪兰多亚垃圾收集器

雪兰多亚垃圾收集器

雪兰多厄非常灵活,只分配必要的资源。 它还压缩了用过的RAM(蓝色),并即时将未消耗的保留RAM(橙色)释放回操作系统,而无需进行昂贵的Full GC调用。 请注意,此GC是实验性的,因此您对稳定性的反馈将对其创建者有所帮助。

结论

Java会不断完善和适应不断变化的需求。 因此,目前,对于微服务和传统应用程序的云托管而言,RAM的需求不再是问题,因为已经有了正确地对其进行扩展,清理垃圾并释放所需过程资源的正确工具和方法。 通过智能配置,Java对于所有项目范围(从云原生启动到传统企业应用程序)都可以具有成本效益。

翻译自: https://www.javacodegeeks.com/2017/11/minimize-java-memory-usage-right-garbage-collector.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 鼠标画多个圆形_点击鼠标不同的建(左、中、右)画一个不同颜色的圆

[java]代码库import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JFrame;public class T1 extends JFrame{int x;int y;Color c;public T1(){this.setSize(600,400);this.setDefaultCl…

通过粘性仙人掌基元进行延迟加载和缓存

您显然知道什么是延迟加载 &#xff0c;对吗&#xff1f; 而且您无疑知道缓存 。 据我所知&#xff0c;Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality&#xff08;2012&#xff09;》 假设我们需…

java语言编程基础_java语言编程基础

java语言基本要素高级语言如c、c#、java等都有一些共同性的东西&#xff1a;关键字、标识符、运算符、注释、数据类型、常量和变量、语句、函数、数组。高级语言在这些要素上大同小异。Java关键字&#xff1a;一些有特定含义&#xff0c;有专门用途的字符串(keyword)。Java中关…

junit mockito_JUnit和Mockito合作

junit mockito这次&#xff0c;我想对测试框架Mockito进行概述。 毫无疑问&#xff0c;这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 使用Mockito…

debian10树莓派4安装mysql_树莓派4上如何安装 Raspbian Buster

随着 Raspberry Pi 4 主板的问世&#xff0c;了解如何使用Raspbian Buster设置您的操作系统。你的新Pi 4到了邮箱&#xff0c;你已经设置了办公桌&#xff0c;您已准备好安装操作系统。对于初学者来说&#xff0c;Raspbian为Pi制造商提供了出色的桌面体验。最重要的是&#xff…

借助财务客户评估解决方案在云中构建AppDev

现代JBoss BRMS时代最古老的业务逻辑演示是2012年6月发布的“ 客户评估”示例 。 那时&#xff0c;JBoss BRMS包含规则&#xff0c;事件和流程。 该项目提供了一个完整安装和配置的环境&#xff0c;用于展示该项目和所有可用的BPM组件。 它包括一个带有单元测试的JBoss Develo…

jvm 性能_JVM性能魔术

jvm 性能HotSpot是我们众所周知和喜爱的JVM&#xff0c;是Java和Scala汁流淌的大脑。 多年来&#xff0c;许多工程师对其进行了改进和调整&#xff0c;并且每次迭代时&#xff0c;其代码执行的速度和效率都接近于本机编译代码。 JIT&#xff08;“及时”&#xff09;编译器是…

Hollowjars,部署扫描程序以及Wildfly群体为何很棒

在上一篇文章中&#xff0c;我描述了如何使用OpenLiberty和maven作为独立服务器或maven构建的一部分来启动服务器&#xff0c;以及如何创建fatjar包。 在这篇文章中&#xff0c;我正在研究如何使用Wildfly群。 我仍在尝试使MicroProfile在Wildfly full上运行&#xff0c;因此&…

Java调用跟踪系统_Tracer:在分布式系统中的调用跟踪和日志相关

Tracer: Distributed system tracingTracer noun, /ˈtɹeɪsɚ/: A round of ammunition that contains a flammable substance that produces a visible trail when fired in the dark.Tracer is a library that manages custom trace identifiers and carries them through …

java测试netty_《Netty官方文档》基准测试

原文链接 译者&#xff1a;lijunshuNetty有一个模块叫’netty-microbench’&#xff0c;我们可以用他来执行一系列的微型基准测试。Netty-microbench是基于OpenJDK JMH构件的(HotSpot的推荐基准测试方案)。当你开始netty基准测试时&#xff0c;你不需要额外的依赖。运行基准测…

java描边_shape描边设置是否显示四周描边

android:width"1pt"/>android:topRightRadius"30pt"android:bottomRightRadius"30pt" />效果图如下&#xff1a;这里设置了左边描边不显示设置虚线&#xff1a;android:shape"line">android:dashGap"3pt"android:d…

java 垃圾回收手动回收_Java垃圾回收(2)

java 垃圾回收手动回收并行清理 今天&#xff0c;我们介绍了并行GC的工作原理。 具体来说&#xff0c;这是在Eden上运行并行Scavenge收集器&#xff0c;在Tenured一代上运行Parallel Mark and Sweep收集器的组合。 您可以通过传递-XX&#xff1a; UseParallelOldGC来获得此选项…

OpenHub框架进行的异步通信

在本系列的前一部分中&#xff0c;我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。 当源系统无法等待目标系统的响应时&#xff0c;将使用系统之间的异步通信。 有以下几个原因&#xff1a; 源系统必须尽可能地响应 &#xff0c;并且不受外…

工厂设计模式和策略设计模式_设计模式:策略

工厂设计模式和策略设计模式这次我想谈谈策略设计模式 。 通过这种方式&#xff0c;我开始撰写有关行为设计模式的文章。 这种模式表示对象之间的某些交互模式&#xff0c;以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的…

如何将不带web.xml的Spring应用程序部署到Tomcat

介绍 由于Servlet 3规范不再需要web.xml来配置Web应用程序&#xff0c;因此已通过使用注释代替。 在本文中&#xff0c;我们将研究如何在不使用web.xml情况下将简单的基于Spring的应用程序部署到Tomcat 8.5。*。 创建一个空的应用程序 使用以下命令使用maven webapp原型创建一…

Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

资源介绍课程简介:xa0xa0Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频----------------------课程目录Python项目实战篇[初级项目&#xff1a;图片社交电商导购漂流瓶]项目实现功能&#xff1a; 用户注册&#xff0c;登录&#xff0c;登出图片的多种…

设计模式 建造者模式_设计模式:建造者

设计模式 建造者模式有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式&#xff0c;另一种是Builder设计模式。 在某些情况下&#xff0c;您甚至可以结合使用这两种模式。 但是在本文中&#xff0c;我想研究一下Builder设计模式 。 我需要说的第一件事是创造…

在MongoDB和Spring Batch中将XML转换为JSON和原始使用

总览 为什么将XML转换为JSON以在MongoDB中原始使用&#xff1f; 由于MongoDB使用JSON文档存储记录&#xff0c;就像表和行将记录存储在关系数据库中一样&#xff0c;我们自然需要将XML转换为JSON。 某些应用程序可能需要存储原始&#xff08;未修改的&#xff09;JSON&#xf…

java 垃圾回收手动回收_Java垃圾回收(1)

java 垃圾回收手动回收这是有关垃圾收集&#xff08;GC&#xff09;的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收以及不同回收器共有的元素。 我为什么要在乎&#xff1f; 您的Java虚拟机…

使用Apache Isis快速进行SEMAT应用程序开发

TL; DR这篇文章谈论我使用Apache Isis创建并部署到此处的OpenShift Online的SEMAT宠物项目&#xff1a; http&#xff1a; //semat.ofbizian.com Apache Isis 作为主要在后端系统上工作的Java开发人员&#xff0c;我讨厌创建用户界面和处理Java脚本。 幸运的是&#xff0c;有J…