Spring Boot应用程序浪费了内存

内存是当今世界上被广泛浪费的资源之一。 由于编程效率低下,令人吃惊的(有时是“令人震惊的”)内存浪费被浪费了。 我们看到这种模式在多个企业应用程序中重复出现。 为了证明这种情况,我们进行了一项小型研究。 我们分析了著名的spring boot pet诊所应用程序,以查看浪费了多少内存。 该应用程序是由社区设计的,旨在显示spring应用程序框架如何用于构建简单但功能强大的面向数据库的应用程序。

环境

  • Spring Boot 2.1.4。发布
  • Java SDK 1.8
  • 的Tomcat 8.5.20
  • 带有MySQL Connector / J 8.0.15的MySQL 5.7.26

压力测试

我们使用了流行的开源负载测试工具Apache JMeter进行压力测试。 我们使用以下设置执行了30分钟的负载测试:

  • 线程数(用户)– 1000(连接到目标的用户数)
  • 加速周期(以秒为单位)– 10.所有请求开始的时间范围。 根据我们的配置,每0.01秒,将启动1个新线程,即100个线程/秒。
  • 循环计数–永远。 这1000个线程背对背执行测试迭代。
  • 持续时间(秒)-1800。 加速后,1000个线程连续运行1800秒。
图:Jmeter设置

我们在负载测试中采用了以下方案:  

  • 将新的宠物主人添加到系统。
  • 查看有关宠物主人的信息。
  • 向系统添加新宠物。
  • 查看有关宠物的信息。
  • 将有关访问的信息添加到宠物的访问历史中。
  • 更新有关宠物的信息。
  • 更新有关宠物主人的信息。
  • 通过搜索其姓名查看所有者信息。
  • 查看所有所有者的信息。

如何测量内存浪费?

工业界有数百种工具可以显示所使用的内存量 。 但是我们很少遇到能够测量由于编程效率低下而浪费的内存量的工具。 HeapHero是一个简单的工具,可以分析堆转储并告诉您由于编程效率低而浪费了多少内存。

测试运行时,我们从Spring Boot Pet Clinic应用程序捕获了堆转储。 (有7种不同的选项可从Java / Android应用程序 捕获堆转储 。您可以选择最方便的选项)。

我们将捕获的堆转储上传到HeapHero工具中。 工具生成了这个漂亮的报告,显示由于效率低下的编程浪费了65%的内存。 是的,这是一个简单的原始应用程序,应该在其中实现了所有最佳实践,在一个著名的框架上也浪费了65%的内存。

图:由HeapHero生成的图表,显示65%的内存被Spring Boot宠物诊所应用程序浪费了

分析内存浪费

从报告中,您可以注意到以下内容:

  • 字符串重复导致浪费了15.6%的内存
  • 由于原始数组效率低下,浪费了14.6%的内存
  • 由于重复的原始数组浪费了14.3%的内存
  • 由于收集效率低下,浪费了12.1%的内存

在此Spring启动应用程序 (和大多数企业应用程序)中浪费内存的主要原因是字符串重复。 该报告显示了由于重复字符串而浪费了多少内存,它们是什么字符串,谁在创建它们以及如何对其进行优化。

无花果:重复的字符串

您会注意到由于重复的字符串浪费了15.6%的内存。 请注意

  • 'Goldi'字符串已被创建207,481次。
  • “访问”字符串已创建132,308次。 “访问”是我们在测试脚本中提到的描述。
  • “班加罗尔”字符串已创建75,374次。 “ Banglore”是我们在测试脚本中指定的城市名称。
  • '123123123'已被创建37,687次。
  • “ Mahesh”字符串已创建37,687次。

显然,“ Goldi”是通过测试脚本在屏幕上输入的宠物的名称。 “访问”是通过测试脚本在屏幕上输入的描述。 同样,是值。 但是有一个问题,为什么要创建相同的字符串对象那么几千次。

我们都知道字符串是不可变的(即一旦创建,就无法修改)。 鉴于为什么要创建成千上万个重复的字符串?

HeapHero工具还报告创建这些重复字符串的代码路径。

无花果:重复字符串源自的代码路径

这是修复应用程序中重复字符串的高级建议 。 您可以采用适用于您的应用程序的策略。

在弹簧靴宠物诊所应用中造成内存浪费的另一个主要原因是收集效率低下。 以下是HeapHero报告的摘录:

图:由于收集效率低而浪费的内存

您会注意到,内存中99%的LinkedHashSet中没有任何元素。 如果没有元素,为什么还要创建LinkedHashSet? 当您创建一个新的LinkedHashSet对象时,将在内存中保留16个元素的空间。 现在为这16个元素保留的所有空间都被浪费了。 如果对LinedHashset进行延迟初始化,则不会出现此问题。

不良做法:

 private LinkedHashSet<String, String>myHashSet = new LinkedHashSet();  public void addData(String key, String value) {  myHashSet.put(key, value);  } 

最佳实践:

 private LinkedHashSet<String, String>myHashSet;  public void addData(String key, String value) { If (myHashSet == null ) {  myHashSet = new LinkedHashSet(); }  myHashSet.put(key, value);  } 

同样,另一个观察结果是:68%的ArrayList中仅包含1个元素。 创建ArrayList对象时,将在内存中保留10个元素的空间。 这意味着在88%的ArrayList中9个元素的空间被浪费了。 如果可以使用容量初始化ArrayList,则可以避免此问题。

不良做法:使用默认值初始化集合。

 new ArrayList(); 

最佳实践:使用容量初始化集合

 new ArrayList( 1 ); 

内存不便宜

一个人可以反驳说,内存是如此便宜,那么为什么我要担心它呢? 公平的问题。 但是在云计算时代,我朋友的记忆并不便宜。 有4种主要的计算资源:

  1. 中央处理器
  2. 记忆
  3. 网络
  4. 存储

您的应用程序可能在AWS EC2实例上运行的数十万个应用程序服务器上运行。 在上述4种计算资源中,哪个资源在EC2实例中已饱和? 我要求您在这里稍等一下,然后再继续阅读。 考虑一下,首先确定哪些资源已饱和。

对于大多数应用程序,它是*内存*。 CPU始终为30 – 60%。 总是有大量的存储空间。 很难饱和网络(除非您的应用程序正在流式传输大量视频内容)。 因此,对于大多数应用程序来说,首先是内存饱和。 即使CPU,存储和网络未充分利用,仅由于内存变得饱和,您最终还是会配置越来越多的EC2实例。 这将使您的计算成本增加几倍。

另一方面,由于编程效率低下,现代应用程序无一例外地浪费了30%-90%的内存。 即使在没有太多业务逻辑的Spring Boot宠物诊所之上,也浪费了65%的内存。 实际的企业应用程序将浪费相似的数量,甚至更多。 因此,如果您可以编写内存有效的代码,那么它将降低您的计算成本。 由于内存是第一个达到饱和的资源,因此,如果可以减少内存消耗,则可以在较少数量的服务器实例上运行应用程序。 您也许可以减少30 – 40%的服务器。 这意味着您的管理层可以减少30%-40%的数据中心(或云托管提供商)成本,再加上维护和支持成本。 它可以节省数百万/数十亿美元的成本。

结论

除了减少计算成本,编写内存效率高的代码后,您的客户体验也将变得更好。 如果您可以减少为服务新的传入请求而创建的对象数量,则响应时间将大大缩短。 由于创建的对象较少,因此在创建和垃圾回收对象上将花费较少的CPU周期。 减少响应时间将提供更好的客户体验。

翻译自: https://www.javacodegeeks.com/2019/11/memory-wasted-by-spring-boot-application.html

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

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

相关文章

Win10灵活使用快速访问

I 快速访问视图 位置在winE 左侧窗口&#xff0c;点击可快速到达某个特定的文件夹。作用类似于快捷方式&#xff0c;操作简单。 II 关闭自动添加 默认是显示经常使用的文件夹。这使得窗口内文件夹较乱。 通过以下设置&#xff0c;关闭自动显示 1. 2.把框内√去掉 III 固定文…

Win10搜索文件后新窗口打开

I 问题描述 windows搜索后&#xff0c;对”文件“右击只有”打开文件位置“&#xff1b;对”文件夹“右击只有”在新窗口中打开“和”打开文件夹位置“ 1.如果点击”打开文件位置“ 或 ”打开文件夹位置“后&#xff0c;搜索的窗口页面就不见了&#xff1b;直接跳转到”那个“…

activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分

activemq网络桥接在此博客中&#xff0c;我们将看到双工网络连接器如何工作。 在上一部分中&#xff0c;我们从broker-1和broker-2创建了一个网络连接器。 我们能够看到&#xff0c;当代理2上有一个使用者使用队列“ foo.bar”时&#xff0c;代理1上的队列“ foo.bar”的消息如…

Win10鼠标拖拽移动文件

拖动操作共有三种响应模式&#xff0c;分别是&#xff1a;移动、复制、创建快捷方式。 在默认情况下&#xff0c; 纯拖动操作——同盘移动&#xff0c;异盘复制拖动时按住shift键——移动拖动时按住ctrl键——复制拖动时按住alt键 或 同时按住ctrl和shift键——创建快捷方式

Apache Lucene中的并发查询执行

Apache Lucene是一个出色的并发纯Java搜索引擎&#xff0c;如果您愿意&#xff0c;它可以轻松地使服务器上的可用CPU或IO资源饱和。 “典型” Lucene应用程序的并发模型在搜索时每个查询一个线程&#xff0c;但是您知道Lucene还可以使用多个线程同时执行一个查询以大大减少最慢…

Windows设置自己的程序开机自动启动

Windows系统想要快速设置开机自动启动某个程序&#xff0c;可以使用以下方法设置&#xff1a; 1.找到启动文件夹 CtrlR 打开运行&#xff0c;输入shell:startup&#xff0c;回车,找到启动文件夹 2.拷贝需要开机启动的程序的快捷方式到此文件夹即可。 3.打开任务管理器-启动查…

Citavi中文件管理

目录 I 文献相对应的PDF文件相关操作 1 打开PDF所在位置 2 直接重命名PDF文献 注&#xff1a;设置角标方式 II 阅读文献相关的文件的添加与删除 1 添加 2 删除 III PPT CAJ文件的添加 I 文献相对应的PDF文件相关操作 PDF文件可直接拉入文献框进行导入 1 打开PDF所在位置…

coldfusion_我从ColdFusion迁移到Java开发

coldfusion尽管我在大学和研究生的整个职业生涯中都研究和尝试了不同的开发技术和工具&#xff0c;但我的全职职业生涯始于Adobe ColdFusion的开发。 从学校毕业后&#xff0c;使用技术解决现实世界中的业务问题本身就是一个挑战。 由于其相当简单的性质&#xff0c;ColdFusio…

Citavi插件的安装和使用以及注意事项

【文章转载于知乎大神&#xff1a;Citavi插件的安装和使用以及注意事项 - 知乎】 没有软件是十全十美的&#xff0c;基础功能够用&#xff0c;附加功能以插件、脚本的方式来支持是个不错的思路。 Citavi提供了自定义宏和插件的方式&#xff0c;来满足更为复杂的格式修整和文献…

Java 9中的HTTP / 2支持简介

1.简介 IETF流媒体小组于2015年&#xff08;即HTTP / 1.1发布后的16年&#xff09; 批准了HTTP / 2协议。 HTTP / 2有望降低延迟&#xff0c;并且使许多替代方法变得过时&#xff0c;而这些替代方法是HTTP / 1.1所必需的&#xff0c;以便能够满足当今的响应时间要求。 在本文中…

MiUI特色功能设置总结

一 常用设置 【转载于知乎https://www.zhihu.com/question/514792652/answer/2377622710】 1 自动优化系统 其实在手机开发者模式设置中&#xff0c;有2个地方我们需要设置&#xff0c;设置了不仅可以让手机运行更流畅&#xff0c;而且还能帮我们自动优化系统。 &#xff0…

potplayer怎么设置无边框播放,播放时隐藏进度条

potplayer默认情况下播放视频时会显示边框&#xff0c;那么怎么设置无边框播放呢?下面小编就为大家详细的介绍一下&#xff0c;大家感兴趣的话就一起来了解下吧! potplayer怎么设置无边框播放?potplayer设置无边框播放方法 1、点击左上角的potplayer 2、在下拉菜单中点击选项…

蓝牙播放Stereo和Hands-Free AG Audio两种模式的区别?

当使用蓝牙耳机时&#xff0c;发现电脑的播放设备显示了两种模式&#xff08;如下图所示&#xff09;&#xff0c;Stereo模式下声音正常&#xff0c;而调到Hands-Free AG Audio模式下声音频带窄了很多且音质差&#xff0c;典型的电话音&#xff0c;下面具体说说这两种模式的区别…

office工作日志文件_风暴事件处理器–每个工作者的GC日志文件

office工作日志文件在过去的三个月中&#xff0c;我正在与一个新团队合作&#xff0c;为电信领域的大数据分析构建产品。 Storm事件处理器是我们使用的主要框架之一&#xff0c;它确实很棒。 您可以阅读其官方文档中的更多详细信息&#xff08;已改进&#xff09;。 Storm使用…

workrave使用方法

一 模式介绍 阅读模式&#xff1a; 不论电脑什么状态&#xff0c;倒计时一直进行 普通模式&#xff1a; 当检测到电脑没有任何操作&#xff0c;比如打字与移动鼠标&#xff0c;则暂停倒计时。如果长时间没有操作&#xff0c;则默认进入休息状态&#xff0c;下次移动鼠标&…

OpenJDK织机和结构化并发

Project Loom是Hotspot Group赞助的项目之一&#xff0c;旨在向JAVA世界提供高吞吐量和轻量级的并发模型。 在撰写本文时&#xff0c;Loom项目仍处于积极开发中&#xff0c;其API可能会更改。 为什么要织机&#xff1f; 每个新项目可能会出现的第一个问题是为什么&#xff1f;…

在已打开的程序上打开新的窗口

在支持多开的程序上面按shift加鼠标左键&#xff0c;则打开程序新的窗口

Virgo软件的介绍

使用Virgo的场景 Win10自带的虚拟桌面存在BUG&#xff0c;当在第二个虚拟桌面上打开某个软件时&#xff08;如WPS&#xff09;&#xff0c;会自动跳转到打开该应用的第一个窗口。 Virgo介绍 原代码8KB&#xff0c;启用后占用内存1MB&#xff0c;极简桌面 快捷键 ALT 1..4…

java 8 lambda_玩Java 8 – Lambda,路径和文件

java 8 lambda我最近需要读取一堆文件&#xff0c;而不是仅仅抓住我和可能是大多数开发人员拥有的旧FileUtils.java&#xff0c;然后从一个项目复制到另一个项目&#xff0c;我决定快速看看其他方法。 是的&#xff0c;我知道有Commons IO和Google IO &#xff0c;我为什么还要…

设置花里胡哨的Xshell字体与背景颜色(超全)

大部分运维和开发经常接触到的客户端连接工具很多都是Xshell&#xff0c;但是经常看到别人的背景色和字体都是五颜六色&#xff0c;还有护眼色的背景&#xff08;想必大家也会遇到在深夜加班时为了不打扰身边小伙伴的休息不开灯&#xff0c;打开Xshell时可以闪瞎人眼的白色背景…