有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    “超出了GC开销限制”可能意味着正在创建大量短期对象,超出了GC在不消耗超过98%的总时间的情况下所能处理的范围。请参阅this question,了解如何使用JProfiler查找有问题的类和分配点

    免责声明:我公司开发JProfiler