您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

在 Java 中节省内存:实现最小的内存占用

时间:2022-11-02 16:32:40  来源:今日头条  作者:一个即将退役的码农

本文将介绍接下来的技巧和主题:

 

  • 在包装器上使用基元字段(例如,布尔值 ->布尔值)
  • 减少形成平面结构的类的数量(在一个或多个类中折叠类)
  • 尽可能使用窄数据类型(例如,代替,代替等)short``int``long``Date
  • 使用掩码将一种类型隐藏在另一种类型中(例如,短内有许多布尔值)
引入要简化的类结构

 

让我们切入正题,回顾一下我们将在示例中使用的类。我们将改变其结构并逐步估计其大小四次。


 

计算第一个快照大小

如上所述,我建议查看之前的文章以了解内存计算过程。在我们的例子中,我们将使用基于 64 位 JAVA 的计算。我们将使用Alexey Shipilev开发的JOL核心库验证所有计算。您可以在本手册中找到此库的示例。

启动用户对象

首先,让我们创建 3 个对象并设置所有字段。在我们的示例中,我们将使用所有唯一对象,甚至对于布尔值,我们也将使用新实例(通过使用)。在这种情况下,我们的计算将是最悲观的(从大小的角度来看),但完全正确:new boolean


 

现在让我们计算每个对象的大小(再次考虑到甚至所有布尔实例都是唯一的):


 

所以毕竟,总大小的实例是 320 字节(包括和实例一起)。为了验证它,让我们使用 JOL 核心库并打印它们的大小:User``UserSalary``UserPayment


 

打印结果为 56 字节、136 字节和 320 字节。

现在让我们改进这个荒谬的例子并正确启动布尔值。

在前面的示例中,我将布尔值作为唯一对象启动。在这里,我们将以重用sameandreferences的方式启动(这也是你经常初始化它们的方式)。通过这样的初始化,我们的例子将更加现实。(此步骤不是优化,它只是解释内存计算如何工作的附加步骤。Boolean.true``Boolean.false


 

现在我们必须重新计算所有对象,因为我们基本上改变了布尔初始化:


 

打印结果符合预期:56 字节、136 字节和 208 字节(从 320 字节减少)。

第一个内存优化:用基元替换所有包装器

在这里,我们通过仅使用原语而不是包装器对象来进行第一次真正的优化。在这种情况下,我们将失去空收益选项,默认情况下将初始化所有值。


 

现在,让我们重新计算快照大小,考虑到所有基元值都没有额外的引用并保留在其容器对象中:


 

如您所见,所有包装器对象都会添加 16 个额外的字节。这种转换将总大小从 208 字节减少到 112 字节,几乎减少了 2 倍

第二次内存优化:在一个类中折叠数据

在大多数情况下,这种优化是不可能的,或者至少使 OOP 结构的可读性和可维护性降低;但是在某些内存不足的紧急情况下,您别无选择。因此,让我们将所有字段移动到一个类上,并查看改进:


 

现在只有一个用户对象,我们也失去了在引用上花费的额外内存。是的,代码更具可读性和可维护性,但我们几乎将大小提高了 2 倍。JOL-Core 库还确认现在的总大小为 64 字节

第三个内存优化:使用窄类型

如果您检查我们使用的所有类型,您可能会提到其中一些涵盖的范围比我们需要的要大:例如,isvalue 和覆盖范围从 -2147483648 到 -2,147,483,647,但根据我们的业务需求,它不会超过每月 32,767 美元。因此,我们可以使用数据类型而不是整数。同样,我们可以替换**java.sql.Date并只保留长**值(已经是未来和过去的数千年)。salary``int``Short

因此,在我们的例子中,我们将进行以下更改:


 

现在,快照总大小为 40 字节大小。我们能进一步改进它吗?是的!

第四个内存优化:使用窄类型

在此步骤中,我们将在较大的类型中“隐藏”较小的数据类型。整数值由 2^32 个值覆盖。布尔值由 2^1 覆盖。所以在一个整数中,我们可以“隐藏”32个布尔值。同样的事情可以应用于这些示例:

 

  • 1 个整数 (2^32) 内的 32 个布尔值 (2^1)
  • 1 个整数 (2^32) 内的 4 个字节 (2^7)
  • 1 个整数 (2^32) 内的 2 个短裤 (2^16)
  • 2 个整数 (2^32) 在一个长 (2^64) 内
  • 等。
编写逻辑以隐藏和揭示布尔值和短线值的掩蔽值

 

在我们的示例中,我们将所有 9 个布尔值封装在一个短时间内。我们将使用按位运算(向右、向左移动等)。您可以在本文中找到更多示例。

从布尔值到短线的转换:

转换包括 3 个后续步骤:boolean``short

 

  1. 转换。boolean``1 (true)``0 (false)
  2. 使用左移运算符将该值向左移动。N``(<<)
  3. 使用运算符合并所有值。OR (|)

 

因此,使用定义的标志顺序如下:


 

并在一种方法中实现所有步骤:


 

现在有了这个函数,我们可以在一个单一中隐藏值:boolean``short


 

从短值中揭示隐藏的布尔值

为了识别哪个标志具有什么值,我们需要进行向后转换:

 

  1. 将值移动到右边的步骤(取决于标志顺序)。results``N
  2. 进行比较以“削减”正确的数字。
  3. 将此数字与 1 进行比较,如果为 1,则值为 true。1``=> flags

 

所有步骤如下所示:


 

现在使用所有这些函数,我们可以尝试隐藏下一个值:

我们的最终值是229,或者可以用二进制格式表示为011100101并表示下一个值,如下所示:


 

现在有了这个结果值,我们可以使用并得到一个特定的封装布尔值:mask


 

最终的计算是 我们类的总大小为 32 字节。User


 

结论

在我们的示例中进行了四次转换之后,我们得到了下一个足迹改进:


 

完成所有转换后,我们将类的大小从 208 字节减少到 32 字节,几乎减少了7 倍。我们的对象更难读取和维护,但内存消耗急剧下降。在节省 1000 万用户的情况下,我们只需要 320MB 而不是 2.1GB。



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
JavaScript的异步编程常见模式
在JavaScript中,异步编程是一种处理长时间运行操作(如网络请求或I/O操作)的常见方式。它允许程序在等待这些操作完成时继续执行其他任务,从而提高应用程序的响应性和性能。JavaS...【详细内容】
2024-04-12  Search: Java  点击:(2)  评论:(0)  加入收藏
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  Search: Java  点击:(6)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  Search: Java  点击:(27)  评论:(0)  加入收藏
Oracle正式发布Java 22
Oracle 正式发布 Java 22,这是备受欢迎的编程语言和开发平台推出的全新版本。Java 22 (Oracle JDK 22) 在性能、稳定性和安全性方面进行了数千种改进,包括对Java 语言、其API...【详细内容】
2024-03-21  Search: Java  点击:(10)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  Search: Java  点击:(20)  评论:(0)  加入收藏
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  Search: Java  点击:(15)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20  Search: Java  点击:(24)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18  Search: Java  点击:(27)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  Search: Java  点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  Search: Java  点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(15)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(24)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(27)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(57)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(70)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(73)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(90)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(107)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(99)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(78)  评论:(0)  加入收藏
站内最新
站内热门
站内头条