内存占用估算方法

优质博文:IT-BLOG-CN

通过掌握每种数据类型的大小,就可以更准确地预测对象和数据的内存消耗。

一、基础数据类型

Java基础数据类型结构,在64位系统开启指针压缩情况下的内存占用字节数:

booleanbytecharshortintlongfloatdouble引用
112248484

这些基础数据类型是轻量级的,应尽可能多地使用他们以减少内存消耗。

二、对象内存占用情况

Java对象的内存占用包括标记字mark word、类指针klass pointer、数据字段(实例变量)以及填充padding

markwordklass pointerdatapadding
84所有字段占用内存之和将内存占用补齐至8的整数倍

由此可见,一个没有任何数据字段的空对象,也会占用16字节的内存空间

三、数组内存占用

数组在Java中是一种特殊类型的对象,它还包括一个额外的数组长度字段。数组的内存占用包括标记字、类指针、数组长度字段、数组元素以及填充。与对象类型,数组的占用长度也必须是8的倍数。需要注意的是,数组元素的大小取决于元素的类型和数量。

markwordklass pointer数组长度字段数组元素padding
844所有字段占用内存之和将内存占用补齐至8的整数倍

四、String对象内存占用

这里,我们以Java8为例说说空String的内存占用情况,我们来看看String类中的成员变量。

/** The value is used for character storage. */
private final char value[];/** Cache the hash code for the string */
private int hash; // Default to 0/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;

根据上面我们对对象和数组内存的分析以及String的成员属性可以得出一个空String对象所占用的内存空间,如下所示。

对象头(8 字节)+ 引用 (4 字节 )  + char 数组(16 字节)+ 1int4字节)+ 1long8字节)= 40 字节

如果String字符串的长度大于0的话,我们也可以得出String占用内存的计算公式,如下所示。

40 + 2 * n

五、内存占用分析工具

位了更准确地估计内存占用情况,我们可以借助一些内存分析工具。
jol-core是一个java官方推出的jar包,地址为GitHub-openjdk/jol

pom依赖:

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.14</version>
</dependency>

JOL中常用的几个方法:

ClassLayout.parseInstance(obj).toPrintable():查看对象内部的内存布局;
ClassLayout.parseInstance(obj).instanceSize():计算对象的大小,单位为字节;GraphLayout.parseInstance(obj).toPrintable():查看对象外部信息,包括引用的对象;
GraphLayout.parseInstance(obj).totalSize():查看对象占用空间总大小;

注:除了parseInstance(Object obj)外,还有parseClass(Class<?> class),用法基本相同。

代码使用场景:

public class JolTest {public static void main(String[] args) {Object obj = new Test();// 查看对象内部信息System.out.println(ClassLayout.parseInstance(obj).toPrintable());}
}
class Test{private long p;private byte p1;private short p2;
}

六、防止内存膨胀的策略

【1】使用基础类型代替String 在处理业务时,短字符串(如城市三字码)频繁出现。标准String对象在Java中占用至少50字节内存,这对于仅包含2-3个字符的字符串来说是一种浪费。我们可以使用CodeUtil工具将这些字符串编码为原生数据类型,从而显著降低内存占用并可能提升性能。

将字符串编码为浮点数和解码为字符串

public class Main {public static void main(String[] args) {String doubleString = "123.45";// 将字符串编码为浮点数double encodedDouble = CodeUtil.encodeToDouble(doubleString);System.out.println("Encoded Double: " + encodedDouble);// 将浮点数解码为字符串String decodedDoubleString = CodeUtil.decodeFromDouble(encodedDouble);System.out.println("Decoded Double String: " + decodedDoubleString);String input = "Hello, World!";// 使用CodeUtil工具将字符串编码为char[]char[] encodedChars = CodeUtil.encodeToCharArray(input);// 打印编码后的char数组System.out.println("Encoded char array:");for (char c : encodedChars) {System.out.print(c + " ");}}
}

输出:

Encoded Double: 123.45
Decoded Double String: 123.45Encoded char array:
H e l l o ,   W o r l d !

【2】使用对象池: 在某些业务场景中,可能存在大量完全相同或相似的对象。位了减少这些对象的内存占用,可以使用对象池技术来重用这些对象。通过对象池,我们可以确保相同的对象在内存中只有一份拷贝,从而节省大量的内存空间。需要注意的是,在使用对象池技术时,需要确保对象的正确性和线程安全性。

【3】限制容器最大容量: HashMap等容器类在Java中广泛使用,但他们没有容量上限。如果不断向容器中添加元素,它们会持续扩容以及容纳更多的元素,从而导致内存占用不断增加。为了避免这种情况的发生,我们使用具有容量限制的容器类(如Guava Cache)来替代HashMap等无限制容器。这样可以将内存占用控制在一个合理范围内,防止内存膨胀现象的发生。需要注意的是,在设置容量限制时,需要根据实际业务需求和系统性能进行合理权衡。

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

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

相关文章

linux下sudo执行的程序会有一个额外的进程的问题

当我们执行一个可执行文件时&#xff0c;有可能需要一些更高的权限&#xff0c;为此我们会用sudo ./test的方法执行&#xff0c;这时候我们通过ps aux | grep ./test去查看进程&#xff0c;会发现多出来一个 sudo ./test 的进程&#xff0c;该进程被杀死后&#xff0c;发现目标…

等保测评:企业数字安全的坚实盾牌

1.1 企业数字化转型的浪潮 在当今时代&#xff0c;企业数字化转型的浪潮正以前所未有的速度席卷全球&#xff0c;据IDC预测&#xff0c;到2023年&#xff0c;全球数字化转型支出将达到惊人的2.3万亿美元。这一趋势不仅重塑了企业的运营模式&#xff0c;更对企业的信息安全提出…

Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)

一、Royal TSX软件下载地址 Royal Apps 二、Royal TSX 汉化 汉化包地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 三、基础配置 Royal TSX 是一款基于插件的应用&#xff0c;刚安装时还不具备使用条件&#xff0c;需要进行一些基础配置 1 安装基础插件…

【鸿蒙开发】05 登录Demo解析

文章目录 一、功能介绍 在鸿蒙开发中&#xff0c;一个完善的登录功能是许多应用程序的基础需求。本文将详细介绍一个鸿蒙 App 登录 Demo&#xff0c;包括其功能介绍、代码解析以及代码 demo 的下载地址。 本文初始代码从华为开发者网站下载&#xff0c;根据该Demo进行内容调整。…

无人机之数据提取篇

一、无人机平台与传感器 无人机是进行数据采集的基础设施&#xff0c;其稳定性、可靠性、灵活性和负载能力直接影响到数据采集的效果。根据实际需求&#xff0c;需选择适合的无人机类型&#xff0c;如固定翼无人机适合大范围、长时间的数据采集&#xff0c;而多旋翼无人机则更适…

windows系统下Telnet工具的安装步骤

通过控制面板启用Telnet客户端 点击“确定”按钮&#xff0c;按照系统提示完成安装。 打开cmd&#xff0c;输入telnet就可以了

影刀RPA实战:Excel拆分与合并工作表

1.影刀操作excel的优势 Excel&#xff0c;大家都不陌生&#xff0c;它是微软公司推出的一款电子表格软件&#xff0c;它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名&#xff0c;广泛应用于商业、教育、科研等领域。可以说&#xff0…

基于Apache和Tomcat的负载均衡实验报告

说明&#xff1a;本实验为浙江科技大学软件工程本科专业课程《软件体系结构》的实验报告。 五、总结 负载均衡的基础是集群&#xff0c;集群就是一组连在一起的计算机&#xff0c;从外部看它是一个系统&#xff0c;各节点可以是不同的操作系统或不同的硬件构成的计算机。负载…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中&#xff0c;每一座建筑都是文化的载体&#xff0c;无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求&#xff0c;更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上&#xff0c;巧妙融合现代元素&#xff0…

CSS文本格式化

通过 CSS 中的文本属性您可以像操作 Word 文档那样定义网页中文本的字符间距、对齐方式、缩进等等&#xff0c;CSS 中常用的文本属性如下所示&#xff1a; text-align&#xff1a;设置文本的水平对齐方式&#xff1b;text-decoration&#xff1a;设置文本的装饰&#xff1b;te…

PCL 索引空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 索引空间采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

XSS | XSS 常用语句以及绕过思路

关注这个漏洞的其他相关笔记&#xff1a;XSS 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;干货 - XSS 测试常用标签语句 0x0101&#xff1a;<a> 标签 <!-- 点击链接触发 - JavaScript 伪协议 --><a hrefjavascript:console.log(1)>XSS1</a> <!-- 字…

Java | Leetcode Java题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n nums.length;for (int num : nums) {int x (num - 1) % n;nums[x] n;}List<Integer> ret new ArrayList<Integer>();for (int i …

易天智能eHR CreateUser 任意用户添加漏洞

漏洞描述 易天智能eHR管理平台 /BaseManage/UserAPI/CreateUser 接口存在任意用户添加漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞添加任意管理员用户&#xff0c;导致攻击者可直接管理后台&#xff0c;造成信息泄露&#xff0c;使系统处于极不安全的状态。 漏洞…

zi2zi-chain: 中国书法字体图片生成和字体制作的一站式开发

在zi2zi-pytorch的基础上&#xff0c;做了进一步的修复和完善。本项目github对应网址为https://github.com/not-bald-owl/zi2zi-chain/tree/master。 修复部分为&#xff1a;针对预处理部分的函数弃用、生僻字无法生成、训练和推理部分单卡支持改为多卡并行、以及扩展从本地的…

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计共享单车管理网站

单车信息选择骑行 骑行状态留言公告/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 目录 功能图 界面展示 开发目标 开发背景意义 开发意义‌ 开发目的 项目概述‌ 技术选型与理由‌ 系统设计与功能实现‌ 项目可执行性分析 ‌系统架构需求‌ ‌性能需…

leetcode力扣刷题系列——【座位预约管理系统】

题目 请你设计一个管理 n 个座位预约的系统&#xff0c;座位编号从 1 到 n 。 请你实现 SeatManager 类&#xff1a; SeatManager(int n) 初始化一个 SeatManager 对象&#xff0c;它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。 int reserve() 返回可以预约座…

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介 Android WebView 是一种视图组件&#xff0c;使得 And…