【问题标题】:how to improve java code based on this stats?如何根据这些统计数据改进 Java 代码?
【发布时间】:2011-04-19 19:28:50
【问题描述】:

我有一个 Web 应用程序,它通过每 10 秒运行一次调度程序任务将一些 PCL 文件转换为 PDF。每次需要最大。一个目录中的 20 个 pc 文件并将它们转换为 pdf。

最初的几个任务运行良好,但逐渐变慢,突然出现GC overhead limit exceeded 错误消息。

我尝试使用 VisualVM 分析此内存泄漏,以下是 heapdump 的一些输出:

奇怪的是显示了这么多的 bytes 实例 (3.366.687 !!!)。在应用程序中,我也有 Streams,我真的检查了所有这些流在相关操作完成后是否关闭。

我通过三种方法在单个类中使用字节: 字节[] buf = 新字节[1024];

 public void initBuf() {
        if (buf != null) {
            for (int i = 0; i < buf.length; i++) {
                buf[i] = (byte) 0x00;
            }

            pdf_y = PageSize.A4.getHeight();
        }
    }

public void appendBuf(char ch) {

        if (ch == '\n') {
            processChunk();
            drawChunks();
            pdf_newline();
        } else if (ch != '\r') {
            buf[buf_index++] = (byte) (0xff & ch);
        }
    }

    public void resetBuf() {
        for (int i = buf_index; i >= 0; i--) {
            buf[i] = (byte) 0x00;
        }

        buf_index = 0;
    }

你建议我去哪里看? 我如何才能真正确定我的哪些代码在做这种有害的事情?

我无法发布所有代码,因为有更多的类可以进行这种转换,但我真的希望你能帮助我一些建议,因为我花了很多时间,但这个内存问题仍然存在。

提前致谢

【问题讨论】:

  • 你试过什么? (你可能会看到一些改进,只要你用完它们就积极地清空你所要求的游荡大字节数组)

标签: java performance memory-leaks


【解决方案1】:

您的分析器屏幕截图显示了 330 万个 java.lang.Byte 实例,而不是 byte[] 实例。我会在别处寻找 Byte 的用法(可能包括从 byte 自动装箱以将它们插入到集合中的实例。

我的第一个怀疑是您的代码的其他部分正在向映射添加 Bytebyte 实例(作为键或值)并且未能不再需要时将其删除。但这只是基于我自己的一些内存泄漏的猜测。

【讨论】:

  • 至少如果我能在 VM 中找到使用字节执行此操作的类...
  • 另请注意,您有 301 个 Byte[] 实例,共消耗 212 MB 内存。您可以在代码中搜索对 Byte[] 的引用,或者通过 VisualVM 中对那些 Byte[] 数组的引用进行追溯。
【解决方案2】:

查看有关使用堆转储的 VisualVM 指南:here's Oracle's

您还可以查找 NetBeans 引用,因为组件是相同的,例如How do you find memory leaks using the Netbeans profiler?

您需要知道是谁创建或保留了对Byte[]s 和Bytes 的引用。一种攻击计划是检查单个Byte[] 实例(“实例视图”)并查看它们的引用。 “Nearest GC Root”选项将显示一个保留挥之不去的Byte[]的对象路径。

【讨论】:

  • 问题是,如果我按下一个 byte[] 实例,我会在右侧看到引用,但我只看到 [](数组类型)和 o(对象类型),没有 GC 根箭头我的变量...
  • “显示最近的 GC 根”是右键单击上下文菜单中的一个选项。如果没有 GC 根,应该说明该对象符合 GC 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2017-05-06
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多