Java收集和内存优化

标签 java memory-leaks out-of-memory heap-memory

我为一个自定义表编写了一个自定义索引,该表使用 500MB 堆存储 500k 字符串。只有 10% 的字符串是唯一的;其余的都是重复的。每个字符串的长度为 4。

我如何优化我的代码?我应该使用另一个集合吗?我尝试实现自定义字符串池以节省内存:

public class StringPool {

    private static WeakHashMap<String, String> map = new WeakHashMap<>();

    public static String getString(String str) { 
        if (map.containsKey(str)) {
            return map.get(str);
        } else {
            map.put(str, str);
            return map.get(str);
        }
    }
}

private void buildIndex() {
        if (monitorModel.getMessageIndex() == null) {
            // the index, every columns create an index
            ArrayList<HashMap<String, TreeSet<Integer>>> messageIndex = new ArrayList<>(filterableColumn.length);
            for (int i = filterableColumn.length; i >= 0; i--) {
                // key -> string,   value -> treeset, the row wich contains the key
                HashMap<String, TreeSet<Integer>> hash = new HashMap<>();
                messageIndex.add(hash);
            }
            // create index for every column
            for (int i = monitorModel.getParser().getMyMessages().getMessages().size() - 1; i >= 0; --i) {
                TreeSet<Integer> tempList;

                for (int j = 0; j < filterableColumn.length; j++) {
                    String value  = StringPool.getString(getValueAt(i, j).toString());
                    if (!messageIndex.get(j).containsKey(value)) {
                        tempList = new TreeSet<>();
                        messageIndex.get(j).put(value, tempList);
                    } else {
                        tempList = messageIndex.get(j).get(value);
                    }

                    tempList.add(i);
                }
            }
            monitorModel.setMessageIndex(messageIndex);
        }
    }

最佳答案

无需提出自定义池。只需使用 String.intern() .

关于Java收集和内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973785/

相关文章:

c# - 虚拟和物理内存/OutOfMemoryException

java - Java 中的差异实现

c++ - move 语义、奇怪的重复模板模式和内存泄漏

java - 是否有一个 Map 实现将内容持久保存到数据库而不是内存?

c - CPU如何从内存中读取数据?缓存如何发挥重要作用

java - 内存泄漏和性能是否足够?

java - 强制java内存不足..不一致的java行为

java - Jackson CustomSerializer 适用于特定字段

java - 使用类路径问题从命令行运行java项目?

java - 如何使用 Java 8 Streams 在某些条件下执行内部操作