`
zhangyou1010
  • 浏览: 303762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OutOfMemoryError: unable to create new native thread

    博客分类:
  • java
 
阅读更多



 

 

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

 

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

 

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

 

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



 

从上图,可以发现,产生了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信息如下:



 

根据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"));

 

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

  • 大小: 280.4 KB
  • 大小: 15 KB
  • 大小: 209.9 KB
分享到:
评论
1 楼 lg5414 2013-11-28  
已经不错了

相关推荐

    问题分析:java.lang.OutOfMemoryError unable to create new native thre

    【Java虚拟机内存溢出分析】:当遇到`java.lang.OutOfMemoryError: unable to create new native thread`错误时,这通常表示系统无法为新的Java线程分配足够的内存,即操作系统层面的资源耗尽,而非Java堆内存不足。...

    内存不足OOM java.lang.OutOfMemoryError.

    3. **无法创建新的本地线程 (Unable to create new native thread)**: - 每个Java应用在操作系统上都表现为一个或多个线程。当JVM尝试创建新线程但操作系统报告无可用资源时,会抛出此错误。 - 这可能是由于系统...

    OutOfMemoryError_8种典型案例分享

    5. 无法创建新的原生线程(Unable to create new native thread) 当JVM尝试创建新的线程时,如果无法获取足够的原生内存来分配新线程的栈空间,就会抛出该错误。通常发生在系统限制了线程数量或是原生内存不足时。 ...

    java内存溢出原因

    - **错误日志**:`java.lang.OutOfMemoryError: unable to create new native thread` 和 `java.lang.OutOfMemoryError: request bytes for ... Out of swap space?` - **原因**:可能由于Java堆设置过大导致...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    4. OutOfMemoryError: unable to create new native thread:无法创建新 native 线程。 解决方案: * 通过 -XX:MaxMetaspaceSize=512m 等 JVM 参数调整 Metaspace 的大小。 * 优化代码,减少对象的创建和销毁,...

    Dubbo无法创建新线程异常解决方案.docx

    在使用Dubbo进行分布式服务调用的过程中,可能会遇到“无法创建新线程”的异常情况,具体表现为`java.lang.OutOfMemoryError: unable to create new native thread`。此类异常通常出现在系统资源紧张的情况下,特别...

    TOMCAT内存溢出之解决方法

    系统会提示出错,前台错误为:HTTP Status 500-Dispatch[EAITool] to method listCurTree retrun an exception,后台错误为:java.lang.OutOfMemoryError: unable to create new native thread。 解决方法: 为了...

    jsr352:实施JSR 352

    JBeret是。 它还包含在在Java EE环境中提供可移植批处理支持。...并可能在某些计算机上引起内存错误: OutOfMemoryError: unable to create new native thread增加ulimit以避免此类错误。 例如, uli

    JAVA内存溢出

    第三种OutOfMemoryError:unable to create new native thread 这种错误在Java线程个数很多的情况下容易发生,发生原意和解决办法可以参见相关文档。 OutOfMemoryError是Java开发中的一种常见错误,了解JVM的内存...

    tomcat内存溢出总结(2013年)

    3. OutOfMemoryError: unable to create new native thread 这种情况发生在JVM无法创建新的操作系统线程时,通常与系统资源的限制有关,包括JVM的线程栈大小和操作系统的线程限制。解决方法可能涉及调整JVM的线程栈...

    linux 测试环境线程问题解决

    java.lang.OutOfMemoryError: unable to create new native thread ``` 或是在启动服务时收到: ``` /etc/profile: fork: retry: Resource temporarily unavailable ``` 这些错误通常表明系统中的线程资源已经...

    apache服务器出现内存溢出的解决方法.doc

    3. **OutOfMemoryError: unable to create new native thread**: 当操作系统无法为新线程分配足够的内存时,会出现此错误。这可能是由于操作系统的线程限制或者JVM的线程堆栈大小设置不当。调整操作系统参数和 `-Xss...

    tomcat内存溢出在不同系统上各种详细的解决方案

    3. **OutOfMemoryError:Unable to create new native thread** - **原因**:这种情况通常是由于系统级别的线程资源耗尽导致的。 - **解决思路**:除了调整JVM参数外,还需要考虑操作系统层面的优化,例如增加线程...

Global site tag (gtag.js) - Google Analytics