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

Tomcat的NIO 连接器中oomParachute的作用

阅读更多
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;
    }
分享到:
评论

相关推荐

    手写 tomcat nio

    7. **会话管理**:在Tomcat中,会话管理是重要的功能,它涉及到如何创建、跟踪和销毁用户会话。在NIO实现中,我们需要考虑如何在非阻塞环境中有效地处理会话。 8. **异常处理**:为了保证服务的稳定性,我们需要...

    tomcat配置 连接数(优化)

    标题中的“Tomcat配置连接数(优化)”指的是在Apache Tomcat服务器中调整与处理并发请求相关的设置,以提升服务器的性能和稳定性。这通常涉及到调整最大连接数、线程池大小、超时时间等核心参数。在高并发场景下,...

    cipher-list-creator.jsp:为 Tomcat NIOBIO 连接器的 server.xml 创建密码列表

    目标环境Tomcat + JDK 使用 NIO/BIO 连接器进行 SSL。 在 Tomcat 7 + Java 7 / Tomcat 8 + Java 8 上测试,但写成 Tomcat 4.1 + JDK1.4.2 兼容。注意密码列表按推荐顺序排序。 接下来 Tomcat 将支持 Tomcat 8.0.21 /...

    tomcat8.5.56_X64_nio2模式性能优化版+垃圾处理机制.zip

    【标题】:“Tomcat 8.5.56 X64 NIO2模式性能优化版+垃圾处理机制.zip”指的是一个特别针对Windows x64平台优化的Tomcat 8.5.56版本,该版本集成了NIO2(非阻塞I/O)模式,并对垃圾收集(Garbage Collection, GC)...

    3-5Tomcat响应请求源码与nio处理请求源码实现.mp4

    3-5Tomcat响应请求源码与nio处理请求源码实现.mp4

    从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

    Jetty、Tomcat和Mina都是Java领域中著名的Web服务器和应用服务器,它们在NIO架构上有着相似的设计模式。本文将从这三个框架中提炼出NIO构架网络服务器的经典模式,并逐一解析它们的核心机制。 首先,Jetty的NIO实现...

    基于tomcat的连接数与线程池详解

    Tomcat连接器(Connector)是Apache Tomcat服务器的核心组件之一,负责接收客户端的连接请求,创建请求对象,将请求分派给处理请求的Servlet容器,并最终返回响应。在Tomcat的配置和性能优化中,了解如何设置连接数...

    tomcat7.0.69 + nio + redis session共享 配置优化版

    此版本在Tomcat7.0.69 的基础上...2、 启用nio 和 线程池配置 (server.xml) 3、修改了context.xml ,添加redis 支持(注意redis 连接密码) 4、在Root目录添加了test.jsp 用于查看多tomcat集群时sessionId是否一直

    jiajianrong#documents#理解tomcat nio1

    tomcat默认的 HTTP connector 是阻塞的,并且每个连接对应一个线程。这会造成线程资源的浪费,因为连接本身可能不一定频繁被使用,而是仅仅被用来k

    tomcat中文帮助文档

    Tomcat支持多种连接器,如APR(Apache Portable Runtime)连接器提供更高效的网络I/O,而NIO(非阻塞I/O)连接器适合高并发场景。 14. **管理工具** Tomcat内置了管理工具,如`manager`应用,允许通过Web界面管理...

    tomcat:Java使用nio模式实现tomcat

    总结起来,Java NIO在Tomcat中的应用显著提升了服务器的并发处理能力,减少了线程上下文切换的开销,使得Tomcat能够更高效地服务于高并发的Web应用。对于大型互联网服务和企业级应用来说,选择使用NIO模式的Tomcat是...

    Apache Tomcat8优化说明

    HTTP 连接器是 Tomcat 8 中的核心组件之一,负责监听 TCP 端口并处理来自客户端的 HTTP 请求。通过合理的配置,可以显著提升 Tomcat 服务器的性能和稳定性。 #### 三、连接器配置详解 ##### 1. 公共属性 所有连接...

    tomcat 7 最新版本 apache-tomcat-7.0.109

    3. **NIO连接器**:除了传统的BIO连接器,Tomcat 7引入了基于非阻塞I/O的NIO连接器,允许处理更多并发连接,提升系统吞吐量。 4. **改进的管理工具**:Tomcat 7提供了一个增强的管理界面,用户可以通过Web管理...

    tomcat 7 和 tomcat 8

    3. NIO(非阻塞I/O)改进:Tomcat 7增强了NIO连接器,提高了服务器处理并发请求的能力,提升了性能。 4. 配置简化:引入了web.xml的注解配置,使得部署描述符的编写更为简洁。 5. 新的安全特性:增加了Secure ...

    基于Java NIO反应器模式设计与实现

    在Java NIO的实现中,典型的服务器端应用会创建一个或多个Reactor对象,然后利用选择器来监听事件,当事件发生时,反应器会根据事件的类型调用相应的处理器进行处理。这种方式允许使用少量的线程即可有效地处理大量...

    Tomcat7.0 tomcat最新版本

    8. **NIO和APR连接器**:Tomcat 7.0提供了两种连接器选项,即NIO(非阻塞I/O)和APR(Apache Portable Runtime),用户可以根据需求选择更适合的连接器以优化性能。 9. **错误处理**:Tomcat 7.0改进了错误页面处理...

    tomcat8和tomcat7

    Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一个开源的Servlet容器,主要用于部署Java Servlet和JavaServer Pages(JSP)应用。Tomcat7和Tomcat8是两个不同版本的Tomcat,它们在功能、性能和安全性...

    how tomcat work

    此外,还可以通过配置缓存、使用NIO连接器等方式优化性能。 通过阅读《深度剖析Tomcat》中文版和源码,可以更深入地理解Tomcat的内部运作机制,这对于开发、调试和优化基于Tomcat的Web应用具有极大的帮助。书中的...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    实工作中常常遇到的 I/O 问题,并了解这些新特性如何对响应速率、可伸缩性和可靠性产生直接影 响。 NIO API 是对 1.3 版 I/O 特性的补充而非取代,因此,何时使用新的 API,何时老的 1.3 版 I/O API 更适合特定应用...

    Tomcat5.5中文技术手册(真正的)

    5. **性能优化**:Tomcat 5.5可以通过调整线程池大小、设置连接超时、启用压缩、使用NIO连接器等方式进行性能优化。理解这些参数的意义和调整方法是提升服务效率的关键。 6. **日志系统**:Juli日志系统允许自定义...

Global site tag (gtag.js) - Google Analytics