我的应用程序在Linux上作为后台进程运行.它目前在终端窗口的命令行中启动.
最近一个用户正在执行该应用程序一段时间,它神秘地死了.文本:
杀害
在终端上.这发生了两次.我问是否有人在不同的终端使用kill命令来杀死进程?没有.
在什么条件下Linux会决定杀死我的进程?我相信shell显示"已杀死",因为该进程在收到kill(9)信号后死亡.如果Linux发送了kill信号,系统日志中是否会有消息说明它被杀的原因?
有人告诉我,我可以将-XX:+HeapDumpOnOutOfMemoryError参数添加到我的JBoss启动脚本的JVM启动选项中,以便在我们的应用程序中出现内存不足错误时获取堆转储.我想知道这些数据被丢弃的位置?它只是到控制台,还是一些日志文件?如果仅仅是控制台,如果我没有通过控制台登录Unix服务器怎么办?
你如何在Java中找到内存泄漏(例如,使用JHat)?我试图在JHat中加载堆转储以获得基本外观.但是,我不明白我应该如何能够找到根引用(ref)或其所谓的.基本上,我可以说有几百兆字节的哈希表条目([java.util.HashMap $ Entry或类似的东西),但地图遍布整个地方...有没有办法搜索大地图,或者可能找到大型对象树的一般根源?
[编辑]好的,到目前为止我已经阅读了答案,但我们只是说我是一个廉价的混蛋(这意味着我对学习如何使用JHat更感兴趣而不是支付JProfiler).此外,JHat始终可用,因为它是JDK的一部分.除非当然没有办法与JHat合作但是蛮力,但我无法相信可能是这样.
此外,我认为我不能实际修改(添加所有地图大小的记录)并运行它足够长的时间让我注意到泄漏.
列出您最喜欢的堆分析工具(例如jprofiler,jmap,...).让我们为每个答案保留一个工具,并列出每个工具的优缺点.