我有一个 servlet,它接收发布到此端点的 xml 数据。
我将 xml 转换为 java 对象等,并且我想确保在此过程中最小化内存使用量。
当我将 xml 数据发布到 servlet 时,我分析内存使用情况并衡量事情如何波动的最佳方法是什么?
VisualVM非常适合测量你的应用程序,它提供了运行时 CPU 信息、内存使用和线程等的各种图表。
对于跟踪这对我来说总是很顺利(控制台中的输出):
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 秒]
参考:虚拟机垃圾收集调优
您可以使用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
测试会更准确。