gpt4 book ai didi

Java内存泄漏与字符串?为什么这会消耗和崩溃

转载 作者:行者123 更新时间:2023-11-29 04:39:06 25 4
gpt4 key购买 nike

Integer、Long 列表,执行正常。然而,当使用 String 时,当一个条目最多应该在每个 String 8 字节附近时,下面的代码消耗超过 5GB 的内存,相当于只有 ~700MB。它还可以无限运行,永远不会将堆抛出界限。这是怎么回事?

        List<List<String>> arrayList = new ArrayList<List<String>>();
long offset = 1000;
long size = 83886080;
int max = Integer.MAX_VALUE - 100;
long subloops = 1;
if(size > max)
{
subloops = size / max;
}

int temp = 0;
long count = 1;
long start = System.nanoTime();
for(int j=0; j<subloops; j++)
{
temp = (int)(size % max);
arrayList.add(new ArrayList<String>(temp));
List<String> holder = arrayList.get(j);
for (long i = 0; i < temp; i++)
{
holder.add(Long.toString(offset + count));
count++;
}
size -= temp;
}

long finalTime = System.nanoTime() - start;
System.out.println("Total time = " + finalTime);
System.out.println(count);
//for reference the max item length in bytes ends up being 8
System.out.println(Long.toString(offset+count).getBytes().length);

最佳答案

String 的内存占用涉及对象的内存开销加上对象的字段。有关详细信息,请参阅此答案:What is the memory consumption of an object in Java?

String 对象在 Java 8 中有两个实例字段:

  • 字符值[]
  • 整数散列

假设 64 位 Java 和压缩的 OOPS,这意味着内存是:

String:
Object header: 12 bytes
Reference to char[]: + 4 bytes
Integer value: + 4 bytes
Data size: = 20 bytes
Total aligned size: 24 bytes
char[]:
Object header: 12 bytes
Array length: + 4 bytes
Characters: + 2 bytes * length
Data size (len=8): = 32 bytes
Total aligned size: 32 bytes

再添加 4 个字节作为对字符串的引用(存储在 ArrayList 中),您将获得 8 个字符的字符串的总大小:60 字节

创建 83,886,080 个字符串然后使用 5,033,164,800 字节 = 4.7 Gb

关于Java内存泄漏与字符串?为什么这会消耗和崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39990430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com