当看到这个错误时,第一感觉是创建的线程太多了、内存不够用了,把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"));
总结一下,发现自己对多线程这块,还是不够熟悉,对一些概念,也是一知半解,所以,要学习的还有很多很多。
相关推荐
问题分析:java.lang.OutOfMemoryError unable to create new native thread - ado1986 - CSDN1
内存不足OOM java.lang.OutOfMemoryError.
java.lang.OutOfMemoryError: Java heap space 解决方法
java.lang.OutOfMemoryError: PermGen space 解决方案
搜集整理关于java错误处理:java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: Java heap space 资料整理
tomcat内存溢出总结 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和... 3.OutOfMemoryError: unable to create new native thread.
Caused by: java.lang.OutOfMemoryError: PermGen space解决方案, avax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space at org.apache.jasper.servlet.JspServlet.service(JspServlet.java...
JBeret是。 它还包含在在Java EE环境中提供可移植批处理支持。...并可能在某些计算机上引起内存错误: OutOfMemoryError: unable to create new native thread增加ulimit以避免此类错误。 例如, uli
jvm内存详解,理解 JVM 如何使用 Windows 和 Linux 上的本机内存
java.lang.OutOfMemoryError: PermGen space及其解决方法,解决项目太大tomcat内存溢出
NULL 博文链接:https://geyubin.iteye.com/blog/779330
解决OutOfMemoryError: PermGen space,过程是痛苦的,结果是舒畅的
java.lang.OutOfMemoryError: PermGen space
Tomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的java.lang.OutOfMemoryError: PermGenTomcat给我的...
java虚拟机OutOfMemoryError:Java heap space堆dump文件,可以直接用来分析。
3.OutOfMemoryError: unable to create new native thread. Tomcat内存溢出解决方案 对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize -XX:...
报错 java.lang.OutOfMemoryError: PermGen space 报错 java.lang.OutOfMemoryError: Java heap 启动报错java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler JAVA_OPTS="-server -Xms800m ...
记录java.lang.OutOfMemoryError:Java heap space的情况 文章内容: 一.问题描述+原因分析+解决方案 二.JVM调优说明 三.Tomcat添加到jvisualvm监控
OutOfMemoryError的8种经典案例,Java heap space、GC overhead limit exceeded、Permgen space、Metaspace、Unable to create new native thread、Out of swap space?、Requested array size exceeds VM limit、...