Java Intern池实现会创建太多临时对象

时间:2019-05-09 20:01:31

标签: java flyweight-pattern

我使用与字符串实习生相同的想法在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()方法。结果,运行分析器查看内存使用情况后,可以看到GC收集了很多临时对象,这肯定会导致更多的GC和CPU使用率。 有没有一种方法可以在不创建太多临时对象的情况下实现实习生池的想法?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我不知道您在做什么以消耗大量堆内存,但是为什么不看一下弱引用和强引用呢?

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

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