由于这个错误,我一直在阅读和测试 和敲我的头 在墙上超过一天的时间。
我在一个叫做 lististener
的类中有 Java 代码, 看起来像这个
ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);
boolean listening = true;
int count = 0;
while (listening) {
Runnable worker;
try {
worker = new ServerThread(serverSocket.accept()); // this is line 254
executor.execute(worker);
count++;
logger.info("{} threads started", count);
} catch (Exception e1){
//...
}
}
我一直在调换JVM设置 -Xmx
(从1到15G) 和 -Xs
(从104k到512M) 。 服务器有24GB 内存, 但也必须运行支持程序的数据库 。
创建 2 - 20 线索后( 程序的其他部分也存在几十个), 我理解错误 。
Exception in thread "Thread-0" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:657)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:943)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1325)
at xxx.Listener.run(Listener.java:254)
$java -version
产量:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (fedora-65.1.11.1.fc16-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
当这种情况发生时,系统中总是有大量的免费记忆,而其他程序继续顺利执行。 是什么使得爪哇认为它不再有新线索的记忆?
UPDATE:
Perhaps this is bigger than I thought- I managed to get this error (only one time) when I used ^C
:
OpenJDK 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated
当我试图杀死客户端(也写在爪哇,运行在同一服务器上,它是一个单线,读出一个文件,然后通过套接头将其发送到服务器)时,也发生了同样的情况,因此,绝对有一个超出JVM的限度,使一个人干扰另一个,但我无法想象,如果我仍然拥有自由的内存,而根本不使用交换机呢?服务器 - Xmx1G - Xss104k 客户端 - Xmx10M
UPDATE2:
Abandoning the perl Forks::Super
library and running the clients from bash let me get up to 34 threads before the server crashed with OOME, so running multiple clients definitely had an impact on the server, but at the same time I should still be able to run more than 34 (68 if one counts the clients) java threads at a time. Which system resources are blocking the creation of more threads (i.e. where should I look to find the hog)? When everything (clients, server, GC...) runs out of memory at the same time, top
says this about my CPU and memory usage:
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 24681040k total, 1029420k used, 23651620k free, 30648k buffers
Swap: 26836988k total, 0k used, 26836988k free, 453620k cached
<强度> UPDATE3: 强度> 下面的 hs_error 日志是否表示我的java 不是64位位?
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# JRE version: 6.0_24-b24
# Java VM: OpenJDK 64-Bit Server VM (20.0-b12 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea6 1.11.1
# Distribution: Fedora release 16 (Verne), package fedora-65.1.11.1.fc16-x86_64