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;当…

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

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

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;方…

python爬取网站的图片

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

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

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

word域变成正常文本_【Word小技巧】不学会后悔哦~

工作中使用Word早已成了习惯&#xff0c;因此&#xff0c;今天小编将为大家分享几个实用的的Word小技巧。重叠字快速录入文字录入是word最基本操作&#xff0c;过程中我们难免要输入重叠字&#xff0c;例如&#xff1a;热热闹闹&#xff0c;卿卿我我等……你知道如何快速录入吗…

sql server 2008 年累计数_Windows Server 2008 和 SQL Server 2008将终止支持 迁移至Azure 微软提供3年免费技术支持...

点击上方蓝色字关注我们~迁移至 Azure 并利用免费扩展安全更新。了解有关支持终止建议的更多信息&#xff0c;请使用浏览器访问&#xff1a;https://www.microsoft.com/zh-cn/sql-server/sql-server-2008.对您意味着什么1 2017年基于风险的安全报告; 思科 2017 年度网络安全报告…

旧版Requests库

requests库基本使用Requests解析库方法response对象response对象的属性**r.encoding**属性与**r.apparent_encoding**属性的区别requests库的异常举例Requests解析库 方法 最常用的两个方法: request.get() request.post() 作用&#xff1a;都是从服务器获取网页信息 区别&…

夸克浏览器怎么安装脚本_iOS 第一浏览器发布安卓版,除了真香我还能说什么...

如果不算 Safari 的话&#xff0c;iOS 平台公认最好的浏览器是 Alook。无推送无新闻无广告、日常售价 12 元、工具类排行第三、7.8 万个评分足以证明其优秀。以至于很多双持或对 Alook 有所了解的用户都希望 Alook 能推出安卓端。现在安卓端真的来了。(安卓端免费)假如这个时候…

Windows 10 笔记本如何使用外接显示器

文章目录如何连接外接显示屏如何设置显示模式如何设置不同显示屏各自的分辨率如何设置主显示器通过显卡来设置显示器如何连接外接显示屏 VGA 线或者 HDMI 线连接好电脑和显示器&#xff0c;以 HDMI 线为例简单讲下吧。 显示器可能会有多个 HDMI 接口&#xff0c;假设你插入 H…

蓝牙信号强度检测app_基于蓝牙技术的智能插座方案

有这样一句话“科技时代&#xff0c;生活轻快”。随着社会现代化程度越来越高&#xff0c;科技的应用为人们的生活带来便捷&#xff0c;大大提高了工作效率。纵观市场上“智能家居”产品很多&#xff0c;功能各异&#xff0c;各有千秋&#xff0c;但是针对家电控制的智能插座还…

图片清晰度,分辨率,像素总结

像素 像素是一个个小方块&#xff0c;是构成位图的基本单位。将图片放大即可看出来&#xff0c;如图&#xff1a; 分辨率 显示分辨率是指像素的总数量&#xff0c;如上图的22001400&#xff0c;也就是宽有2200个像素&#xff0c;高有1400个像素。 图像分辨率是指每英寸所包含…

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

apache isisTL; DR这是关于一个帖子会谈SEMAT宠物项目我创建使用Apache伊希斯和部署到OpenShift在线这里http://semat.ofbizian.com Apache Isis 作为主要在后端系统上工作的Java开发人员&#xff0c;我讨厌创建用户界面和处理Java脚本。 幸运的是&#xff0c;有一些Java项目&…

MacBook外接显示器及相关设置详解(分屏/多屏)

文章目录一、连接显示器和电脑二、打开显示器设置界面三、调整显示器图标位置四、设置主显示器五、移动 Dock六、镜像模式七、合盖模式八、扩展模式九、设置外接显示器竖屏显示十、外接显示器后&#xff0c;如何调出更多分辨率十一、关于程序坞显示的问题一、连接显示器和电脑 …

ibm liberty_使用Eclipse和Open Liberty的Java EE 8上的Java 9

ibm liberty几周前&#xff0c;我写了一篇文章&#xff0c;题目是哪个IDE和服务器支持Java EE 8和Java9 &#xff0c;着眼于Java 9和Java EE 8之间的当前状态。您可以期望事情发展很快&#xff0c;现在我们有了一些alpha和支持Java 9和Java EE 8的开发版本。这些是– Payara 5…

关键词分词工具_快图制作工具 | 如何制作词云图?

点击蓝字关注我们如何制作词云图&#xff1f;首先&#xff0c;我们需要对“词云”有个简单的概念。“词云”这个概念最先由美国西北大学新闻学副教授、新媒体专业主任里奇戈登(Rich Gordon)提出。“词云”(别名&#xff1a;文字云&#xff0c;外文名&#xff1a;wordle)即由词汇…

openhub_OpenHub框架–下一个有趣的功能

openhub这是有关OpenHub框架系列的第三篇文章-第一篇介绍OpenHub框架 &#xff0c;第二篇介绍异步消息传递模型 。 该系列的最后一篇文章将更详细地介绍其他一些有趣的功能&#xff0c;并说明为什么OpenHub可以成为您的集成项目的理想选择的原因。 节流 节流是一种功能&#…

售票系统的组件图和部署图_识读配电箱系统图

配电箱确实有很多字母&#xff0c;要熟悉这些字母的基本含义&#xff0c;才能更准确地知道配电箱系统图的意思。网上查了一些资料&#xff0c;发现配电箱中的字母实在是太多了&#xff0c;先简单说几个需要基本认识的字母&#xff1a;GCK、GCS、MNS是低压抽出式开关柜&#xff…