gpt4 book ai didi

java - tomcat 7 + freebsd 7.2(32 位)多线程应用程序抛出 OutOfMemoryError : could not create native thread

转载 作者:行者123 更新时间:2023-11-28 23:39:03 27 4
gpt4 key购买 nike

情况:服务器基于freebsd 7.2,安装了tomcat 7。 Tomcat 7 运行巨大的多线程服务器应用程序,它通过 ServerSocket 从一些不同的设备读取数据。因此,不同设备的每个端口都有一些监听器线程。当设备被授权时,监听器创建新线程从授权设备(每个线程 1 个设备)收集数据,顺便说一句,传入的数据不是那么大。还有用于客户端的 web 套接字监听器,它的工作方式相同 - 每个客户端 1 个线程。在设备数量从 200 增加到 1500(客户端数量也增加,接近 300)之前,这一切都非常有效。理想情况下,进程必须与超过 3000 个 Activity 线程一起工作,但它会崩溃。

下面是应用程序基于线程池的代码。

public class MultiThreadPool {

private static final int INITIAL_POOL_SIZE = 1250;
private final LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
private final ThreadPoolExecutor exec = new ThreadPoolExecutor(INITIAL_POOL_SIZE, Integer.MAX_VALUE, 1, TimeUnit.MINUTES, queue, new ThreadFactory() {

@Override
public Thread newThread(Runnable r) {
Thread th = new Thread(r);
//th.setDaemon(true);
th.setContextClassLoader(null);
th.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

@Override
public void uncaughtException(Thread t, Throwable e) {
//t.setDaemon(true);
//throw new UnsupportedOperationException("Not supported yet.");
}
});
return th;
}
});

private static class SingletonHolder {

private final static MultiThreadPool instance = new MultiThreadPool();
}

private static MultiThreadPool getInstance() {
return SingletonHolder.instance;
}

public MultiThreadPool() {
}

public static void initPool() {
getInstance();
}

public static void executeRunnable(Runnable r) {
try {
getInstance().exec.execute(r);
} catch (OutOfMemoryError e) {
System.out.println("** Out of memory: " + e.getMessage());
}
}

public static void stopPool() {
getInstance().exec.shutdownNow();
//getInstance().executor.shutdownNow();
}
}

所有线程都通过 ExecuteRunnable(Runnable r) 过程运行。例如,将 INITIAL_POOL_SIZE(ThreadPoolExecutor 的核心大小)增加到 1300 会导致 OutOfMemoryError:无法创建 native 线程。此外,如果 INITIAL_POOL_SIZE 保持在 1250,则队列中的其他线程根本无法工作,直到某些核心线程未完成。这导致客户端在这两种情况下都无法正常工作。

我已经尝试使用 -Xss、-server、-Xms、-Xmx、-Xss、perm size 等来操纵 JVM。使用 loader.conf 和 login.conf 甚至增加了操作系统硬限制。但所有这些都无济于事或使情况变得更糟。 freebsd 中是否可能存在其他限制,可以通过使用其他配置部署内核来增加这些限制?

无论如何,我需要增加服务器上的 Activity 线程数量来处理全套设备和客户端。顺便说一句,设备至少每 5 秒发送一次数据。

请告诉我解决此问题的正确方法!

PS:这个应用程序是另一个人开发的,所以我不能说太多,因为它真的很大。但如果您需要,我会尽力为您提供更多信息。

最佳答案

无论内存如何,操作系统似乎都受限于它可以创建的线程数。根据您使用的操作系统,检查限制并检查是否可以增加数量。

例如对于 mac 你检查通过

sysctl kern.num_threads
kern.num_threads: 10240

对于 Linux

cat /proc/sys/kernel/threads-max
3500

等等。

您可以通过两种方式解决这个问题。

  1. 增加人数
  2. 使用线程池而不是创建数千个线程(通常我更喜欢这种想法)。

关于java - tomcat 7 + freebsd 7.2(32 位)多线程应用程序抛出 OutOfMemoryError : could not create native thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727235/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com