当前位置: 首页 > 知识库问答 >
问题:

异常:java.lang.OutofMemoryError,无法创建新的本机线程

乐正洲
2023-03-14

它的发生是因为我创建了许多线程,而没有关闭它们?还是经常创造新的?

有人能告诉我在代码中是否做错了什么吗?

public class API{
    private   MongoStoreExecutor executor = new MongoStoreExecutor(10,50);
    private class MongoStoreExecutor extends ThreadPoolExecutor {
        public MongoStoreExecutor(int queueSize, int maxThreadPoolSize) {
            super(10, maxThreadPoolSize, 30, TimeUnit.SECONDS, 
                new ArrayBlockingQueue<Runnable>(queueSize),
                new ThreadPoolExecutor.CallerRunsPolicy());
        }
    }

    public TimerTask alertingPoolsData() throws Exception, UnknownHostException {
        TimeerTask task  = new TimerTask(){
            public void run(){
                Pools = alertingPools.values().toArray();
                List<Future<?>> tasks = new ArrayList<Future<?>>(Pools.length);
                for (Object pool : Pools) {
                    tasks.add(executor.submit(new DataAccumulation(timeStartSecData,
                        timeEndSec,pool, jsonArrayResult,dataResult)));
                }
                for( Future<?> f: tasks) {
                    f.get(2 * 1000L, TimeUnit.MILLISECONDS);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        long interval = 5 * 1000L;
        tm.scheduleAtFixedRate(task,(interval - 
            (System.currentTimeMillis() % interval)), interval);
        return task;
    }
}

共有1个答案

仰翰采
2023-03-14

我的预感与我们看不到的代码有关:我怀疑您在某个地方一遍又一遍地调用alertingpoolsdata。因此,我怀疑您正在一遍又一遍地调度TimerTask。这些组件中的每个组件TimerTasks然后重复创建未知数量的Future (的每个元素对应一个元素),每个组件都将存储到您的MongoStoreExecutor中。

如果以上所有情况都是这样,那么线程计数曲线上的一阶导数为正。因此,随着时间的推移,您将看到线程数的二次增长。您将很快开始达到本机线程的上限。

正如注释中所建议的,您可以轻松地修改当前的实现。我建议使用ScheduledExecutorService和ForkJoinPool的组合。

 类似资料:
  • 问题内容: 我看到这样的评论 我见过这个问题的一个地方是,如果您继续创建线程,而不是直接在线程对象上调用run(),而不是调用start()。这将导致线程对象不被取消引用…因此,一段时间后,出现无法创建新本机线程的消息 在Sun Java论坛上 在我的应用程序中,最初我们计划使用线程,但是后来,我们决定不再需要线程,因此我们只调用run()而不是start()。我们是否需要为新的threadCla

  • 在调用shutdown方法后,这些线程是否会被杀死。我不是java开发人员。我做了一些研发。但我不成功。

  • 我试图在(1and1VPS)上运行服务器。就在服务器启动和客户机的几个请求(重新加载网页)之后,我得到了这个错误: 但是当我在计算机上运行时,一切都正常。我使用和Centos5.8新安装制作了自己的虚拟服务器,它也在那里工作。 这个内存不足错误的原因可能是什么?如果你有任何建议,请分享。我不知道该怎么处理这个了。

  • 运行5-6小时后,我从spark-driver程序中得到以下错误。我正在使用Ubuntu16.04LTS和Open-JDK-8。 cat/proc/sys/kernel/threads-max “无法创建新的本机线程”显然意味着它与堆无关。所以我相信这更多的是一个操作系统的问题。

  • 我目前正在安装一台新的MongoDB ops manager机器。安装工作正常,但我无法启动mongodb彩信服务。实例0的启动因java而失败。lang.OutOfMemoryError异常。我使用与测试服务器上相同的配置(2个CPU核,8gb ram),在那里服务启动时没有任何中断。更改ulimit配置/使用root用户启动服务无效。 新服务器规格: 2.0Ghz的10个Vcore 48gb内