【发布时间】: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