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

java8默认内存收集器

大小对于软件至关重要。 很明显,与大的整体方法相比,在微服务体系结构中使用小片段具有更多优势。 最新的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周期
雪兰多亚垃圾收集器

雪兰多亚垃圾收集器

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

结论

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

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

java8默认内存收集器

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

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

相关文章

oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

问&#xff1a;类的成员函数可以传入线程参数吗&#xff1f;回答&#xff1a;如果c语言的全局函数&#xff0c;可以。如果是类的静态成员函数&#xff0c;可以如果是类的普通成员函数&#xff0c;不可以为什么&#xff1f;《深入探索C对象模型》中提到成员函数时&#xff0c;当…

Linux 系统下命令 unrar 的中文版使用说明

查看英文版&#xff0c;猛戳《Linux 系统下命令 unrar 的英文版使用说明》 $ rar --help用法: rar <命令> -<选项 1> -<选项 N> <压缩档案> <文件...> <文件列表...> <解压缩路径\><命令> a 添加文件到压缩档案 …

如何使用 MySQL 安装后自带的帮助文档

文章目录一、查询帮助文档二、MySQL 相关资源网址一、查询帮助文档 输入命令 ? contents 或者 help contents 来显示所有可供查询的分类&#xff1a; mysql> ? contents; You asked for help about help category: "Contents" For more information, type help…

java设置并行度_控制Java并行流的并行度

java设置并行度在掌握了这些新功能之后&#xff0c;随着Java 9的最新发布&#xff0c;我们有了许多新功能可以用来改进我们的解决方案。 Java 9的发布也是修改我们是否掌握Java 8功能的好时机。 在这篇文章中&#xff0c;我想解决关于Java并行流的最常见的误解。 人们通常说您…

flink读取不到文件_日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践...

简介&#xff1a; 友信金服公司推行全域的数据体系战略&#xff0c;通过打通和整合集团各个业务线数据&#xff0c;利用大数据、人工智能等技术构建统一的数据资产&#xff0c;如 ID-Mapping、用户标签等。友信金服用户画像项目正是以此为背景成立&#xff0c;旨在实现“数据驱…

MySQL 如何将数据表中字符串类型的字段值中的部分字符串替换掉(字符串替换/字符串拼接/生成 SQL 脚本语句)

使用拼接函数(concat)生成更新某字段值的 SQL 脚本语句 一、生成更新字段 logo 的 SQL 脚本语句如下: select concat( update tf_company set logo=, replace(logo,http://www.dpqyw.com:80,http://www.dpqyw.com), ,where company_id=,company_id,

apache pulsar_Apache Pulsar:分布式Pub-Sub消息系统

apache pulsarApache Pulsar是一个开源的分布式pub-sub消息传递系统&#xff0c;最初是由Yahoo创建的&#xff0c;并且是Apache Software Foundation的一部分 。 Pulsar是用于服务器到服务器消息传递的多租户高性能解决方案。 脉冲星的主要功能包括[4]&#xff1a; 对Pulsar…

python deque索引超出范围_Python基础语法

学习Python的四个要素有数据&#xff0c;函数&#xff0c;条件循环和模块一、数据数据是Python编程过程中的原材料&#xff0c;通过导入数据&#xff0c;对数据进行操作&#xff0c;实现预先设想的功能。数据共有5种类型&#xff0c;分别是字符串、数字、容器、布尔值和空值。字…

Path环境变量的理解以及设置MinGW环境变量

配置path环境变量 在使用MinGW的时候&#xff0c;不小心把path变量的东西全部删掉了&#xff0c;结果只能自己重新设置path变量&#xff0c;首先要知道如何设置path变量。 Path路径&#xff1a;用来指定可执行文件的搜索路径&#xff0c;也就是后缀名为.exe文件&#xff0c;方…

写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项

写java代码时的注意事项Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一。 尽管我喜欢这个新的Java类的东西比不喜欢的东西多&#xff0c;但在Java方法中将其用作return类型时&#xff0c;需要考虑一些事情。 我将在本文中讨论其中的一些问题&#xff0c;但不…

Linux 命令之 iconv -- 转换文件的字符编码

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例&#xff08;一&#xff09;对指定文件进行转码&#xff0c;且输出到指定的文件中一、命令介绍 iconv 命令是 Linux 系统自带的用于转换文件编码的命令行工具&#xff0c;iconv 命令用来转换文件的编码方式&#xff…

python asyncio future_Python asyncio.isfuture方法代码示例

本文整理汇总了Python中asyncio.isfuture方法的典型用法代码示例。如果您正苦于以下问题&#xff1a;Python asyncio.isfuture方法的具体用法&#xff1f;Python asyncio.isfuture怎么用&#xff1f;Python asyncio.isfuture使用的例子&#xff1f;那么恭喜您, 这里精选的方法代…

python爬取网站的图片

python爬取网站的图片 本次爬取图片所需要用到的库&#xff1a;Requests库&#xff0c;BeautifulSoup库&#xff0c;正则表达式&#xff0c;os库。 思路&#xff1a;先爬一张图片&#xff0c;再爬一个网站的图片 先爬一张图片&#xff1a; 首先要得到这张图片的地址&#x…

spring 定时器注释_带注释的控制器– Spring Web / Webflux和测试

spring 定时器注释Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是&#xff0c; Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来很相似&#xff0c;但是测试这种端点的方式却完全不同&#xff0c;并且编写这种端点的用户必须知道哪…

python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...

今天为大家分享一篇python 计算方位角实例(根据两点的坐标计算)&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起来看看吧&#xff01;知道两点坐标&#xff0c;怎么计算两点方向的方位角&#xff1f;答&#xff1a;首先计算坐标增量dx&#xff0c;dy(两个…

Java 中的自举类,到底是什么?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/447748200

数据库考研SQL操作

SQL的动词 SQL功能动词数据查询SELECT数据定义CREATE, DROP, ALTER数据操纵INSERT, UPDATE, DELETE数据控制GRANT, REVOKE 注&#xff1a;以下[ ]表示方括号的内容可要可不要&#xff0c;|表示或&#xff0c;//表示注释。 一、数据定义 1.CREATE 定义模式 CREATE SCHEMA &…

objects jdk8_JDK 9:NotNullOrElse方法已添加到Objects类

objects jdk8JDK 9向Objects类添加了一些新方法&#xff0c;包括本文中突出显示的两个static方法&#xff1a; requireNonNullElse&#xff08;T&#xff0c;T&#xff09;和requireNonNullElseGet&#xff08;T obj&#xff0c;Supplier <&#xff1f;extended T>供应商…

用户登陆_华为路由器AAA用户密码登陆你了解吗?

AAA Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;、Accounting&#xff08;&#xff09;它提供了认证、授权、计费三种安全功能,可以验证用户帐户是否合法&#xff0c;授权用户可以访问的服务&#xff0c;并记录用户使用网络资源的…

Java API 文档中的接口方法和抽象方法,有什么区别?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/445956288