Java下得到ArrayList<String>占用内存大小的方法

List集合 目录一、List集合的增删改查二、List集合的三种遍历方式三、LinkedList实现堆栈和队列四、增长因子的论证五、List集合中的重复元素去重以及其底层原理首先我们来看看List集合的基础增删改查:增加:循环遍历: 执行结果: 单个查询: 修改: 删除: 全部的执行结果: 案例1:剔除集合中的奇数1.1 :定义集合并遍历:执行结果: 1.2 开始剔除: 执行结果: 注意点:做集合元素剔除时,不能在原集合遍历的时候进行操作。我们首先创建一个集合:方式一:foreach循环遍历 方式二:for循环遍 阅读详情

刚需:压测时需要占用较大的内存,但使用ArrayList<String>时,无法获得每次调用占用的内存大小.

问题:Java中List的实际申请长度并不是size()取到的长度,而且,每次String申请的内存地址空间和主机有关,诸多因素导致计算估值并不是很准确

参考方案如下

代码

Runtime r = Runtime.getRuntime();
long startRAM = r.freeMemory();
List<String> listRAM = new ArrayList<>();
int loopTimes = 1000000;
String string = "摘抄自出师表…………太长了,不粘在这里";
for(int i = 0;i < loopTimes;i++) {
	listRAM.add(string);
}
long endRAM = r.freeMemory();
Field f = ArrayList.class.getDeclaredField("elementData");
f.setAccessible(true);
Object[] o = (Object[]) f.get(listRAM);
////
//// 方案1 使用Runtime内存管理类
////
String result = "测试RAM结束,测试占用内存空间约为 : " + (startRAM - endRAM);
System.out.println(result);
////
//// 方案2 反射的方式查询ArrayList的实际申请长度,然后按照每个字符串申请了2字节进行计算
////
result = "测试RAM结束,测试占用内存空间约为 : " + ((long)o.length * (long)string.length() * 2);
System.out.println(result);
////
//// 方案3 反射的方式查询ArrayList的实际申请长度,然后取字符串的字节数组长度计算
////
result = "测试RAM结束,测试占用内存空间约为 : " + ((long)o.length * (long)string.getBytes().length);
System.out.println(result);

结果(不同的方案之间差异较大):

测试RAM结束,测试占用内存空间约为 : 14016896
测试RAM结束,测试占用内存空间约为 : 1801351734
测试RAM结束,测试占用内存空间约为 : 2702027601

补充:

使用ArrayList创建List数组时,实际长度由elementData进行维护,可使用反射的方法得到List申请的实际长度。

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

/**
 * Appends the specified element to the end of this list.
 *
 * @param e element to be appended to this list
 * @return <tt>true</tt> (as specified by {@link Collection#add})
 */
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

分析:

方案一:r.freeMemory()方法可以得到当前内存的使用情况,此处取的是空余内存。因此两次空余内存做差,即可得到本次调用占用的内存。但也是模糊数值,仅作为参考,因为不能保证没有其他内存竞争。

方案二:查Java手册可知,Java遵循utf16原则,字符串中的每个字符均占用16位,即2个字节,因此直接乘2。

方案三:获取字符串的byte数组,用其长度直接相乘。而getBytes()方法底层实际是调用了StringCoding.encode(value, 0, value.length)方法,通过判断当前JVM的编码方式,进行字符解析,若未查到编码方式,将按照UTF-8进行编码。

r.totalMemory();
// 得到的输出结果为:126877696

博主此处选用的是第一种方案,因为和参考值比较接近。孰优孰劣,大大们可自行分析。

如何查看Java对象的内存占用大小 本文介绍了两种方法来查看Java对象的内存占用大小,分别使用了Instrumentation类和Java提供的工具类。接着,我们通过计算对象所占用的内存前后的堆内存使用量之差,即可得到对象的内存占用大小。需要注意的是,由于Java的垃圾回收机制的存在,对象的内存占用大小可能会受到垃圾回收的影响。然后,在您的代码中调用ObjectSizeFetcher.getObjectSize方法,传入要检测内存大小的对象,即可获取其内存占用大小。本文将介绍几种方法,可用于查看Java对象的内存占用大小。 阅读详情

相关推荐

《R语言实战》第八章之回归分析图形

回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的预测变量(自变量)不止一个时,就属于多元线性回归,而且多元线性回归中也可以包含多项式以及交互项 (1)在进行多远回归分析之前可以先描述变量之间的相关关系 上图为一个散点图矩阵,描述了五个变量之间的相关关系,我们可以通过非主对角线的散点图来查看两个变量之间的关系。 多元线性回归简单地就是OLS回归,通过lm和

Strawberry_Ya的博客 1836

计算list的字节数/mb数

java list的字节数

新一的技术笔记 2704

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

java list 字节大小_Java下得到ArrayList占用内存大小的方法

刚需:压测时需要占用较大的内存,但使用ArrayList时,无法获得每次调用占用的内存大小.问题:Java中List的实际申请长度并不是size()取到的长度,而且,每次String申请的内存地址空间和主机有关,诸多因素导致计算估值并不是很准确参考方案如下代码Runtime r = Runtime.getRuntime();long startRAM = r.freeMemory();Listli...

weixin_28947723的博客 6343

别再为跨页读写发愁了!STM32F407模拟I2C驱动24C256/512的避坑指南

本文详细解析了STM32F407模拟I2C驱动24C256/512的跨页写入问题,揭示了24C系列存储器'写满一页不会自动翻页'的关键机制,并提供了经过验证的分页写入算法和优化方案。通过GPIO时序优化、地址计算和错误处理等技巧,帮助开发者解决数据错乱、覆盖等常见问题,实现稳定可靠的EEPROM读写操作。

weixin_42631411的博客 379

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

java 定位 内存溢出_jvm内存溢出问题的定位方法

jvm内存溢出问题的定位方法今天给大家带来JVM体验之内存溢出问题的定位方法。废话不多说直接开始:一、Java堆溢出测试代码如下:import java.util.*;public class A {public static void main(String[] args) {List strList = new ArrayList<>();while(true) {strList....

weixin_39830175的博客 214

数据分析案例-汽车客户信息数据可视化分析

本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:ID:客户IDGender:客户性别Ever_Married:客户婚姻状况Age:客户年龄Graduated:客户是毕业生吗?Profession:客户的职业Work_Experience:多年工作经验Spending_Score:客户的消费评分Family_Size:客户家庭成员人数(含客户)Var_1:客户的匿名类别Segmentation:(目标)客户的客户群。

m0_64336780的博客 1万+

JB1-6-虚拟内存(一)

JVM(产品,生命周期,运行时数据区),执行引擎(反解析,指令),本地内存,寄存器,栈(本地方法栈,栈帧,局部变量表,操作数栈,动态链接,返回地址,栈异常),堆(分代,可视工具,晋升,堆异常,String池,包装类缓存池),方法区(永久代,元空间,运行时常量池)等。

周航宇的博客 909

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2658

高渗透率光伏接入配电网的电压越限与谐波治理:基于VSG构网型控制与SVG+APF联合补偿的Simulink仿真研究

本文针对高渗透率光伏接入配电网引发的电压越限和谐波畸变问题,提出了一种分层递进的综合治理方案。通过建立IEEE 33节点配电网的Simulink仿真模型,首先验证了传统跟网型控制下光伏渗透率提高导致的电压越上限(最高达1.08 p.u.)和系统谐波畸变严重(THD达8.72%)问题。进而提出:1)将部分光伏逆变器改造为构网型VSG控制,利用其无功调压能力与虚拟阻抗技术实现本地治理;2)在关键节点加装SVG+APF联合补偿装置进行全局动态无功补偿与谐波滤除。仿真结果表明,该方案能将节点电压控制在0.94-1.

huanghm88的专栏 581

查看java对象所占内存大小

查看java对象所占内存大小

abdke_123的博客 1220

Android SystemUI——车载CarSystemUI加载(八)

车载 CarSystemUI 是指专门为汽车环境设计的用户界面和用户体验(UI/UX),它通常与 Android Automotive OS 或其他嵌入式操作系统一起工作,为驾驶者和乘客提供安全、直观且高效的交互方式。Android Automotive OS 是 Google 专门为汽车开发的操作系统版本,它基于 Android 平台,并针对车辆内部的使用进行了优化。

小旭的专栏 2175

计算Java集合占用的空间【详解】

Person对象和ArrayList集合的内存占用估算。首先,Person对象由12字节的对象头和8字节的字段组成,每个对象占用20字节。接着,分析ArrayList对象的内存开销,包括12字节的对象头、8字节的int类型变量,以及4字节的数组引用,总计24字节。此外,ArrayList内部数组保存对象引用,每个引用占用4字节,数组容量为10,合计40字节。因此,ArrayList及其数组占用64字节,加上两个Person对象。最后,文字解释了集合中存储引用类型时仅存储对象引用,且对象不会被立刻回收。

m0_72397750的博客 1024

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

测量Java对象所占内存大小

背景: 相信大部分人都不会关注这个问题吧,只有一些偏执狂才会抓着这些不放,我们平时写代码时经常会new ArrayList<>(),new String()之类的,那么这些刚new出来的对象在内存中占用多大空间呢?随着作者一起去看看吧! 方法一设置-Xms和-Xmx的大小,然后在程序中循环new对象,直到发生OOM异常,记录下此时new了多少个对象,大家觉得这种方法可靠不?下面放上设置参数以及测试代

tianqishu11的专栏 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

查看java内存占用

要查看 Java 程序的内存占用,可以使用以下几种方法之一: 使用 jconsole 工具:jconsole 是 Java 自带的一个图形化监视工具,可以实时查看 Java 程序的内存使用情况。 使用 jstat 命令行工具:jstat 是 Java 自带的一个命令行工具,可以实时查看 Java 程序的内存使用情况。 使用 VisualVM 工具:VisualVM 是一个免费、开源的 Jav...

weixin_35753291的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java查看内存_Java 内存查看及分析

更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》首先使用 jps -l 查找当前所有的 Java 进程。jstat 命令jstat -gc pid 1000 或者 jstat -gc pid 1000 > out.txt: 每隔1000号码打印一次或导出 GC 的状态。S0C S0U:Survivor 0区的大小及使用情况S1C S1U:Survivor 1区的大小及使用情况...

weixin_39900180的博客 955

java 查看类对象内存大小

原文 https://www.it610.com/article/1296207687733813248.htm 工具包 com.carrotsearch.sizeof.RamUsageEstimator maven依赖 <!-- https://mvnrepository.com/artifact/com.carrotsearch/java-sizeof --> <dependency> <groupId>com.

a704397849的博客 1052

4种方法教你如何查看java对象所占内存大小

4种方法教你如何查看java对象所占内存大小

u011250186的博客 4650

Mybatis/MySQL的大数据量查询占用内存的问题

在这里先简单的记录一下,详细信息后续再不上; 现在都流行Oracle切换成mysql,公司也在这么做,系统改好进行压测时,发现使用的内存比使用Oracle的程序要大很多; 原来使用Oracle的时候,最初版本是一次性将查询结果,转换成List,然后一条条处理;随着数据量大,偶尔系统会爆出OOM,改变了使用方式,从一次性将查询结果转换成List,改成使用 ResultHandler的方式,...

cfy_zybing的专栏 2719

新技能 MyBatis 千万数据表,快速分页!

来源:sf.gg/a/1190000022478915基本概念MyBatis 流式查询接口但构建 Cursor 的过程不简单方案一:SqlSessionFactory方案二:Transa...

weixin_45727359的博客 2817

java各种类型对象占用内存情况分析(经典篇,有图有真相)

为什么写这篇文章? 其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解jvm内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化。。。等等等等,一句话,当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时,你会感谢这篇文章 本文主要分析jvm中的情况,实验环境为64位wind...

测试 5095

idea debu时计算list或者map占用内存大小

ObjectSizeCalculator.getObjectSize()

weixin_33387378的博客 2017

JAVA 查询对象大小 查询当前JVM堆内存 【数据在数据库中占的大小和数据转换成list的大小 大概是1:3】

JAVA 查询对象大小 查询当前JVM堆内存 【数据在数据库中占的大小和数据转换成list的占内存大小 大概是1:3】

IKonwNothing的博客 674
上一篇: 基于消费者生产者模型,使用线程池控制发送HTTP请求的定时器
CCCAAAAFFFFF
博客等级 码龄10年 5粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值