首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何诊断生产linux盒上与内存相关的Java崩溃

问如何诊断生产linux盒上与内存相关的Java崩溃
EN

Stack Overflow用户
提问于 2012-03-15 03:38:21
回答 2查看 182关注 0票数 1

在生产中,我们有一个CentOS 5 linux盒,它在1.6.0_21上运行多个ApacheTomcat5.5.30实例。每个Tomcat都托管一个Java,它从Postgres9.1RDBMS中提取数据,并生成HTML/PDF/etc报告。

每隔几天,由于触发器尚未确定,其中一个Java进程将开始增加它的RAM使用量(数十次),直到机器开始将内存分页到HD,使整个服务器陷入停滞状态。我通常会使用JProbe来监视哪些对象正在消耗所有的内存,但是由于服务器是一个无头的linux安装,所以这不是一种选择。

是否有一个无头工具(CLI)可以定期记录哪些Java对象消耗的内存最多?这是诊断这个问题的最好方法吗?

更新:使用下面收到的反馈,我意识到问题的一部分是我们没有真正的崩溃,但是进程只是将RAM页放到HD上,直到整个机器变得没有响应。解决这个问题的一个解决方案(我认为)是设置-Xmx参数,以限制Java可以使用的最大内存数为几个GB。不幸的是,JVM似乎忽略了这个设置,并且在不崩溃的情况下消耗了它想要的东西。还有别的办法来强制限制吗?

EN

回答 2

Stack Overflow用户

发布于 2012-03-15 04:11:00

我在这里看到两个问题:

  1. 您的VM将不会页面,除非可用的内存<最大堆定义。因此,请确保最大堆定义的内存小于可用的RAM (所有其他processes)
  2. Next,使用的总RAM ),假设您正在看到OutOfMemoryErrors,请在OOME上启用堆转储,下次遇到问题时添加JVM参数-XX:+HeapDumpOnOutOfMemoryError
  3. ,您将有一个堆转储,可以使用Eclpise或Yourkit分析器进行分析,以查看内存中填充了什么。这将告诉您代码的哪一部分实际上是导致问题的原因。
票数 1
EN

Stack Overflow用户

发布于 2012-03-15 03:45:55

有几种方法可以解决这个问题。

显然,第一步是启用垃圾收集日志记录(添加类似于-verbose:gc -Xloggc:/path/ to /gc.log、-XX:+PrintGCDetails等)

接下来是JDK工具(jvisualvm和visuagc插件)和jmap (jmap -histo使您可以运行在活动对象上)。是的,jvisualvm是一个GUI工具,但我认为您可以进行X扩展。

你不介意自己摆弄一下吧?为什么不为您的关键类和方法编写BTrace探测呢?

还是没有足够的信息?可能想试试像AppDynamicsLite这样的工具(也可以免费从广告中剥离出来)。http://www.appdynamics.com/products-free-download.php )

这就是我为这份工作会带来的工具包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9713642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档