我想测量我的java应用程序中的内存分配数据,即所分配的所有对象的大小总和。由于对象分配是在年轻一代完成的,因此这似乎是正确的地方。
我知道jconsole并且我知道JMX bean但我找不到正确的变量......目前我们正在解析gc日志输出文件,但这很难。理想情况下,我们想通过JMX测量它......
如何获得此值?
查德威克评论后的其他信息:
我想知道我的应用程序使用了多少内存。这是在JBoss Appserver中运行的相当大的软件。每隔4周就有一个新版本的软件,我们需要比较旧版本和新版本之间的内存消耗。仅仅比较特定时间的老一代的当前价值是不够的。了解分配了多少/更少的内存非常有用。由于许多物体在年轻一代中被收集,我需要在那里测量它。
与此同时,我估计了这一点。我会将其作为答案发布。
谢谢, 烫发
答案 0 :(得分:3)
您可以使用MemoryPool MBeans监控年轻代,更具体地说是
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/MemoryPoolMXBean.html
请参阅http://www.javadocexamples.com/java_source/com/sun/enterprise/admin/mbeans/jvm/MemoryReporter.java.html和http://www.java2s.com/Code/Java/Development-Class/ThisVerboseGCclassdemonstratesthecapabilitytogetthegarbagecollectionstatisticsandmemoryusageremotely.htm
上的代码示例答案 1 :(得分:2)
如果您使用的是Sun JDK,则可以使用-verbose:gc -Xloggc:gc.log
启用GC日志记录并分析该文件。或者,如果您只是偶尔需要总金额,请通过Tagtraum获取GCViewer,这会计算您要查找的数字。
答案 2 :(得分:1)
Yourkit Profiler提供了有关内存使用情况的详细信息。在http://www.yourkit.com/download/index.jsp
有评估版答案 3 :(得分:1)
答案 4 :(得分:1)
这段代码怎么样,它给出了所有空间(eden,survivor,old& perm)中使用的字节总和,这几乎就是你的JVM实例使用的所有内存。
public static void main(String[] args) {
for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) {
if (bean instanceof com.sun.management.GarbageCollectorMXBean) {
com.sun.management.GarbageCollectorMXBean internal = (com.sun.management.GarbageCollectorMXBean) bean;
Runtime.getRuntime().gc();
GcInfo gcInfo = internal.getLastGcInfo();
for (Map.Entry<java.lang.String,java.lang.management.MemoryUsage> e : gcInfo.getMemoryUsageBeforeGc().entrySet()) {
System.out.println(e.getKey() + ": " + e.getValue());
}
}
}
}
答案 5 :(得分:1)
这是我对估算的看法。它基本上返回“年轻一代的数量x年轻一代的大小”的价值。它并不完美,但对我的用例非常有用。
public long getYoungGenAllocatedMB() {
long youngMaxMemory;
long youngUsedMemory;
long youngCollectionCount;
List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean bean : beans) {
if ("Par Eden Space".equals(bean.getName())) {
MemoryUsage usage = bean.getUsage();
youngMaxMemory = usage.getMax();
youngUsedMemory = usage.getUsed();
break;
}
}
List<GarbageCollectorMXBean> gBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean bean : gBeans) {
if ("ParNew".equals(bean.getName())) {
youngCollectionCount = bean.getCollectionCount();
break;
}
}
return (youngCollectionCount * youngMaxMemory + youngUsedMemory) / 1024 / 1024;
}
感谢所有其他海报!
马塞尔