When you develop applications and you've performance problems, it's really interesting to see what can cause this problems. And it that case, the profilers are the most useful tool. By example, we can use VisualVM, packed by default with the Java Virtual Machine. For more information, you can read this introduction to Java VisualVM. But, when you work with OSGi application, it's not as simple as a normal application. The profiler needs that its class can be found by the profiled classes, but with OSGi, the classloader are restricted by the framework and the classes of the profiler cannot be found. But there is a workaround using boot class path and boot delegation. You need to do 2 things.
-Xbootclasspath:${VISUALVM_HOME}/profiler3/lib/jfluid-server.jarThe classes of the JRE will not be found and you will get that kind of error :
Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/ObjectSo we need to keep the default boot class-path. To get this, just launch this program : ```java public class BootClassPath { public static void main(String[] args) { System.out.println(System.getProperty("sun.boot.class.path")); } } ``` And it will give you the default boot class-path. Then, you just have to append it to the jar of VisualVM with ':'. By example, on my computer, it's the option I need :
-Xbootclasspath:/usr/lib/jvm/java-6-sun-1.6.0.20/lib/visualvm/profiler3/lib/jfluid-server.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/resources.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/rt.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/jsse.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/jce.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/charsets.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/classes
-Dorg.osgi.framework.bootdelegation=org.netbeans.lib.profiler,org.netbeans.lib.profiler.*And normally, it's enough. But some OSGi containers, like Felix, doesn't take the command line properties in consideration in the framework depending on how you launch it. In my case, I embed the Felix Server in my application, so I need to explicitly add this property to the framework. For that, read the documentation of the containers to know how to add properties to the framework. Here we are. Hope this will be useful to someone. Personally, I lost a lot of time trying several configurations before finding this successful one.