0

我正在使用 64G 内存的远程服务器上工作,我正在使用一个使用 32 位 JVM 的平台,我要做的是创建多个 JVM(大约 500 个)。发生的情况是,在创建 190 左右之后,我从 java 收到 OOM 错误,说无法创建新的本机线程。每个 JVM 占用大约 20M 的 RAM,所以 20*190 大约是 4G。那么所有JVM一起使用的内存有什么限制吗?顺便说一句,我在 Linux 中的进程限制约为 10000,而 /proc/sys/kernel/pid_max 中的限制为 65000,而且我没有其他进程缺乏资源。还有一点,改变堆大小也无济于事。有什么想法吗?

4

1 回答 1

1

您的问题与堆大小无关。它与您能够创建的线程数有关。

当您运行 JVM 时,您会创建(并且处于活动状态)很多线程。我至少可以数出其中的 25 个。例如,有用于 Timer 任务的线程、编译器线程、Finalizer 线程,当然还有 GC 线程。

除了 SerialGC,每个垃圾收集器都会创建与您拥有的内核数量成比例的线程数,因此它会对每个 JVM 的线程数产生巨大影响。

一些事情要做:

  • 增加您的进程限制
  • 设置最大线程数 ( -XX:ConcGCThreads=N, -XX:ParallelGCThreads=N)
  • 执行一些线程转储以检查 JVM 中的线程数并推断出适合您平台的正确数量

更多 JVM 选项:http: //jvm-options.tech.xebia.fr/

希望有帮助!

于 2013-05-26T15:04:59.527 回答