我有一个Tomcat实例,它表现出以下行为:
问题在于,在处理400k请求的过程中,我的webapp会产生大约100mb的垃圾,这些垃圾填满了Eden空间并触发了年轻一代的收集。
我曾尝试使用内置的java hprof功能来进行分配站点分析,但Tomcat似乎没有正确启动它。有可能我只是有点不耐烦,因为我认为内存分配分析具有很高的开销,因此tomcat启动可能需要很长时间
用于对非常年轻的对象/垃圾进行java内存分析的最佳工具是什么?我不能使用堆转储,因为我感兴趣的对象是垃圾。
答案 0 :(得分:2)
关于实际问题:使用基于DOM的解析器时,XML解析可能会占用大量内存。考虑使用基于SAX或binary XML的解析器(VTD-XML是基于此的Java API)。
实际上,如果XML-> JSON映射是纯1:1,那么您也可以考虑只读取XML并使用一个小堆栈逐行写入JSON实时。
答案 1 :(得分:1)
您可以使用JDK中visualvm中的探查器进行内存分析。
另请参阅模板以缓存XSLT转换器。
http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/Templates.html
答案 2 :(得分:0)
您应该能够通过调试应用程序来获得堆转储,在代码的关键点放置断点并在应用程序在每个断点处暂停时创建堆转储。
答案 3 :(得分:0)
您可能想尝试LambdaProbe,它是Tomcat的探查器。 它支持以下内容:
<强>概述强>
Lambda探针(以前称为Tomcat探针)是一个自给自足的Web应用程序,它有助于实时显示Apache Tomcat实例的各种参数。 Lambda Probe专门用于Tomcat,因此它能够访问JMX代理通常可用的更多信息。以下是Lambda Probe提供的功能列表:
答案 4 :(得分:0)
http://wiki.github.com/mchr3k/org.inmemprofiler/
InMemProfiler可用于识别在很短的时间后收集的对象。