用VisualVM对Eclipse Virgo服务器进行Profile

在开发上遇到一些性能问题时,我们经常会使用一些Profiler工具对系统进行profile,最常见的是查看内存使用情况或方法调用时间。其中开源工具VisualVM是一个不错的选择。

想了解VisualVM的相关信息可以查看这里:

https://visualvm.java.net/

http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm/

对一般的Java应用程序进行Profile时,我们只需要先启动应用程序,再启动visualvm(其实没有顺序上的依赖),在visualvm里双击出现在左边panel里的应用程序,使visualvm连接上应用程序就可以了。

但在OSGi环境下情况就没这么简单了,例如把Eclipse Virgo服务器运行起来, 然后连上visualvm,然后点击Profiler页里面的Memory按钮,过一会你就会在Virgo的控制台里看见,Profiler Agent在对class进行Redefining。完事以后我们运行一下Virgo里的应用程序,这时你会发现应用程序会被block在那里,然后控制台出现大量的java.lang.NoClassDefFoundError.

这事因为OSGi的特殊的类加载机制下,被visualvm重定义过的class不能找到visualvm的class。

其实我们只需要简单的两步设置就解决上面的问题。

1. 编辑virgo服务器的startup.sh文件

在最后的exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"之前加上

JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:${VISUALVM_HOME}/profiler3/lib/jfluid-server.jar"
export JAVA_OPTS
exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@

2. 编辑configuration下面的java6-server.profile文件

在org.osgi.framework.bootdelegation项目上追加 org.netbeans.lib.profiler,org.netbeans.lib.profiler.*

org.osgi.framework.bootdelegation = \
 org.eclipse.virgo.nano.authentication,\
 com.sun.*,\
 javax.xml.*,\
 org.apache.xerces.jaxp.*,\
 org.w3c.*,\
 org.xml.*,\
 sun.*,\
 org.netbeans.lib.profiler,org.netbeans.lib.profiler.*

然后,启动Virgo,这时再用visualvm连接virgo以后,可以正常的对内存和CPU使用情况进行profile了。

其实上面做的事情简单来说就是,把jfluid-server.jar添加到JVM的Bootstrap类加载器的路径下, 然后告诉OSGi运行环境遇到org.netbeans.lib.profiler,org.netbeans.lib.profiler包里的类就到Bootstrap类加载器里去找。

参考文档:

http://www.baptiste-wicht.com/2010/07/tip-profile-osgi-application-visualvm/

http://codescale.wordpress.com/2009/05/22/basics-about-osgi-classloading/

猜你喜欢

转载自zjumty.iteye.com/blog/1859558
今日推荐