云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

金山云_云服务器传输文件_学生机

小七 141 0

谷歌云_企业网站建设推广_免费

当今世界上被广泛浪费的资源之一是:记忆。由于编程效率低下,浪费了惊人的(有时是"惊人的")内存量。我们看到这种模式在一些企业应用程序中重复出现。我们分析了著名的spring boot pet clinic应用程序,看看它浪费了多少内存。该应用程序是由社区设计的,大数据 数据分析,旨在展示如何使用spring应用程序框架构建简单但功能强大的面向数据库的应用程序。

环境

spring Boot 2.1.4.RELEASEJava SDK 1.8版Tomcat 8.5.20版MySQL 5.7.26与MySQL Connector/J 8.0.15

压力测试

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

线程数(用户)–1000(连接到目标的用户数)爬升周期(秒)–10。所有请求开始的时间范围。根据我们的配置,每0.01秒将启动一个新线程,即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"字符串已创建207481次。"Visit"字符串已创建132308次。"访问"是我们在测试脚本中提到的描述。"Bangalore"字符串已创建75374次。"Banglore"是我们在测试脚本中指定的城市名称。"123123"已创建37687次。"Mahesh"字符串已创建37687次。

显然"Goldi"是通过测试脚本在屏幕上输入的宠物名称。"访问"是通过测试脚本在屏幕上输入的描述。类似地,是值。但问题是,为什么这些相同的字符串对象被创建了成千上万次。

我们都知道字符串是不可变的(也就是说,一旦它们被创建,它们就不能被修改)。既然如此,为什么要创建成千上万个重复的字符串呢?

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

图:重复字符串的源代码路径

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

spring boot pet clinic应用程序内存浪费的另一个主要原因是:收集实现效率低下。下面是HeapHero报告的摘录:

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

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

错误做法:

最佳做法:

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

坏的做法:用默认值初始化集合。

最佳做法:用容量初始化集合

内存不便宜

有人会反驳说内存这么便宜,那我为什么要担心呢?问得好。但我朋友的内存在云计算时代并不便宜。有4种主要计算资源: