【发布时间】:2016-06-13 05:45:22
【问题描述】:
我的代码基本上运行在 Apache Spark 上,其中每个容器都运行在单独的 JVM 上。您为容器指定一定的内存限制。在我的程序中,一个容器可以很好地完成一项任务,但是当它尝试执行另一项任务时,它会崩溃,说超出了内存限制。如果我在单独的容器中运行每个任务,它们总是运行良好。所以,看起来任务完成后留下了一些未关闭的资源,我在代码中无法弄清楚,这些未关闭的资源增加了容器的内存。所以,我的问题是,Java 中有没有办法告诉 JVM 强制关闭所有资源。我也可以强制垃圾收集吗?我想在每个任务结束时执行这两个步骤。
【问题讨论】:
-
不,您确实需要在程序中小心清理不必要的对象。 Java 只会为符合 GC 条件的对象释放内存(但它会在抛出 OutOfMemory 错误之前可靠地执行此操作)。
-
您可以让 JVM 在进行 OOM 以查看仍然存在的内容时生成堆内存转储。有一个启动标志。
-
您通常不能“关闭所有未关闭的资源”,因为这些资源可能仍在您的程序中使用。正如@Thilo 提到的,分析任何实际泄漏的堆转储可能是您最好的选择。
标签: java scala apache-spark