代码之家  ›  专栏  ›  技术社区  ›  Pindatjuh

java堆间接访问

  •  1
  • Pindatjuh  · 技术社区  · 14 年前

    目前我使用 HashMap<Class, Set<Entry>> ,其中可能包含数百万个短命和长寿命对象。( Entry 是一个包装类 Object 一个整数,这是一个重复的计数)。

    我想:这些 对象 s都存储在jvm堆中。然后我的问题突然出现在我的脑海中,而不是为 HashMap ,是否可以做得更好(减少内存消耗)?

    有办法进入吗 对象 在Java堆中间接地基于 Class 对象 S?

    我的意思是:没有指向 对象 . 使用“access”我的意思是:检索指向 对象 堆里。

    4 回复  |  直到 11 年前
        1
  •  1
  •   Michael Borgwardt    14 年前

    不。基本上,每个对象都知道它的类,但是一个类并不知道它的所有对象——这对于JRE的工作方式来说是不必要的,而且只会带来无用的开销。

    你为什么要知道这些类的所有实例呢?也许有更好的方法来解决你的实际问题。

        2
  •  2
  •   Riduidel    14 年前

    我不太明白你的代码的目的,但是我担心你的代码经常会出现一些outofmemoryerror,不是吗?

    不管怎样。

    您可以获取对obejcts的引用,这些引用不会阻止对这些对象进行垃圾收集,例如softreference(在执行此操作时使用的默认引用 myObj = thisObj; ,weakreference和phantomreference。

    所以,您可以(而且应该,inf act,使用weakreference让gc完成它的工作)。但是,对于动态内存探索,已经存在一些应用程序,比如 VisualVM ,它使用允许外部进程查询虚拟机的协议: JVMPI .

    我觉得你真的应该看看这个。

        3
  •  0
  •   extraneon    14 年前

    hashmap开销不应该太大。我认为不可能用公用Java API在堆中翻找。这些对象可能不在那里,因为如果没有引用,它们将被收集。

    你什么 能够 如果hashmap开销很大,那么do就是分配一个数组,比如object[]或entry[]。当然,您将失去快速访问、添加和删除的可能性(假设数组是固定大小的,如果数组太小,则很难添加项)。

    当使用数组解决方案时,您必须事先知道您将拥有多少个条目,或者在需要时将数组复制到一个更大的数组中,如果允许删除等等,请考虑空值。基本上,ArrayList是做什么的。

        4
  •  0
  •   David Soroko    14 年前

    映射只包含指向堆上对象的指针。我不认为你能做得更好,