嗯。 Java中的内存使用是否有任何入门?我本以为Sun或IBM本来会有一篇关于这个主题的好文章,但我找不到任何看起来非常可靠的文章。我有兴趣知道两件事:
我可能已经创建了数十万个对象,我希望成为一个“好邻居”,不要过度浪费RAM。我的意思是我并不在乎我是否比“最佳情况”(无论是那种情况)使用的内存多10%,但是如果我实现了一些使用5倍内存的东西,如果我做了一个简单的话改变,我想使用更少的内存(或者能够为固定数量的可用内存创建更多的对象)。
我发现了一些文章(Java Specialists' Newsletter和来自Javaworld的内容)和其中一个内置类java.lang.instrument.getObjectSize(),声称可以测量内存使用的“近似值”(??),但这些看起来都很模糊......
(是的,我意识到在两个不同的操作系统上运行的JVM可能会为不同的对象使用不同的内存量)
答案 0 :(得分:4)
我在几年前使用过JProfiler并且它做得很好,你可以将内存使用量分解到相当精细的水平。
答案 1 :(得分:4)
从Java 5开始,在Hotspot和其他支持它的VM上,您可以使用Instrumentation接口向VM询问给定对象的内存使用情况。它很繁琐,但你可以做到。 如果你想尝试这种方法,我使用Instrumentation框架在querying the memory size of a Java object上的网站上添加了一个页面。
作为32位计算机上Hotspot的粗略指南:
关于VM如何处理它们,集合没什么特别之处。它们的内存使用量是它们内部字段的总和加上 - 如果你在计算它 - 它们包含的每个对象的用法。您需要考虑像ArrayList的默认数组大小这样的事情,以及每当列表变满时该大小增加1.5的事实。但无论是询问虚拟机还是使用上述指标,查看集合的源代码并“通过它”都可以帮助您找到答案。
如果通过“封闭”你的意思是像Runnable或Callable这样的话,那么它就像一个无聊的旧物体一样。 (N.B.他们不是真的关闭!!)
答案 2 :(得分:3)
您可以使用JMP,但它只能使用Java 1.5。
答案 3 :(得分:1)
我已经多次使用Netbeans新版本附带的profiler,它运行良好,为您提供大量有关内存使用和程序运行时的信息。绝对是一个好的开始。
答案 4 :(得分:1)
如果您使用的是1.5之前的VM - 您可以使用序列化来获取大小对象。但要注意......这可能需要该对象的两倍内存量。
答案 5 :(得分:0)
查看PerfAnal是否会为您提供所需内容。
答案 6 :(得分:0)
这可能不是您正在寻找的确切答案,但以下链接的小船将为您提供非常好的指示。 Other Question about Memory
答案 7 :(得分:0)
我相信Netbeans中包含的分析器也可以监视内存使用情况,你可以试试