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