我使用的系统正在创建大量的对象并且垃圾一直在收集它们,这导致堆消耗的图表非常陡峭。我想知道正在生成哪些对象来调优代码,但我无法找到在垃圾收集开始时转储堆的方法。当我试图在随机时间通过JConsole手动启动dumpHeap时,我总是在GC完成运行后得到结果,并且没有得到任何有用的数据。
欢迎任何有关如何追踪过多临时对象的说明。
答案 0 :(得分:1)
您正在寻找的是您计划中最密集型分配网站。您可以使用以下工具:Allocation Instrumentor for Java。您的评论的答案:
当我尝试通过启动dumpHeap时 JConsole随机手动,我 GC完成后总会得到结果 它的运行,并没有得到任何有用的 数据
是堆转储触发VM中的GC,因为堆转储是堆中存在的内容的报告(大多数情况下) - VM需要最精确的图像显示当前的实时内容堆转储已被触发,因此GC事件将始终在转储请求启动后立即发生。
调整Java堆是一门艺术 - 网上有很多关于如何做的材料。
答案 1 :(得分:1)
看看BTrace可以做什么(http://kenai.com/projects/btrace/pages/Home),或者尝试在JDK 6u18中使用jvisualvm
进行实时内存采样。
答案 2 :(得分:0)
从项目页面引用:
Apache JMeter可用于测试 静态和动态的表现 资源(文件,Servlets,Perl 脚本,Java对象,数据库和 查询,FTP服务器等)。它可以 用来模拟一个重负荷 服务器,网络或对象来测试它 力量或整体分析 不同负载下的性能 类型。
我记得M. Fowler提到,在使用分析器测试整个系统之前,几乎不可能猜出导致性能问题的原因。
答案 3 :(得分:0)
如果上述规定的解决方案无法解决您的目的,您可以使用JVMPI interface(以及像Dr.MEM这样的工具)并创建您自己的自定义解决方案。然而,根据您的问题,这可能是一种过度杀伤。