如何调查过多的java垃圾回收

时间:2010-07-03 10:07:33

标签: java tomcat

我有一个Tomcat实例,它表现出以下行为:

  • 接受单个http传入请求。
  • 向后端服务器发出一个请求,并返回大约400kb的XML。
  • 传递此XML并将其转换为大约400kb的JSON。
  • 返回JSON响应。

问题在于,在处理400k请求的过程中,我的webapp会产生大约100mb的垃圾,这些垃圾填满了Eden空间并触发了年轻一代的收集。

我曾尝试使用内置的java hprof功能来进行分配站点分析,但Tomcat似乎没有正确启动它。有可能我只是有点不耐烦,因为我认为内存分配分析具有很高的开销,因此tomcat启动可能需要很长时间

用于对非常年轻的对象/垃圾进行java内存分析的最佳工具是什么?我不能使用堆转储,因为我感兴趣的对象是垃圾。

5 个答案:

答案 0 :(得分:2)

关于实际问题:使用基于DOM的解析器时,XML解析可能会占用大量内存。考虑使用基于SAXbinary XML的解析器(VTD-XML是基于此的Java API)。

实际上,如果XML-> JSON映射是纯1:1,那么您也可以考虑只读取XML并使用一个小堆栈逐行写入JSON实时。


回到问题:我建议使用VisualVM。您可以找到here博客文章,了解如何使用Tomcat。

答案 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提供的功能列表:

  • 新!全面的JVM内存使用 监视。
  • JBoss兼容性
  • 显示已部署的应用程序, 他们的状态,会话次数,会话 对象计数,上下文对象计数, 数据源使用等。
  • 启动,停止,重新启动,部署和 应用程序的升级
  • 能够查看已部署的JSP文件
  • 能够编译所有或选定的 随时都有JSP文件。
  • 能够预编译JSP文件 应用程序部署。
  • 新!能够查看自动生成的 JSP servlets
  • 显示会话列表 特别的应用
  • 显示会话属性和 他们的特定价值观 应用。能够删除 会话属性。
  • 能够查看应用程序上下文 属性及其价值。
  • 能够使所选会话失效
  • 数据源的图形显示 细节包括最大数量 连接,忙碌的数量 连接和配置细节
  • 新!能够对数据源进行分组 URL的属性以帮助可视化 对数据库的影响
  • 能够重置数据源以防万一 泄漏连接的应用程序
  • 显示系统信息 包括System.properties,内存 使用栏和操作系统详细信息
  • 显示JK连接器状态 包括请求列表 待执行
  • 实时连接器使用情况图表和 统计
  • 实时集群监控和 clulster交通图表
  • 新!实时操作系统内存使用,交换 用法和CPU利用率监控
  • 能够显示有关日志的信息 文件和下载所选文件
  • 能够真实地拖尾日志文件 来自浏览器的时间。
  • 能够中断执行 没有服务器的“挂起”请求 重新启动
  • 新!能够重启Tomcat / JVM 通过Java Serview Wrapper。
  • 可用性“快速检查”
  • 支持DBCP,C3P0和Oracle 数据源
  • 支持Tomcat 5.0.x和5.5.x
  • 支持Java 1.4和Java 1.5

答案 4 :(得分:0)

http://wiki.github.com/mchr3k/org.inmemprofiler/

InMemProfiler可用于识别在很短的时间后收集的对象。