< Context path="/Tomcat7demo" aliases="/static ..." /> < Context path="/Tomcat7demo" aliases="/static ..."/> li3huo.com – Tomcat 7 有价值的新特性

Tomcat 7 有价值的新特性

Posted on Wed 07 September 2011 in 我记

今天到tomcat主站上查资料,发现Tomcat7都出到7.0.21且已经stable一段时间了,不禁搜索了一下相关信息,整理中发现了几个很有价值的新特性。

内存泄露的侦测和防止

线上应用有长时间不重启会出现运行异常的情况,7的这个特性可能会改善这个问题,详细说明如下:

开发者在部署他们写的程序到生产环境上时,经常会遇到Pemgen错误:OutOfMemoryError。这是由于内存泄露而引起的。通常开发者是通过增大permgen内存的大小去解决或者就是重新启动Tomcat。 Tomcat 7包含了一个新的特性,它通过把不能垃圾回收的引用对象移走的方法,能解决一些Permgen内存泄露的问题。

如下情况下会触发内存泄露: JDBC驱动的注册 一些日志框架 在ThreadLocals中保存了对象但没有删除它们 启动了线程但没停止

在war文件外使用别名去存储静态内容

Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等。通常都把它们打包放在war文件中,这将增加WAR文件的大小并且导致很多重复的加载静态资源。

7允许使用新的aliases属性,指出静态文件资源的位置,可以通过使用Classloader.getResourceAsStream('/static/...')或者在链接中嵌入的方法让Tomcat去解析绝对路径,下面是一个在context.xml中配置的例子:

< ?xml version="1.0" encoding="UTF-8"? > < Context path="/Tomcat7demo" aliases="/static=/Users/liyan/Movies/" > < /Context >

假设/Users/liyan/Movies/这个文件夹存放有一张图片bg.png,如果war文件以Tomcat7demo的名字部署,那么可以通过以下三个方式去访问这张图片

1.直接访问 http://localhost:8080/Tomcat7demo/static/bg.png

2.在HTML链接中访问:< img src="/Tomcat7demo/static/bg.png" / >

3.通过JAVA代码访问: ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream("/static/bg.png");

使用aliases的好处是可以代替Apache的httpd.conf的设置,并且可以在servlet容器范围内访问,并且不需要Apache。

Servlet 3.0的新特性

引入了对异步HTTP请求和响应的标准化支持; 配置过滤器、监听器和Servlet时使用注解,进一步减少了开发者所要编写的XML数量; 大量使用了泛型,改善了会话追踪,引入了新的文件上传功能;

参考信息

  • Top 7 Features in Tomcat 7: The New and the Improved http://www.developer.com/java/web/article.php/3904871/article.htm

  • Apache Tomcat - Migration Guide http://tomcat.apache.org/migration.html

  • Apache Tomcat - Which Version Do I Want? http://tomcat.apache.org/whichversion.html