NIO oomParachute的作用
在Server启动的时候,启动NIO连接器,此时判断oomParachute的配置是否大于0,由于默认为 1024 * 1024,
因此在执行NioEndpoint.bind时,
bind() {
...
if (oomParachute>0) reclaimParachute(true);
...
}
protected boolean reclaimParachute(boolean force) {
if ( oomParachuteData != null ) return true;
if ( oomParachute > 0 && ( force || (Runtime.getRuntime().freeMemory() > (oomParachute*2))) )
oomParachuteData = new byte[oomParachute];
return oomParachuteData != null;
}
上面oomParachute > 0 并且 force传入值为true,因此,此处会创建 oomParachuteData,值为1M的byte数组
注意:是每个connector都会创建一个,
[2014-04-16 16:01:18] [WARNING] [System.out] [java.lang.OutOfMemoryError: Java heap space]
[2014-04-16 16:01:19] [WARNING] [System.out] [Exception in thread "RMI TCP Connection(idle)" ]
[2014-04-16 16:01:19] [WARNING] [System.out] [java.lang.OutOfMemoryError: Java heap space]
[2014-04-16 16:01:19] [WARNING] [System.out] [Exception in thread "RMI TCP Connection(idle)" ]
[2014-04-16 16:01:19] [WARNING] [System.out] [java.lang.OutOfMemoryError: Java heap space]
[2014-04-16 16:02:54] [SEVERE] [web-container] []
java.lang.OutOfMemoryError: Java heap space
at com.tongweb.web.webutil.util.buf.ByteChunk.allocate(ByteChunk.java:168)
at com.tongweb.web.webutil.util.buf.ByteChunk.<init>(ByteChunk.java:130)
at com.tongweb.web.oro.http11.filters.BufferedInputFilter.<init>(BufferedInputFilter.java:43
)
at com.tongweb.web.oro.http11.AbstractHttp11Processor.initializeFilters(AbstractHttp11Proces
sor.java:698)
at com.tongweb.web.oro.http11.Http11NioProcessor.<init>(Http11NioProcessor.java:76)
at com.tongweb.web.oro.http11.ThorHttp11NioProcessor.<init>(ThorHttp11NioProcessor.java:14)
at com.tongweb.web.oro.http11.ThorHttp11NioProtocol$ThorHttp11ConnectionHandler.createProces
sor(ThorHttp11NioProtocol.java:27)
at com.tongweb.web.oro.http11.ThorHttp11NioProtocol$ThorHttp11ConnectionHandler.createProces
sor(ThorHttp11NioProtocol.java:17)
at com.tongweb.web.oro.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.j
ava:569)
at com.tongweb.web.webutil.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1653)
at com.tongweb.web.webutil.util.threads.TWThreadPoolExecutor.runWorker(TWThreadPoolExecutor.
java:1165)
at com.tongweb.web.webutil.util.threads.TWThreadPoolExecutor$Worker.run(TWThreadPoolExecutor
.java:622)
at java.lang.Thread.run(Thread.java:662)
[2014-04-16 16:03:05] [SEVERE] [web-container] []
java.lang.OutOfMemoryError: Java heap space
[2014-04-16 16:05:34] [SEVERE] [web-container] []
java.lang.OutOfMemoryError: Java heap space
[2014-04-16 16:05:56] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:10] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:20] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:22] [SEVERE] [web-container] []
java.lang.OutOfMemoryError: Java heap space
[2014-04-16 16:06:26] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:30] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:31] [SEVERE] [web-container] []
java.lang.OutOfMemoryError: Java heap space
[2014-04-16 16:06:36] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:40] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
[2014-04-16 16:06:46] [SEVERE] [web-container] [SEVERE:Memory usage is low, parachute is non existen
t, your system may start failing.]
目前可以模拟相应的场景,在OOM产生时,该内存块会被置为null进行释放,此时请求不能再处理,但应用服务器并没有马上挂掉,后台仍然在不停的打印SEVERE:Memory usage is low, parachute is non existent, your system may start failing.
catch (OutOfMemoryError oom) {
try {
oomParachuteData = null;
releaseCaches();
log.error("", oom);
}catch ( Throwable oomt ) {
try {
System.err.println(oomParachuteMsg);
oomt.printStackTrace();
}catch (Throwable letsHopeWeDontGetHere){
ExceptionUtils.handleThrowable(letsHopeWeDontGetHere);
}
}
}
protected void releaseCaches() {
this.keyCache.clear();
this.nioChannels.clear();
this.processorCache.clear();
if ( handler != null ) handler.recycle();
}
模拟该问题使用NIO通道产生OOM从而使用该参数生效。每个通道在启动时都会根据参数包含这样一个parachute块,默认大小是1M的byte数组,发现OOM产生时,该数组会被设为null,同时清理一些组件的缓存
protected void releaseCaches() {
this.keyCache.clear();
this.nioChannels.clear();
this.processorCache.clear();
if ( handler != null ) handler.recycle();
}
之后该通道的请求不会被响应,其它通道仍能正常工作。
protected boolean reclaimParachute(boolean force) {
if ( oomParachuteData != null ) return true;
if ( oomParachute > 0 && ( force || (Runtime.getRuntime().freeMemory() > (oomParachute*2))) )
oomParachuteData = new byte[oomParachute];
return oomParachuteData != null;
}
分享到:
相关推荐
7. **会话管理**:在Tomcat中,会话管理是重要的功能,它涉及到如何创建、跟踪和销毁用户会话。在NIO实现中,我们需要考虑如何在非阻塞环境中有效地处理会话。 8. **异常处理**:为了保证服务的稳定性,我们需要...
标题中的“Tomcat配置连接数(优化)”指的是在Apache Tomcat服务器中调整与处理并发请求相关的设置,以提升服务器的性能和稳定性。这通常涉及到调整最大连接数、线程池大小、超时时间等核心参数。在高并发场景下,...
目标环境Tomcat + JDK 使用 NIO/BIO 连接器进行 SSL。 在 Tomcat 7 + Java 7 / Tomcat 8 + Java 8 上测试,但写成 Tomcat 4.1 + JDK1.4.2 兼容。注意密码列表按推荐顺序排序。 接下来 Tomcat 将支持 Tomcat 8.0.21 /...
【标题】:“Tomcat 8.5.56 X64 NIO2模式性能优化版+垃圾处理机制.zip”指的是一个特别针对Windows x64平台优化的Tomcat 8.5.56版本,该版本集成了NIO2(非阻塞I/O)模式,并对垃圾收集(Garbage Collection, GC)...
3-5Tomcat响应请求源码与nio处理请求源码实现.mp4
Jetty、Tomcat和Mina都是Java领域中著名的Web服务器和应用服务器,它们在NIO架构上有着相似的设计模式。本文将从这三个框架中提炼出NIO构架网络服务器的经典模式,并逐一解析它们的核心机制。 首先,Jetty的NIO实现...
Tomcat连接器(Connector)是Apache Tomcat服务器的核心组件之一,负责接收客户端的连接请求,创建请求对象,将请求分派给处理请求的Servlet容器,并最终返回响应。在Tomcat的配置和性能优化中,了解如何设置连接数...
此版本在Tomcat7.0.69 的基础上...2、 启用nio 和 线程池配置 (server.xml) 3、修改了context.xml ,添加redis 支持(注意redis 连接密码) 4、在Root目录添加了test.jsp 用于查看多tomcat集群时sessionId是否一直
tomcat默认的 HTTP connector 是阻塞的,并且每个连接对应一个线程。这会造成线程资源的浪费,因为连接本身可能不一定频繁被使用,而是仅仅被用来k
Tomcat支持多种连接器,如APR(Apache Portable Runtime)连接器提供更高效的网络I/O,而NIO(非阻塞I/O)连接器适合高并发场景。 14. **管理工具** Tomcat内置了管理工具,如`manager`应用,允许通过Web界面管理...
总结起来,Java NIO在Tomcat中的应用显著提升了服务器的并发处理能力,减少了线程上下文切换的开销,使得Tomcat能够更高效地服务于高并发的Web应用。对于大型互联网服务和企业级应用来说,选择使用NIO模式的Tomcat是...
HTTP 连接器是 Tomcat 8 中的核心组件之一,负责监听 TCP 端口并处理来自客户端的 HTTP 请求。通过合理的配置,可以显著提升 Tomcat 服务器的性能和稳定性。 #### 三、连接器配置详解 ##### 1. 公共属性 所有连接...
3. **NIO连接器**:除了传统的BIO连接器,Tomcat 7引入了基于非阻塞I/O的NIO连接器,允许处理更多并发连接,提升系统吞吐量。 4. **改进的管理工具**:Tomcat 7提供了一个增强的管理界面,用户可以通过Web管理...
3. NIO(非阻塞I/O)改进:Tomcat 7增强了NIO连接器,提高了服务器处理并发请求的能力,提升了性能。 4. 配置简化:引入了web.xml的注解配置,使得部署描述符的编写更为简洁。 5. 新的安全特性:增加了Secure ...
在Java NIO的实现中,典型的服务器端应用会创建一个或多个Reactor对象,然后利用选择器来监听事件,当事件发生时,反应器会根据事件的类型调用相应的处理器进行处理。这种方式允许使用少量的线程即可有效地处理大量...
8. **NIO和APR连接器**:Tomcat 7.0提供了两种连接器选项,即NIO(非阻塞I/O)和APR(Apache Portable Runtime),用户可以根据需求选择更适合的连接器以优化性能。 9. **错误处理**:Tomcat 7.0改进了错误页面处理...
Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一个开源的Servlet容器,主要用于部署Java Servlet和JavaServer Pages(JSP)应用。Tomcat7和Tomcat8是两个不同版本的Tomcat,它们在功能、性能和安全性...
此外,还可以通过配置缓存、使用NIO连接器等方式优化性能。 通过阅读《深度剖析Tomcat》中文版和源码,可以更深入地理解Tomcat的内部运作机制,这对于开发、调试和优化基于Tomcat的Web应用具有极大的帮助。书中的...
实工作中常常遇到的 I/O 问题,并了解这些新特性如何对响应速率、可伸缩性和可靠性产生直接影 响。 NIO API 是对 1.3 版 I/O 特性的补充而非取代,因此,何时使用新的 API,何时老的 1.3 版 I/O API 更适合特定应用...
5. **性能优化**:Tomcat 5.5可以通过调整线程池大小、设置连接超时、启用压缩、使用NIO连接器等方式进行性能优化。理解这些参数的意义和调整方法是提升服务效率的关键。 6. **日志系统**:Juli日志系统允许自定义...