1

我使用与字符串实习生相同的想法在 java 中创建了一个实习生池。简单地说,我维护一个

WeakHashMap<T, T>

每次映射包含对象时,它都会返回相同的对象,好处是可以节省java堆内存。例如,我有一个这样的 Person 类:

public Person() {
    String name;
    int age;
    String employer;

    @Override
    public equals(Pbject obj) {
        ......
    }

    @Override
    public hashCode() {
        ......
    }
}

它没有使类唯一的字段(无主键)。问题是当我想检查地图是否包含特定的人时,我需要先创建一个临时人员,以便 map.contains() 方法可以为这个人调用 equals() 方法。结果,在我运行profiler查看内存使用情况后,我可以看到GC收集了很多临时对象,这肯定会导致更多的GC和CPU使用。有没有一种方法可以在不创建太多临时对象的情况下实现实习生池的想法?

ps 我从这篇文章中得到了实习生池的想法:Generic InternPool<T> in Java?

4

2 回答 2

2

A HashMap<T, T>不是 Map,而是对您的 equals() 和 hashCode() 方法做了一些非常奇怪的事情。正如所评论的,创建一个临时的短期实例很便宜,因为垃圾收集器使用代。但是您必须检查是否存在的是关键而不是对象本身。

于 2019-05-09T20:54:43.563 回答
0

我不知道你在做什么来消耗大量的堆内存,但为什么不看看弱引用和强引用。

  • 只要存在单个硬引用,就会保留对单个对象的弱引用。当硬引用被垃圾回收时,弱引用也是如此。
  • 只有当你开始用完堆空间时,强引用才会消失。当您想为其他对象使用更多堆空间时,就会发生这种情况。较旧的是GC'd。

因此,根据您在做什么,您可能需要检查它们。

于 2019-05-09T21:23:29.227 回答