0

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

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

当我将 xml 数据发布到 servlet 时,我分析内存使用情况并衡量事情如何波动的最佳方法是什么?

4

3 回答 3

0

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

于 2013-01-06T02:19:26.830 回答
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)(98304K),0.0031220 SECS SECS] 235615K-> 1700010.000320.000320 K(490050K) =0.00,实数=0.00 秒]

参考:虚拟机垃圾收集调优

于 2013-01-06T00:15:28.987 回答
0

您可以使用JMX

堆内存:

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();

}

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

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

正如@Gavin Xiong 所说,您可以使用一些带有 UI 的工具,例如VisualVM

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

Single Thread测试会更准确。

于 2013-01-06T04:05:09.383 回答