是否有可能看到一个对象正在使用多少堆?

| 如果我有一个“ 0”,是否可以对每个对象运行某种方法以查看每个对象消耗了多少内存?我对每个对象一无所知,它可能是整个视频文件加载到堆上,还是只是一个两个字节的字符串。我最终想知道在内存不足之前先删除哪些对象。 我认为“ 1”显示了JVM当前使用的内存,但是我想查看单个对象使用的内存。     
已邀请:
这是我见过的最好的... 在Java中,确定对象大小的最佳方法是什么?     
SoftReference看起来有点像您所需要的。创建一个对对象的软引用列表,如果这些对象在任何地方都没有引用,并且您的内存不足,JVM将删除其中的一些。我不知道选择删除内容的算法有多聪明,但是它也可以删除那些将释放大部分内存的算法。     
如果您在容器中,则可以使用Jconsole http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html 从1.5开始的jdk附带了堆转储选项。您是在容器中还是日食中?还有为什么你有一个对象列表?     
没有干净的方法可以做到这一点。您可以创建一个伪OutputStream,除了计数写入的字节数之外,什么都不做。因此,您可以通过将对象序列图序列化为此类流来对其进行估算。 我不建议在生产系统中这样做。我个人曾经做过一次实验和评估。     
实际上,另一种可能的策略是对要检查的类的实例进行垃圾处理(例如数组中的一百万)。 纯粹的对象数量应该抵消开销(因为其他东西的开销将比您的对象垃圾负载小得多)。 您当然想单独运行它(即public static main())。 我承认您将需要大量的内存来进行此测试。     
您可以做的是制作一个ѭ2,将每个对象映射到其内存大小。 然后,要测量特定对象的大小,您必须在每个对象的实例化时进行操作-在构建对象之前(调用
Runtime.totalMemory()
)和构建对象之后(调用
Runtime.totalMemory()
)测量JVM内存使用情况,并取两者之间的差-即内存中对象的大小。然后将
Object
Long
添加到您的地图。从那里,您应该能够遍历地图中的所有键,并使用最大的空间查找对象。 我不确定在您有了
List<Object>
之后是否可以对每个对象执行此操作...希望对您有所帮助!     

要回复问题请先登录注册