java - Java 中的哈希表内存使用情况

标签 java memory-leaks hashtable

我正在使用java从文件中读取数据,将数据复制到较小的数组并将这些数组放入哈希表中。我注意到 Hashmap 消耗的内存比原始文件中的内存多(大约两倍)!知道为什么吗?

这是我的代码:

public static void main(final String[] args) throws IOException {
    final PrintWriter writer = new PrintWriter(new FileWriter("test.txt",
            true));
    for(int i = 0; i < 1000000; i++)
        writer.println("This is just a dummy text!");
    writer.close();

    final BufferedReader reader = new BufferedReader(new FileReader(
            "test.txt"));
    final HashMap<Integer, String> testMap = new HashMap<Integer, String>();
    String line = reader.readLine();
    int k = 0;
    while(line != null) {
        testMap.put(k, line);
        k++;
        line = reader.readLine();
    }
}

最佳答案

这不是HashMap的问题,而是一般Java对象的问题。每个对象都有一定的内存开销,包括 HashMap 中的数组和条目。

但更重要的是:字符数据消耗双倍的内存空间。原因是 Java uses 16 bits for each character ,而该文件可能采用 ASCII 或 UTF-8 编码,每个字符仅使用 7 或 8 位。

更新:对此您无能为力。您发布的代码原则上没有问题。它只是不适用于大文件。如果仔细调整 HashMap,或者您可以使用字节数组而不是字符串来存储字符(假设所有内容都是 ASCII 或单字节 UTF-8),您可能会做得更好一些)。

但最终,要解决内存不足问题,正确的方法是重新考虑您的程序,这样您就不必立即将整个文件读入内存。

无论您对该文件的内容做什么,请考虑一下是否可以在从磁盘读取文件时执行此操作(这称为流式传输)或者也许提取相关部分并只存储它们。您还可以尝试随机访问该文件。

我建议您稍微阅读一下这些内容,尝试一些内容,然后回来提出一个针对您的应用程序的新问题。因为这个线程太长了。

关于java - Java 中的哈希表内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181366/

相关文章:

java - 当初始化变量链接到另一个变量时?

python - 在一个非常大的项目中查找内存泄漏

language-agnostic - 使用 float 作为哈希表的键是否安全?

java - 嵌套哈希表?

java - 通过 LAN 将 DatagramPacket 从一台 PC 发送到另一台 PC

java - JPA Java 持久性 API 查询返回零结果

ios - XCode Instruments:泄漏NSMallocBlock没有扩展细节的堆栈跟踪

c - 如何在 C 中正确初始化此哈希表实现? (出现段错误)

java - iText unicode 字体问题

iOS NSURLConnection(sendAsynchronousRequest :) too much cache