在我的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 请求的数量将同时访问它(只读,不写入)。我的意思是,会不会有“读锁”或什么?
提前致谢。
答案 0 :(得分:1)
将由方法创建的对象,基元等 在Tomcat完成后清理getPageName()和doAction() 特别要求?
这取决于。如果这些对象/原语由p
直接或间接引用,则它们将保留用于下一个请求(术语可传递的有时用于定义此关系)。如果这些对象不可传递,它们将会消失并由GC收集。
因为servlet将处理多个请求,所以会有 它使用的对象和原语的任何问题(大多数都是 方法的局部,但这些变量中的一些使用了属性 类)LT; ..> ?
方法本地对象(如果未在别处引用)是线程安全的,不会产生任何问题。类属性通常永远不会改变,除非你修改它们(无论如何这都是一个奇怪的想法)它们应该没问题。
如果Servlet同时收到很多请求,那么会有 访问页面HashMap的任何问题
有关详细信息,请参阅this SO post。简短的回答是“如果你没有修改地图,那么很可能就行了,但强烈建议使用专为这种情况设计的ImmutableMap”。