我正在运行的hadoop程序中有明显的内存泄漏。具体来说,我收到的消息: 超出了ERROR 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配置;如果程序无法使用当前配置运行,则需要重写程序。
任何人都可以帮我弄清楚如何诊断这个问题吗?是否有一个命令行参数来获取内存使用的堆栈跟踪?还有其他任何跟踪此问题的方法吗?
PS。我手工编写了错误信息,无法从有问题的系统中复制粘贴。所以请忽略任何错字作为我的愚蠢错误。
编辑:更新到此。我再跑几次了;虽然我总是得到 错误GC开销限制超出 消息我并不总是得到log4j的堆栈跟踪。所以问题可能不是log4j,而是由于缺少内存而导致log4j失败了......其他什么东西?
答案 0 :(得分:0)
“超出GC开销限制”可能意味着正在创建许多短期对象,超过GC可以处理而不会消耗超过总时间的98%。有关如何使用this question查找有问题的课程和分配位置,请参阅JProfiler。
免责声明:我公司开发JProfiler。