我目前正试图找出在Tomcat 6.0.26上运行的Liferay门户(6.0.6)上的内存泄漏。我们一直在查看OutOfMemoryException发生时生成的内存转储,并且存在非常明显的异常。一到三个ThreadWithAttributes有一个String / char数组,每个内存占用超过1GB。它的内容是以。的形式 “10970_LAYOUT_56_INSTANCE_1GnU = ADddfj6O,536133_LAYOUT_49 = J23g02gH”......一遍又一遍地重复。
据我所知,这是某种portlet-id和它的实例id,但是如何使用这些信息来找出造成这种情况的porlet呢?我基本上对Liferay和webapps都是全新的,尽管它有一个常规Java SE应用程序的正常背景。据我所知,Tomcat正在使用一个线程池,它要求portlet在自己之后进行清理,但是我们有如此大量的portlet,很难猜测负责的那个。那么,有没有办法使用该字符串确定portlet?
提前致谢
答案 0 :(得分:1)
Read this之前在所有portlet中尝试下面提到的行...
String portletId = (String) request.getAttribute(WebKeys.PORTLET_ID);
答案 1 :(得分:1)
请参阅PortletInstanceFactoryImpl.java。这保存了包含所有portlet的hashmap。 “10970_LAYOUT_56_INSTANCE_1GnU = ADddfj6O”是portlet实例id。 liferay的问题是因为这个哈希图没有得到清理。