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

如何调查过多的java垃圾收集,java,tomcat,Java,Tomcat,我有一个Tomcat实例,它表现出以下行为: 接受单个http传入请求 向后端服务器发出一个请求,并获取大约400kb的XML 通过此XML并将其转换为大约400kb的JSON 返回JSON响应 问题是,在处理400k请求的过程中,我的webapp生成了大约100mb的垃圾,这些垃圾填满了Eden空间,并触发了年轻一代的收集 我曾尝试使用内置的JavaHPROF功能来进行分配站点分析,但Tomcat似乎没有正确启动。有可能我只是有点不耐烦,因为我想象内存分配评测有很高的开销,因此tomcat

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

  • 接受单个http传入请求
  • 向后端服务器发出一个请求,并获取大约400kb的XML
  • 通过此XML并将其转换为大约400kb的JSON
  • 返回JSON响应
问题是,在处理400k请求的过程中,我的webapp生成了大约100mb的垃圾,这些垃圾填满了Eden空间,并触发了年轻一代的收集

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


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

您应该能够通过调试应用程序,在代码的关键点放置断点,并在应用程序在每个断点处暂停时创建堆转储来让堆转储正常工作。

您可以使用JDK中jvisualvm中的探查器进行内存评测

还可以查看用于缓存XSLT转换器的模板

您可能想试试,这是Tomcat的分析器。 它支持以下内容:

概述

Lambda Probe(以前的Tomcat Probe)是一个自给自足的web应用程序,它有助于实时可视化apachetomcat实例的各种参数。Lambda Probe专门设计用于Tomcat,因此它能够访问JMX代理通常可以访问的更多信息。以下是Lambda Probe提供的功能列表:

  • 新的!全面的JVM内存使用 监视器
  • JBoss兼容性
  • 显示已部署的应用程序, 它们的状态、会话计数、会话 对象计数,上下文对象计数, 数据源使用等
  • 启动、停止、重新启动、部署和 应用程序的升级部署
  • 能够查看部署的JSP文件
  • 能够编译所有或选定的 JSP文件在任何时候都可以使用
  • 能够在上预编译JSP文件 应用程序部署
  • 新的!能够查看自动生成的 JSP servlet
  • 显示会话的会话列表 特殊应用
  • 显示会话属性和 他们对某一特定事物的价值观 应用移除的能力 会话属性
  • 能够查看应用程序上下文 属性及其值
  • 使所选会话过期的能力
  • 数据源的图形显示 详细信息,包括最大数量的 连接数,忙用户数 连接和配置详细信息
  • 新的!对数据源进行分组的能力 按URL设置属性以帮助可视化 对数据库的影响
  • 在紧急情况下重置数据源的能力 泄漏连接的应用
  • 显示系统信息 包括System.properties、内存 使用栏和操作系统详细信息
  • JK连接器状态显示 包括请求列表 待执行
  • 实时连接器使用图表和 统计数字
  • 实时集群监控与管理 clulster交通图
  • 新的!实时操作系统内存使用,交换 使用率和CPU利用率监控
  • 能够显示有关日志的信息 文件并下载选定的文件
  • 能够实时跟踪日志文件 来自浏览器的时间
  • 中断执行的能力 没有服务器的“挂起”请求 重新启动
  • 新的!能够重新启动Tomcat/JVM 通过JavaSerview包装器
  • 可用性“快速检查”
  • 支持DBCP、C3P0和Oracle 数据源
  • 对Tomcat 5.0.x和5.5.x的支持
  • 对Java1.4和Java1.5的支持

至于实际问题:使用基于DOM的解析器时,XML解析可能非常占用内存。考虑使用基于OR的解析器(基于java API)。

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


回到问题上来:我建议使用。你可以找到一篇关于如何让它与Tomcat一起工作的博客文章。

()


InMemProfiler可用于确定在很短的时间内收集哪些对象

Jvisualvm评测很困难,因为我的tomcat服务器运行在linux上,我宁愿避免在我开发的windows上运行它或安装gui linux box。在linux box上安装相应的JDK,并重定向Jvisualvm以使用在windows box上运行的X11服务器。直接在机器上进行Xming,或者在vmware会话中运行Knoppix,效果非常好。另外请注意,如果您向Tomcat JVM调用添加了适当的voodoo,jvisualvm可以从Windows Box连接,而无需进一步告别。请看一看如何启用远程JMX监视。在Tomcat中,只需将参数放在bin/setenv.sh(即
export CATALINA_OPTS='com.sun.management.jmxremote.port=12345'
etc)中,事实上,最好的解决方案看起来像是Netbeans分析器,它支持对Tomcat进行远程评测,这正是我想要的。我明天会试试这个。我怀疑垃圾的寿命很短,在这种情况下,如果内存是新分配的,则很难发现哪些位。理想情况下,我需要像可视化虚拟机内存评测这样的东西,我可以在Linux服务器上再次运行tomcat进程。