测量servlet的内存使用情况,分析建议?

时间:2013-01-06 00:05:52

标签: java servlets jvm profile

我有一个servlet,它接收发布到此端点的xml数据。

我将xml转换为java对象等,我想确保在此过程中最小化内存使用量。

在将xml数据发布到servlet时,分析内存使用情况并测量内容波动的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

对于跟踪,这对我来说总是很顺利(在控制台中输出):

  • -verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps
  

2013-01-05T22:52:13.954 + 0100:15918369.557:[GC 15918369.557:[DefNew:   65793K-> 227K(98304K),0.0031220秒] 235615K-> 170050K(491520K),   0.0033220秒] [时间:用户= 0.01 sys = 0.00,实际= 0.00秒]

参考:Virtual Machine Garbage Collection Tuning

答案 1 :(得分:0)

VisualVM非常适合测量你的a​​pp,它为运行时CPU信息,内存使用和线程等提供了各种图表。

答案 2 :(得分:0)

您可以使用JMX

HeapMemory:

public String monitorMemory() {

    StringBuilder sb = new StringBuilder("Memory:");

    MemoryMXBean mmbean = ManagementFactory.getMemoryMXBean();
    MemoryUsage hmu = mmbean.getHeapMemoryUsage();
    sb.append("[HeapMemoryUsage:");
    sb.append(" Used=" + formatBytes(hmu.getUsed()));
    sb.append(" Committed=" + formatBytes(hmu.getCommitted()));
    sb.append("]");

    MemoryUsage nhmu = mmbean.getNonHeapMemoryUsage();
    sb.append("[NonHeapMemoryUsage:");
    sb.append(" Used=" + formatBytes(nhmu.getUsed()));
    sb.append(" Committed=" + formatBytes(nhmu.getCommitted()));
    sb.append("]");
    return sb.toString();
}

记忆池:

public String monitorMemoryPool() {
    StringBuilder sb = new StringBuilder("MemoryPool:");

    List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();

    for (MemoryPoolMXBean p : pools) {
        sb.append("[" + p.getName() + ":");
        MemoryUsage u = p.getUsage();
        sb.append(" Used=" + formatBytes(u.getUsed()));
        sb.append(" Committed=" + formatBytes(u.getCommitted()));
        sb.append("]");
    }
    return sb.toString();

}

在代码或方法之前和之后运行上面的代码。

当您的网络服务处理其他请求时,这可能不够准确。

正如@Gavin Xiong所说,你可以使用一些像VisualVM这样的用户工具。

但是,最好不要在生产环境中使用UI工具。

Single Thread测试会更准确。