我有一个servlet,它接收发布到此端点的xml数据。
我将xml转换为java对象等,我想确保在此过程中最小化内存使用量。
在将xml数据发布到servlet时,分析内存使用情况并测量内容波动的最佳方法是什么?
答案 0 :(得分:0)
对于跟踪,这对我来说总是很顺利(在控制台中输出):
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秒]
答案 1 :(得分:0)
VisualVM非常适合测量你的app,它为运行时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
测试会更准确。