3

在我的过程中,我不断创建一个新的 Thread 对象(实际上是 Thread 的子类)(每秒最多几个),运行它并干净地结束。

我注意到,例如,当进程运行 25 天时,进程可能会死掉,留下 hprof,这意味着 OOM。但是与分配给堆的内存相比,堆转储很小,所以它可能是 PermGen OOM,我正试图找出罪魁祸首。

我没有使用任何特殊的 jvm 参数,禁止 -XX:+HeapDumpOnOutOfMemoryError

4

3 回答 3

0

您的堆转储肯定会告诉您 PermGen 的使用情况——您看过了吗?

无论如何,如果加载一个类的类加载器是 GCd,那么它加载的类也是 GCd;通常这是卸载类的唯一方法。您应该考虑使用应用程序级别的类加载器,并定期丢弃它;这将防止你的记忆问题。

于 2011-04-13T11:24:59.140 回答
0

您是否尝试过使用jhat来查看转储帽的产生,而不是仅仅假设这是一个 perm gen 问题?我不确定 hrof 文件的大小与被转储的堆大小之间是否存在直接关联。

于 2011-04-13T11:49:44.893 回答
0

我回答这个问题是为了结束。经过大量调查,至少在我的情况下,创建大量线程并不是OOM 的罪魁祸首。

我通过两种方式排除:

  1. 在另外几个实例中报告了该问题,并且在这些情况下产生的线程并不多。

  2. 我创建了一个测试,其中产生了超过 250 万个线程(在我们的案例中执行它们所做的正常工作)并且没有遇到 OOM 问题。

因此,仅仅创建非常大量的线程不是问题。

于 2011-05-09T14:10:30.380 回答