【问题标题】:Heap memory vs object memory堆内存与对象内存
【发布时间】:2013-08-21 20:19:14
【问题描述】:
根据一篇关于Java内存和特性的论文:
"... 内存分数分为两种:堆内存,即应用程序在运行时消耗的内存,以及对象内存,即程序中使用的各种对象分配的内存,例如作为整数和字符串等。 ..."
当他们说 object 内存时,他们是指 stack 内存,还是他们的意思? (很困惑,如果我没记错的话,Java 中的对象是在堆中分配的)
第二个问题,如果我只是想在整个程序执行期间测量堆和堆栈的总大小,我应该使用什么工具?我一直在环顾四周,尝试了 NetBeans 7.3.1 和 YourKit 12.0.6 中的内置 Java Profiler,我可以在其中检查堆,但是当说到研究堆栈上的“对象”和变量,我找不到办法!
总而言之,我如何衡量论文所描述的内容:
谢谢!
【问题讨论】:
标签:
java
profiling
profiler
【解决方案1】:
堆内存:Java 对象的存储。当你使用 new 关键字创建一个类的实例时说。
堆栈内存:用于存储局部变量、方法调用等。JVM也可以决定并使用它来存储某些对象以提高性能。
要获取,您使用的总内存-
usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
您无法在运行时获取堆栈内存,但您可以启动具有预定义堆栈大小的应用,具体取决于您的平台。
有一个非堆内存,我认为他们将其定义为对象内存,用于存储加载的类..元数据等。
参考资料:
MemoryMXBean
JConsole
【解决方案2】:
我认为它们是指为加载类和静态数据而保留的内存区域。我一直把它称为非堆内存。我使用 VisualVM 来测量内存使用情况。精确测量内存具有挑战性,因为使用量会随着垃圾收集器的运行、类的加载和卸载等不断波动。
内存使用情况随时间变化的图表通常更有助于了解和查找内存问题/使用情况。
http://visualvm.java.net/