gpt4 book ai didi

java - 插入HashMap后如何在内存中查找大小?

转载 作者:行者123 更新时间:2023-12-02 05:36:58 25 4
gpt4 key购买 nike

我正在对 HashMap 插入进行一些性能测试。我正在测试的操作是插入、读取和插入后内存中的大小。

我可以进行插入和读取测试,但不确定插入后如何找出内存中的大小 -

我有一个文本文件,其中包含 200 万个英语单词及其出现频率 -

hello 100
world 5000
good 2000
bad 9000
...

现在我逐行读取此文件并将其存储在 HashMap 中,因此我能够使用以下代码测量插入性能。

Map<String, String> wordTest = new HashMap<String, String>();

try {
fis = new FileInputStream(FILE_LOCATION);
reader = new BufferedReader(new InputStreamReader(fis));

String line = reader.readLine();
long startTime = System.nanoTime();
while (line != null) {
String[] splitString = line.split("\\s+");
// now put it in HashMap as key value pair
wordTest.put(splitString[0].toLowerCase().trim(), splitString[1].trim());

line = reader.readLine();
}
long endTime = System.nanoTime() - startTime;
System.out.println("Insertion Time: " +TimeUnit.MILLISECONDS.convert(endTime, TimeUnit.NANOSECONDS));
}

现在我还想在上面的 HashMap 中测量 插入后内存中的大小

基本上我从这个链接看后感到困惑 - https://github.com/jpountz/tries/wiki/Benchmark .在这个链接中,他们有 插入后内存中的大小 但不确定这是什么意思以及他们是如何计算的?有什么方法可以用 Java 做同样的事情吗?

最佳答案

再一次,我想指出,如果您使用 Unsafe 进入 VM 的思维,则可以获得 Java 对象的准确内存占用测量值。有很多项目使用该技术,其中之一是 jol ,在 OpenJDK 中可用(这意味着它也适用于 Oracle JDK)。例如,这是 runnable sample显示 ArrayList 与 LinkedList 的足迹:

Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.util.ArrayList instance footprint:
COUNT AVG SUM DESCRIPTION
1 4952 4952 [Ljava.lang.Object;
1000 16 16000 java.lang.Integer
1 24 24 java.util.ArrayList
1002 20976 (total)


java.util.LinkedList instance footprint:
COUNT AVG SUM DESCRIPTION
1000 16 16000 java.lang.Integer
1 32 32 java.util.LinkedList
1000 24 24000 java.util.LinkedList$Node
2001 40032 (total)

您可以拉取 jol 作为依赖项,并将您的 HashMap 实例提供给它。

关于java - 插入HashMap后如何在内存中查找大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23040216/

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