【问题标题】:64 bit Centos Java JVM unable to create a native thread64 位 Centos Java JVM 无法创建本机线程
【发布时间】:2014-01-05 09:21:34
【问题描述】:

我正在使用 Java 执行器服务来创建单线程。 代码:-

ExecutorService executor = Executors.newSingleThreadExecutor();
try {
    executor.submit(new Runnable() {

        @Override
        public void run() {
            Iterator<FileObject> itr = mysortedList.iterator();
            while (itr.hasNext()) {
                myWebFunction(itr.next();
            }
        };
    }).get(Timeout * mysortedList.size() - 10, TimeUnit.SECONDS);
} catch (Exception ex) {

} finally {
    executor.shutdownNow();
}

详细信息myWebfunction 处理不同大小的文件,content.Processing 涉及提取整个内容并对文件内容应用进一步的操作。 该程序在 64 位 Centos 中运行。

问题:当myWebfunction 获取的文件大小大于某个阈值(例如10MB)时,执行器服务无法创建本机线程。我尝试了各种-Xmx-Xms 设置,但执行器服务仍然抛出相同的错误。

【问题讨论】:

    标签: java executorservice centos6


    【解决方案1】:

    我的猜测是你调用了很多次,并且你没有等待已经超时的线程,留下了很多线程。当您用完堆栈空间或达到大约 32K 线程时,您将无法再创建。

    我建议使用一种不同的方法,这种方法不使用太多线程,或者在您知道不再需要它们时将它们杀死。例如。让 while 循环检查中断并调用 Future.cancel(true) 来中断它。

    【讨论】:

    • 捕获由 Future.cancel(true) 抛出的中断异常有助于避免线程阻塞。我猜 executor.shutdownNow 函数不会抛出 Interrupted 异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多