欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OutOfMemoryError: unable to create new native thread

程序员文章站 2022-01-18 10:03:48
...


OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
 

 

当看到这个错误时,第一感觉是创建的线程太多了、内存不够用了,把tomcat的堆由1G调整到2G后,该问题还

 

是出现,网上有人说要把-Xss参数调小,该参数是创建新线程时,分配的内存空间大小,调整了该值后,发现

 

服务上还是会创建大量的线程,用jvisualvm监控到tomcat的线程情况如下图,其实如果经验丰富点的人,一看

 

下面这图,就可能知道问题所在,但我还是折腾了蛮久,才找到原因。


OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
 

从上图,可以发现,产生了1002个线程,然后tomcat就outofmemoryError了,据我所知,业务代码里面是有

 

用到线程池的,找到线程池的代码,发现线程池的代码,是有限制线程数的。但是无法确定该线程池的线程

 

数限制是否生效了,后面就给线程池加上自定义的线程名称,代码如下:

 public static class NamedThreadFactory implements ThreadFactory
    {
        private final String baseName;
        
        private final AtomicInteger threadNum = new AtomicInteger(0);
        
        public NamedThreadFactory(String baseName)
        {
            this.baseName = baseName;
        }
        
        @Override
        public synchronized Thread newThread(Runnable r)
        {
            Thread t = Executors.defaultThreadFactory().newThread(r);
            
            t.setName(baseName + "-" + threadNum.getAndIncrement());
            
            return t;
        }
    }

 

然后初始化线程池:

ExecutorService service = Executors.newFixedThreadPool(200, new NamedThreadFactory("ThreadPoolUtil-ThreadPool"));

 

 

再通过监控发现,我命名了的线程,确实只创建我指定数量的线程,但是,

pool-127-thread-1

 

这种线程还是一直在创建,但是仔细查看代码,没有发现其他使用线程池的地方。

 

该类线程的dump信息如下:


OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
 

根据dump信息,也无法知道哪块代码创建的线程,正当我准备根据dump信息里面的代码信息,去远程

 

debug时,热心的朋友提示我,

pool-127-thread-1

 

表示的意思是第127个线程池,里面有一个线程,然后,他说,这一般是通过Executors类产生的,我马上在

 

代码中搜索Executors,果不其然,在某业务的父类中发现一实例变量:

 

private  ExecutorService executor = Executors.newFixedThreadPool(1);

 

可以肯定就是这行代码导致的,每次创建该类的实例,都会新增一个线程池,线程池大小为1,把实例变量改为类变量后,同时

 

给线程池加上命名,重新部署到服务器上后,问题解决。

 

private static ExecutorService executor = Executors.newFixedThreadPool(1, new NamedThreadFactory(
        "BaseXXXXX-ThreadPool"));

 

总结一下,发现自己对多线程这块,还是不够熟悉,对一些概念,也是一知半解,所以,要学习的还有很多很多。

  • OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
  • 大小: 280.4 KB
  • OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
  • 大小: 15 KB
  • OutOfMemoryError: unable to create new native thread
            
    
    博客分类: java
  • 大小: 209.9 KB