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

您所在的位置:网站首页 获取列表长度的方法 Java下得到ArrayList占用内存大小的方法

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

2023-10-06 15:16| 来源: 网络整理| 查看: 265

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

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

参考方案如下

代码

Runtime r = Runtime.getRuntime(); long startRAM = r.freeMemory(); List 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 true (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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3