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

ExecutorService java可能的线程泄漏

宋飞文
2023-03-14

我正在尝试运行这个简单的类,并且对于每个cicle,我正在计算java进程线程的数量。

ps huH p pid wc-l。

对于每个cicle,线程数是availableProcessors()数的增加。

当ExecutorService在其他线程中运行时,garbace收集器似乎不会释放僵尸线程。

如果我创建了一个静态ExecutorService,它就不会发生

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class ExecutorTest implements Runnable{

private ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private static final int CICLE_NUMBERS=100;
private static final int WAIT_SECONDS=20;

@Override
public void run() {
    try{
    ArrayList<Future<DummyThread>> responses = new ArrayList<>();
    for(int i=0;i<CICLE_NUMBERS;i++)
        responses.add((Future<DummyThread>) executor.submit(new DummyThread()));
    for (Future<DummyThread> future : responses)
        future.get(WAIT_SECONDS, TimeUnit.SECONDS);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    System.gc();
}

public static void main(String[] args) throws InterruptedException {
    for(;;){
        new Thread(new ExecutorTest()).start();
        Thread.sleep(2000);
    }
}
}

class DummyThread implements Runnable{

@Override
public void run() {
    System.out.println("Hello World!");
}

}

共有1个答案

殳经略
2023-03-14

在run()方法中添加try/finally块,并在finally块中的executor上调用shutdownNow()

 类似资料:
  • 我有一个在tomcat7上运行的Spring3网络应用程序。http://www.mkyong.com/mongodb/spring-data-mongodb-hello-world-example/,我遵循了这个教程,然后我有一个@Scheduled方法,每10秒运行一次。在这个方法中,它使用MongoOperations MongoOperations=(MongoOperations)ctx

  • 我的Optaplanner似乎出现了内存泄漏。要复制,只需下载Quarkus示例: 然后通过增加终止时间(例如,将)和取消注释表示的行来更改以启用多线程。 然后,运行手册中的请求: 内存使用量开始稳步增加,同时生成了数百万个PhreakPropagationContext对象。我认为这不是预期的行为。我应该为此制造问题还是遗漏了什么?

  • 问题内容: 我收到以下警告: 我在server.js中编写了这样的代码: 如何解决呢? 问题答案: 这是在解释节点eventEmitter文档 这是哪个版本的Node?您还有什么其他代码?那不是正常行为。 简而言之,其:

  • 问题内容: 在多个帖子中都提到了这一点:不当使用会导致内存泄漏。我正在努力了解使用内存泄漏将如何发生。 我发现的唯一情况如下: Web服务器维护一个线程池(例如,用于servlet)。如果未删除其中的变量,则这些线程可能会导致内存泄漏,因为线程不会死亡。 这种情况下没有提到“ Perm Space”内存泄漏。那是内存泄漏的唯一(主要)用例吗? 问题答案: PermGen的exhaustions 与

  • 我有一个并发哈希映射,我需要在其中更新循环中的值。虽然,并发映射本身是线程安全的,但添加操作不是原子的,因此我需要添加同步块。如果我在这里错了,请纠正我。 问题是是否可以使用锁等更有效地同步此代码?我正在从阻塞队列中获取值。 这是代码:

  • 我在log4j v1中面临内存泄漏的问题。如何解决这个内存泄漏问题。此方法是定期检查log4j.properties文件在我的类中的更新。 PropertyConfigutaror.ConfigureandWatch(time_ms); 但是在关机期间,tomcat内存泄漏问题就来了。日志如下: 提前致谢