最近在带项目,在解决生产问题时,有些问题值得记录一下:
1 频繁创建线程池导致的oom
正常的使用线程池一般是在类里面创建线程池,然后在方法里调用即可。此时,该线程池的生命周期是和类的生命周期一样的,也和进程的生命周期绑定。可以反复使用。这是使用线程池的正确姿势。
项目成员在使用线程池时:在方法级别创建线程池。导致频繁的出现oom问题。代码如下:
@GetMapping(“getUserInfo”)
public UserInfo getUserInfo() throws InterruptedException {
UserInfo userInfo = new UserInfo();
userInfo.setUserName(“zhangsan”);
userInfo.setAddress(“tt”);
doExecute();
return userInfo;
}
private void doExecute() throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0;i < 10;i++) {
TestThread testThread = new TestThread("testThread" + i, i);
service.execute(testThread);
}
TimeUnit.SECONDS.sleep(5);
}
这里只是一个demo。仅供参考。此时,每一次调用方法均会创建一个线程池,10个线程。且该线程池(10个线程不会被jvm回收),最终导致linux机器无法分配本地线程,导致oom的发生.具体报错如下:
java.lang.OutOfMemoryError: unable to create new native thread