我有多个使用相同框架的portlet,并且我以前在每个portlet上部署这些依赖项,这会导致PermGen问题,尤其是当我确实为portlet部署/取消部署时。
有时即使没有部署/取消部署,此问题也会突然出现。
我正在考虑将这些依赖项移到tomcat级别,但问题是它将与使用它的liferay版本冲突。
这是我的JVM参数:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -Duser.timezone=GMT -Djruby.min.runtimes=1 -Djruby.max.runtimes=3 -Djruby.runtime=1 -XX:NewSize=700m -XX:MaxNewSize=700m -Xms2048m -Xms2048m -XX:MaxPermSize=512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=10 -XX:ParallelGCThreads=8"
还有其他推荐的解决方案吗?
Liferay 6.1在其根portlet中使用Spring 3.0.7。
如果在portal-dependency-jars
的liferay-plugin-package.properties
中将它们配置为依赖项,则这些将被复制到您的portlet中,因此很像自己包含它们。当然,您包含在Portlet中的任何库都会增加对PermGen空间的使用。
在Tomcat中放置不同的Spring和Hibernate库可能会导致类加载问题。由于Hibernate 4.x在3.1之前的Spring上并不能很好地发挥作用,因此您会遇到一些问题。您可以尝试在根Portlet中升级Spring。我个人没有做过。
我会增加PermGen空间,并将库放入您的portlet中。另外,在战争中,如果您使用的是Tomcat,则可能需要将其放在META-INF/context.xml
中。
<Context>
<Loader loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader" />
</Context>
这可能会解决一些类加载问题。在某些情况下,它没有什么区别,但是如果您使用单独的库,则可能很重要。