这篇文章讲述如何定制Liferay 6.1.0 CE(应用服务器采用tomcat-6.0.33),内容包括调整JVM运行参数,移除不需要的portlet,禁用不需要的servlet过滤器, 开启/关闭javascript和css调试功能。
一、调整JVM运行参数
liferay在运行过程中会产生大量对象。当内存不足时,JVM会触发垃圾回收过程。通常JVM在进行垃圾回收时,会暂停应用程序的执行。这对服务器端应用程序的性能造成一定的影响。我们可以通过调整JVM运行参数,如增加堆内存的大小,选择合适的垃圾回收算法等,来降低垃圾回收对应用程序运行的影响 。
我们知道,JVM内存主要分为栈内存和堆内存。栈内存主要存放基本数据类型和引用类型的变量,堆内存主要存放通过new关键字创建的对象实例和数组实例。一个函数在执行过程中通常会定义一些局部变量, JVM会为这些变量在栈内存中分配存储空间。函数执行完毕后,JVM会自动释放这些被占用的内存。而在函数内创建的对象或数组却不会随着函数调用结束而被立即回收掉,直到没有被其他引用变量继续引用并且在某个不确定的时间点触发了垃圾回收过程(可能堆内存空间不足)才会被回收掉。这就是为什么Java相对于C/C++占用内存那么多的原因。
堆内存又分为三部分,分别是新生代, 老年代和永久代。新生代又进一步划分成Eden区和两个对象存活区(From Survivor区和To Survivor区)。通常新创建的对象实例会被分配到新生代的Eden区。当Eden区空间不足时,会触发垃圾回收过程,将Eden区内不再被引用的对象(即垃圾对象)清除掉,并将存活的对象移到To Survivor区;From Survivor区上也会执行类似的垃圾回收过程。然后From Survivor和To Survivor区的角色会被对调,即From Survivor区变成To Survivor区,To Survivor区变成From Survivor区。存活区内的空间不足时,JVM便会将存活区内的对象移到老年代. 如果老年代空间不足,则会将对象进一步移到永久代。由此可见,JVM的垃圾回收过程会经常在新生代进行,老年代次之。JVM很少会对永久代进行垃圾回收处理,该区域除了会存放从老年代过来的对象外,还会存放一些存活期较长的对象,比如Class对象,intern string,某些基本数据类型的包装类型等。
通过对JVM堆内存的使用分析,我们不难得出结论:通过增加堆内存的大小(尤其是新生代的大小)可以减少垃圾回收的次数和频率。通常我们会把堆内存的初始值和最大值设成一样,这样可以避免因需要调整堆内存空间而对应用程序的运行造成影响。但并不是把堆内存设置得越大越好,因为如果把堆内存设置得过大,那么垃圾回收的时间将会变长,进而影响应用程序的性能。一般把堆内存设置到2G(即2048M), 永久代设置成512m, 但也要视乎具体情况而定。如果2G的堆内存还觉得不够,比如垃圾回收过程仍十分频繁,最好先优化一下代码或考虑做应用集群。
此外,选择合适的垃圾回收器和设置合理的垃圾回收参数也是很重要的。默认情况下,JDK使用串行垃圾回收器(serial garbage collector)进行垃圾回收。对于桌面Java应用来说,使用JDK默认的垃圾回收器就足够了,但对于服务器端的java应用来说,应该考虑使用并发标记和清除收集器(Concurrent Mark -Sweep(CMS) collector)。关于CMS的更多内容,请参阅相关文章。
这里提供一个参考的JVM配置:
set "JAVA_OPTS=-server -Dfile.encoding=GB18030 -Djava.net.preferIPv4Stack=true -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -Duser.timezone=GMT+8 -XX:NewSize=640m -XX:MaxNewSize=640m -Xms512m -Xmx512m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:ParallelGCThreads=2 %JAVA_OPTS%"
说明:
最好是使用一些性能监控工具观察应用运行一段时间,然后再选择合适的参数
二、移除不需要的portlet
Liferay内置了很多portlet,有不少是我们不需要的或暂时不需要。由于liferay在启动时会加载全部portlet,这样势必会增加启动时间和占用更多的内存,为了让liferay跑得更快,有必要移除一些portlet,待需要的时候再加回来。
由于历史原因,Liferay内置的portlet都用数字ID标识, 你可以从这个列表大概知道每个数字ID所表示的portlet。移除Liferay内置的portlet方法是,将$LIFERAY_HOME/tomcat-6.0.33/webapps/ROOT/WEB-INF/目录下的portlet-custom.xml, liferay-display.xml, liferay-portlet.xml 三个文件中所声明的portlet注释掉.
注意:不要移除在liferay-portlet.xml中带有<system>true</system>声明的portlet. 某些portlet移除后,可能会导致某些功能无法正常使用。 比如移除了message_boards这个插件(ID: 9), 就无法添加页面,因为缺少某些workflow-handler。
三、禁用不需要的servlet过滤器
在portal.properties中声明了一些java filter,他们都有不同的用途,可以根据需要进行调整。比如我就把如下的java filter禁用了:
# The auto login filter processes the classes in the property # "auto.login.hooks" to provide auto login functionality. com.liferay.portal.servlet.filters.autologin.AutoLoginFilter=false # The CAS filter is used to provide CAS based single sign on. com.liferay.portal.servlet.filters.sso.cas.CASFilter=false # The ETag filter is used to generate ETag headers com.liferay.portal.servlet.filters.etag.ETagFilter=false # If the user can unzip compressed HTTP content, the GZip filter will # zip up the HTTP content before sending it to the user. This will speed up # page rendering for users that are on dial up. com.liferay.portal.servlet.filters.gzip.GZipFilter=false # The header filter is used to set request headers com.liferay.portal.servlet.filters.header.HeaderFilter=false # The I18n filter is used to internationalize URLs. See the property # "locale.prepend.friendly.url.style" for more information. com.liferay.portal.servlet.filters.i18n.I18nFilter=false # The minifier filter is used to minify CSS and JavaScript. com.liferay.portal.servlet.filters.minifier.MinifierFilter=false # The monitoring filter monitors portal request performance. com.liferay.portal.servlet.filters.monitoring.MonitoringFilter=false # The OpenSSO filter is used to provide OpenSSO based single sign on. com.liferay.portal.servlet.filters.sso.opensso.OpenSSOFilter=false # The secure filter is used to protect servlets based on IP and protocol. # See the properties "*.servlet.hosts.allowed" and # "*.servlet.https.required". com.liferay.portal.servlet.filters.secure.SecureFilter=false # The Sharepoint filter allows users to access documents in the Document # Library directly from Microsoft Office using the Sharepoint protocol. com.liferay.portal.sharepoint.SharepointFilter=false # The strip filter will remove blank lines from the outputted content. This # will speed up page rendering for users that are on dial up. com.liferay.portal.servlet.filters.strip.StripFilter=false # The valid host name filter will check the host name from request's # host header. It rejects a request with invalid server name to prevent XSS # attacks. Setting this property to true increases security level while # setting this property to false optimizes server side performance. com.liferay.portal.servlet.filters.validhostname.ValidHostNameFilter=false # The virtual host filter maps hosts to public and private pages. For # example, if the public virtual host is www.helloworld.com and the friendly # URL is /helloworld, then http://www.helloworld.com is mapped to # http://localhost:8080/web/helloworld. com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter=false # Set this property to false to disable XML validation in the portal. XML # validation should only be disabled if validation cannot be performed # because the servers hosting the external DTD or XSD files are not # available. xml.validation.enabled=false
四、开启/关闭javascript和css调试功能
默认情况下,liferay会将 css和js进行压缩, 从而减少传输html文件的大小。 可以在portal-ext.properties进行如下配置,禁止对javascript和css进行压缩,这样我们就能使用firebug对js脚本进行调试:
# # Set this property to true to load the theme's merged CSS files for faster # loading for production. # # Set this property to false for easier debugging for development. You can # also disable fast loading by setting the URL parameter "css_fast_load" to # "0". # # theme.css.fast.load=true theme.css.fast.load=false # # Set this property to true to load the packed version of files listed in # the properties "javascript.barebone.files" or # "javascript.everything.files". # # Set this property to false for easier debugging for development. You can # also disable fast loading by setting the URL parameter "js_fast_load" to # "0". # # javascript.fast.load=true javascript.fast.load=false # # The combo servlet combines multiple JavaScript files into a bundle based # on shared dependencies. This makes loading JavaScript files much faster. # Set this to false if the combination should refresh when one of its # JavaScript files has changed. This property should be set to true during # development for easier debugging but set to false during production for # faster performance. # # combo.check.timestamp=false combo.check.timestamp=true last.modified.check=true
## Portlet CSS Portlet # Set this to true to enable the ability to modify portlet CSS at runtime # via the Look and Feel icon. Disabling it can speed up performance. portlet.css.enabled=false # # Set this to false if the system does not use allow users to modify the # look and feel. # look.and.feel.modifiable=true
参考资料:
http://www.liferay.com/documentation/liferay-portal/6.1/user-guide/-/ai/performance-tuni-5
http://www.liferay.com/community/wiki/-/wiki/Main/Performance