0

在我的 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)并访问它的一些方法,如下所示:

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 将处理多个请求,它使用的对象和原语是否会有任何问题(它们中的大多数是方法的本地变量,但其中一些变量使用类的属性)?像这样 :

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 同时接收到许多请求,例如:比如说,在特定时间t有N个对page2的请求,那么从 doAction() 方法访问页面HashMap会不会有任何问题?(因为它是类的一个属性,所有这N个请求将同时访问它(只读,不写入)。我的意思是,会有“读锁”之类的吗?

提前致谢。

4

1 回答 1

1

在 Tomcat 完成特定请求后,由 getPageName() 和 doAction() 等方法创建的对象、原语等是否会被清理?

这取决于。如果这些对象/原语被 直接或间接引用p,那么它们将被保留用于下一个请求(有时使用术语传递可达来定义这种关系)。如果这些对象不可传递到达,它们将消失并被 GC 收集。

由于 servlet 将处理多个请求,它使用的对象和原语是否会有任何问题(它们中的大多数是方法的本地变量,但其中一些变量使用类的属性)<..> ?

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

如果Servlet同时收到很多请求,访问页面HashMap会不会有问题

有关更多信息,请参阅此 SO 帖子简短的回答是“如果您不修改地图,很可能会没问题,但强烈建议使用专为这种情况设计的ImmutableMap ”。

于 2012-12-14T21:53:55.173 回答