目前我使用HashMap<Class, Set<Entry>>
,它可能包含数百万个短期和长寿命的对象。 (Entry
是Object
周围的包装类和一个重复计数的整数。
我想:这些Object
都存储在JVM的Heap中。然后我的问题浮现在我脑海里;而不是为HashMap
分配大量内存,可以做得更好(减少内存消耗)吗?
有没有办法根据Object
的{{1}}间接访问Java堆中的Class
?
“间接”是指:没有指向Object
的指针。使用“access”我的意思是:检索指向堆中Object
的指针。
答案 0 :(得分:2)
我真的不明白你的代码的目的,但我担心你的代码会涉及一些频繁的OutOfMemoryError,不是吗?
反正。
您可以获得对不会阻止这些对象进行垃圾回收的obejct的引用,例如SoftReference(执行myObj = thisObj;
时使用的默认值),WeakReference和PhantomReference。
因此,您可以(并且应该使用WeakReference让GC执行其工作)。但是,对于动态内存探索,已存在一些应用程序,如VisualVM,它使用允许外部进程查询VM的协议:JVMPI。
我认为你真的应该看看这个。
答案 1 :(得分:1)
没有。基本上,每个对象都知道它的类,但是一个类并不知道它的所有对象 - 它不是JRE工作方式所必需的,只是无用的开销。
为什么你还需要知道这些类的所有实例?也许有更好的方法来解决你的实际问题。
答案 2 :(得分:0)
HashMap开销不应该那么多。而且我认为使用公共Java API在堆中翻找是不可能的。无论如何,对象可能不会存在,因为如果没有参考,它们将被收集。
你可以做什么,如果HashMap开销很大,则分配一个数组,比如Object []或Entry []。当然,你将失去快速访问,添加和删除的可能性(假设数组是固定大小的,如果数组太小则很难添加项目。)
使用数组解决方案时,您必须事先知道您将拥有多少条目,或者在需要时将数组复制到更大的数组中,如果允许删除等,请考虑空值。基本上是ArrayList的功能。
答案 3 :(得分:0)
映射仅包含指向堆上对象的指针。我认为你不能做得更好,