它的发生是因为我创建了许多线程,而没有关闭它们?还是经常创造新的?
有人能告诉我在代码中是否做错了什么吗?
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;
}
}
我的预感与我们看不到的代码有关:我怀疑您在某个地方一遍又一遍地调用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内