hadoop中的java表观memoryleak
我正在运行的hadoop程序中有一个明显的内存泄漏。具体而言,我得到的信息是: 超出错误GC开销限制 随后是异常
attempt_201210041336_0765_m_0000000_1: Exception in thread "Tread for syncLogs" java.lang.OutOfMemoryError: GC overhead limit exceeded
attempt_201210041336_0765_m_0000000_1: at java.util.Vector.elements (Vector.java:292)
attempt_201210041336_0765_m_0000000_1: at org.apache.log4j.helpers.AppenderAtachableImpl.getAllAppenders(AppenderAttachableImpl.java:84
attempt_201210041336_0765_m_0000000_1: at org.apache.log4j.Category.getAllAppenders (Category.java:415)
attempt_201210041336_0765_m_0000000_1: at org.apache.hadoop.mapred.TaskLog.syncLogs(TaskLog.java:256)
attempt_201210041336_0765_m_0000000_1: at org.apache.hadoop.mapred.Child$3.run(Child.java:157)
在最初的试验中,我使用的数据集应该非常小,所以我不应该达到任何内存限制。更重要的是,我不想改变hadoop的配置;如果程序无法以当前配置运行,则需要重写程序
有人能帮我找出如何诊断这个问题吗?有没有命令行参数来获取内存使用情况的堆栈跟踪?是否有其他跟踪此问题的方法
另外,我手工编写了错误消息,无法从存在问题的系统复制粘贴。所以请忽略任何打字错误,因为这是我愚蠢的错误
编辑:更新此文件。我又做了几次这项工作;而我总是得到 超出错误GC开销限制 消息我并不总是得到log4j的stacktrace。因此,问题可能不是log4j,而是log4j由于以下原因导致内存不足而发生故障。。。还有别的吗
# 1 楼答案
“超出了GC开销限制”可能意味着正在创建大量短期对象,超出了GC在不消耗超过98%的总时间的情况下所能处理的范围。请参阅this question,了解如何使用JProfiler查找有问题的类和分配点
免责声明:我公司开发JProfiler