Tomcat:多线程和资源清理

时间:2012-12-14 05:19:45

标签: java-ee tomcat servlets

在我的Controller servlet(Tomcat)中,我实例化了一个对象并将其分配给该类的属性( p ),如下所示:

public class Controller extends HttpServlet {

String xmlFile = "/tmp/page.xml";
private Pager p = new Pager(xmlFile);

public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException {

.............

我这样做的原因是,有很多cpu密集因此实例化所需的耗时任务只需要完成一次(基本上它会创建应用程序的所有html页面结构)。 / p>

现在,我使用持久对象( p )并访问它的一些方法,如下所示:

public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException {
  .................
  .................
  String name = "xxxxx";
  Structure str = p.doAction(name);
  ..................
}

我的问题是,在Tomcat完成特定请求之后,是否会清除由 getPageName() doAction()等方法创建的对象,基元等?还是会继续使用内存(与 Pager 的持久对象 p 相同)直到下次重启/关闭Tomcat?

另一个重要的问题是,由于servlet将处理多个请求,它使用的对象和原语是否会出现任何问题(大多数都是方法本地的,但是其中一些变量使用了Class的属性) )?像这样:

public Structure doAction(String name) {
   if ( pages.containsKey(name) ) {// Here pages is a property of this class (a HashMap)
      return( new Structure( (Structure)pages.get(name) )); //this creates a "deep copy of this object and sends it back...
   }
   return( new Structure() );
}//

如上面的方法所示,页面HashMap的格式为:

page1 => its Structure Object,
page2 => its Structure Ojbect,
..... => .....................,
pageN => its Structure Object

因此,如果Servlet同时收到多个请求,例如:比如说, N 在特定时间第2页 的请求数量 ,从doAction()方法访问页面 HashMap会有任何问题吗? (因为它是Class的属性,所有这些 N 请求的数量将同时访问它(只读,不写入)。我的意思是,会不会有“读锁”或什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

将由方法创建的对象,基元等   在Tomcat完成后清理getPageName()和doAction()   特别要求?

这取决于。如果这些对象/原语由p直接或间接引用,则它们将保留用于下一个请求(术语可传递的有时用于定义此关系)。如果这些对象不可传递,它们将会消失并由GC收集。

  

因为servlet将处理多个请求,所以会有   它使用的对象和原语的任何问题(大多数都是   方法的局部,但这些变量中的一些使用了属性   类)LT; ..> ?

方法本地对象(如果未在别处引用)是线程安全的,不会产生任何问题。类属性通常永远不会改变,除非你修改它们(无论如何这都是一个奇怪的想法)它们应该没问题。

  

如果Servlet同时收到很多请求,那么会有   访问页面HashMap的任何问题

有关详细信息,请参阅this SO post。简短的回答是“如果你没有修改地图,那么很可能就行了,但强烈建议使用专为这种情况设计的ImmutableMap”。