前几天, 写完一个幕后扫描程序, 由于业务存在多对多的站点关系, 为了程序逻辑简单化, 牺牲掉一些硬件资源 来动态创建N个线程池(是池子哦).
结果悲剧发现: 公司服务器资源耗尽, 其它应用都跑不了, 系统宕机, 运维同事用不了命令.
幸好, 幸好, 有经验丰富的压力测试的同事帮顶住了, 结果2分钟解决BUG, 哈哈!
题外话, 技术组人员配置一定要有经验丰富的~
1.程序日志, 没有任何异常, 因为都是些普通业务, JMX 重型编程 没有在本程序中使用.
2.系统日志:
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
automount[4228]: expire_proc: expire thread create for /misc failed
automount[4228]: expire_proc: expire thread create for /net failed
.......................
fork: Resource temporarily unavailable
一看 fork. 我就直接想起 fork/join 并发编程的模型, 也不知道两者是不是有直接关系.
同事, 提醒线程太多 撑爆了系统!
我和同事都认为 Java GC 会
直接回收ExecutorService 对象啊! 事实相反, thread 一多也是很耗资源!
Java Doc :
/*
* An unused ExecutorService should be shut down to allow reclamation of its resources....
* @since 1.5
* @author Doug Lea
*/
程序结构,修改BUG后:
public class ChecksumsCalculatorServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
AsynService calculator = new AsyncServiceImpl(siteId, nodeName, someInfos,
requestCallbackImpl);
Thread t = new Thread(calculator);
t.start();
}
}
public class AsyncChecksumsServiceImpl implements AsyncChecksumsService {
private ExecutorService threadPool; // 悲剧就在这.
//init in construct.
public void run() {
try{
// threadPool do something
// get Future
}catch(...){
}finally{
/**let GC do its work*/
threadPool.shutdown();
threadPool = null;
}
}
}
总结:
大资源由原来的三个类型 Stream , Connection, GUI 图形对象,
现在增加一个类型interface ExecutorService,
此四类都要用完都要关闭资源!
悲剧源自数据量巨大, GC 不能回收用完的池子, 实战大数据并发编程才开始不久!
经验不足, 只能救助于书了!
并发编程推荐, 读英文好!
Addison.Wesley.Java.Concurrency.in.Practice.May.2006.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有应聘"Java工程师/架构师", 请发邮件至: linzuxiong1988@gmail.com, 并取得联系.
工程师招聘,岗位见:
http://job.youzan.com 请联系我: linzuxiong1988@gmail.com
分享到:
相关推荐
《Java并发编程实践》是Java并发编程领域的一本经典著作,由Addison-Wesley于2006年出版。这本书深入浅出地探讨了Java平台上的多线程和并发编程,为开发者提供了实用的指导和最佳实践。下面将详细阐述其中的知识点。...
Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、枚举和注解的详细说明。这份"jdk-17.0.2_doc-all"文档集全面覆盖了Java 17.0.2版本的特性,是理解、学习和使用Java编程...
这个"Java-SE-class-library-.zip"压缩包包含了详细的Java SE类库查询手册,旨在为Java开发者提供详尽的参考信息。下面将详细介绍Java SE类库中的主要组件、功能以及它们在实际开发中的应用。 1. **Java基础类库**...
5. **线程池**:Java的`ExecutorService`和`ThreadPoolExecutor`允许开发者创建和管理线程池,提高线程复用,避免频繁创建和销毁线程的开销。 6. **Future和Callable**:`Future`接口代表异步计算的结果,而`...
2. **线程池支持**:可能扩展了`java.util.concurrent.ExecutorService`接口,使得线程池中的线程也可以根据策略绑定到特定的核心。 3. **平台兼容性**:考虑到跨平台兼容性,该项目可能实现了对Linux、Windows、...
Java API(Application Programming Interface)是Java开发平台的核心组成部分,它为开发者提供了丰富的类库和接口,使得编写Java程序变得更加高效和便捷。这个压缩包“JAVA 编程 API基础 JAVA开发平台,JAVA编程...
本资源“java-utility-programming-skills-.zip”包含了一份关于Java实用编程技巧的.chm帮助文档,这对于深化Java编程理解以及提升技能水平非常有帮助。以下是基于这个主题的详细知识点讲解: 1. **异常处理**:...
8. **Java Native Interface (JNI)**:JNI允许Java代码调用C/C++库,实现了Java与本地代码的交互,这对于提升性能或使用特定平台的功能很有帮助。 9. **Java安全性**:Java的安全模型包括类加载器、权限模型和沙箱...
在Java多线程编程中,`ExecutorService`是线程池的一个重要接口,它提供了管理和控制线程执行的能力。当我们创建一个`ExecutorService`实例并提交任务时,我们可以通过调用`shutdown()`方法来关闭线程池。然而,标题...
Java的Thread类和ExecutorService接口可以实现这一功能。 7. **结果展示**:最后,计算出的相似度可能会以某种形式输出,比如打印到控制台或写入文件。 这个项目对于信息检索、文本挖掘或数据分析等领域有实际应用...
此功能增强了唯一的Java 8内置实现 ,该实现主要支持计算任务。 此外,该库还可以帮助解决许多异步编程难题,例如处理超时,重试/轮询功能,协调多个并发计算的结果等。 从版本该库以多发行版JAR的形式提供,并且...
5. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了线程管理和并发控制的相关类,如`Runnable`接口和`ExecutorService`。 6. **异常处理**:`java.lang.Throwable`及其子类如`Exception`、`Error`...
让我们深入探讨这个"java-Simulation-strategy-game-.rar"压缩包文件所涵盖的知识点。 1. **Java编程**:Java是一种广泛使用的面向对象的编程语言,它具有跨平台性、安全性以及丰富的类库。在这个项目中,Java被...
《Wrox.Java.Programming.24-Hour.Trainer.2011》是一部关于Java编程的详尽教程,旨在帮助初学者和有一定基础的开发者在24小时内掌握Java编程的核心概念和技术。这本书由Wrox出版社出版,是Java学习者的宝贵资源。 ...
例如,使用Java的ExecutorService或者并发工具类,可以将图像分割成多个部分,然后在不同的线程上并行处理。 在实际项目中,开发者需要根据需求选择合适的图像处理库,如Java Advanced Imaging (JAI)、JavaFX的...
Java面试是每位Java开发者在求职过程中必须面对的重要环节。这份"java面试java_interview_guide-master.zip"资源显然是为准备Java面试而设计的,包含了丰富的Java技术知识点和面试常见问题。以下将从Java语言基础、...
书中介绍了如何使用`ExecutorService`等接口和类。 - **并发集合**:Java提供了多种并发集合类,如`ConcurrentHashMap`等,用于解决多线程环境下数据结构的安全访问问题。 - **CompletableFuture**:这是一个强大的...
Java的线程和并发API,如ExecutorService、Thread和synchronized关键字,可以帮助管理这些并发任务。 8. **异常处理**:网络编程中常遇到网络中断、超时等问题,因此异常处理至关重要。学习如何正确捕获和处理...
- **线程池**:ExecutorService、ThreadPoolExecutor的使用,线程池的参数配置和优化。 3. **Java集合框架** - **List、Set、Queue**:它们的区别,常用实现类如ArrayList、LinkedList、HashSet、HashMap的内部...
9. **并发改进**:Java 8对`Fork/Join`框架和`ExecutorService`进行了优化,提高了多线程编程的效率和便利性。 10. **并发集合的增强**:包括`ConcurrentHashMap`、`ConcurrentSkipListMap`等并发集合类的改进,...