Recently been into working with OSGi modules built on top of Apache Felix using the Eclipse bndtools. This ain’t fun all the time, but it works. However, I am then and now using visualvm for profiling and monitoring issues. With OSGi, at least the VisualVM profiler doesn’t work out of the box but instead causes a lot of fun just like this:


java.lang.NoClassDefFoundError:
org/netbeans/lib/profiler/server/ProfilerRuntimeCPUFullInstr
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.ClassNotFoundException: org.netbeans.lib.profiler.server.ProfilerRuntimeCPUFullInstr not found by org.apache.felix.http.jetty [34]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 2 more

There’s a blog post out there explaining how to set up various profilers to work with OSGi, which also includes VisualVM. A bit of playing makes this work with Eclipse and bndtools, too. Not much to add, except for that it’s important to, in Eclipse / bndtools, put the “right” things in the right place:

  • Download an up-to-date version of visualvm, see here. Unpack this to a meaningful folder.
  • In your bndrun configuration file, add -Xbootclasspath/p:/path/to/your/visualvm_136/profiler/lib/jfluid-server.jar to the -runvm section. This should make your Java VM include the jfluid-server.jar (the part of the profiler that includes the required classes) on startup.
  • In the same file, add org.osgi.framework.bootdelegation=org.netbeans.lib.profiler.* to the -runproperties section to make OSGi find the classes included in this package.

By then, you should be able to connect VisualVM to an OSGi framework running from within Eclipse / bndtools and enable CPU and memory profiling just the way you’re eventually used to.