User Tools

Site Tools


using-jp2-to-instrument-programs-based-on-apache-felix

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
using-jp2-to-instrument-programs-based-on-apache-felix [2011/03/05 17:05]
yann
using-jp2-to-instrument-programs-based-on-apache-felix [2011/03/06 02:46]
weiwu
Line 1: Line 1:
 ====== Background ====== ====== Background ======
  
-JP2 is Java Profiler developed by Binder et al.((W. Binder and J. Hulaas, "Using bytecode instruction counting as portable cpu consumption metric",​ Electronic Notes In Theoretical Computer Science, vol. 153, pp. 57-77, May 2006.)). It can be used to count the numbers of executed bytecode instructions to estimate the CPU consumption of a Java program. The basics of calling JP2 are as follows:+JP2 is an excellent and easy-to-use ​Java Profiler developed by Binder et al.((W. Binder and J. Hulaas, "Using bytecode instruction counting as portable cpu consumption metric",​ Electronic Notes In Theoretical Computer Science, vol. 153, pp. 57-77, May 2006.)). It can be used to count the numbers of executed bytecode instructions to estimate the CPU consumption of a Java program. The basics of calling JP2 are as follows:
  
 <​code>​ <​code>​
Line 17: Line 17:
 ====== Felix and SIP ====== ====== Felix and SIP ======
  
-While the previous code works well and allows instrumenting programs in most situations, we faced some difficulties when instrumenting SIP communications((http://​sip-communicator.org/​)). SIP Communicator is a Java VoIP and instant messaging client using Felix. Felix((http://​felix.apache.org/​site/​index.html)) is the Apache implementation of the OSGi specifications,​ which defines a dynamic service deployment framework. The OSGi specifications((http://​www.osgi.org/​)) defines a framework on which service implementations or *bundlesare plugged and managed by the framework, independently of the underlying running JVM (and its classpath). The framework handles bundle discovery, dependencies,​ requests, and responses. Each bundle communicates only with/​through the framework. ​+While the previous code works well and allows instrumenting programs in most situations, we faced some difficulties when instrumenting SIP communications((http://​sip-communicator.org/​)). SIP Communicator is a Java VoIP and instant messaging client using Felix. Felix((http://​felix.apache.org/​site/​index.html)) is the Apache implementation of the OSGi specifications,​ which defines a dynamic service deployment framework. The OSGi specifications((http://​www.osgi.org/​)) defines a framework on which service implementations or //bundles// are plugged and managed by the framework, independently of the underlying running JVM (and its classpath). The framework handles bundle discovery, dependencies,​ requests, and responses. Each bundle communicates only with/​through the framework. ​
  
-While using JP2 to count the executed bytecode ​number ​of SIP communicator ​in the way above, the bundles of SIP could find the classes of JP2. We tried different methods to make JP2 classes accessible to the bundles and found a working way:+We wanted ​to count the numbers of executed bytecode ​instructions ​of SIP communicator ​using JP2. When instrumenting SIP Communicator,​ we ran into several problems, which we fixed as follows.
  
-  * Exclude Felix classes from instrumenting,​ so they can be executed without know JP2. We need to add <​code>​!className.startsWith("​org/​apache/​felix"​)</​code>​ to method <​code>​byte[] transform(ClassLoader loader, String className, Class<?>​ redefiningClass,​ ProtectionDomain domain, byte[] uninstrumentedBytes)</​code>​ in <​code>​ ch.usi.dag.jp2.agent.SimpleTransformer </​code>​. 
  
-  * Add a bundle which contains all the classes of JP2 into the build.xml of SIP:+ 
 +==== Not Instrumenting Felix ==== 
 + 
 +Exclude Felix classes from being instrumented,​ so Felix can run without having to know about JP2. We added: 
 +<​code>​!className.startsWith("​org/​apache/​felix"​)</​code>​  
 +to method: 
 +<​code>​byte[] transform(ClassLoader loader, String className, Class<?>​ redefiningClass,​ ProtectionDomain domain, byte[] uninstrumentedBytes)</​code>​  
 +in class: 
 +<​code>​ ch.usi.dag.jp2.agent.SimpleTransformer </​code>​ 
 + 
 + 
 + 
 +==== Telling Felix where to find JP2 for the Instrumented Bundles ==== 
 + 
 +Add a bundle which contains all the classes of JP2 into the build.xml of SIP:
 <​code>​ <​code>​
  <target name="​bundle-jp2">​  <target name="​bundle-jp2">​
Line 45: Line 58:
 </​code>​ </​code>​
  
-  * Add JP2 bundle to felix.client.run.properties:​+Add the JP2 bundle to felix.client.run.properties:​
 <​code>​ <​code>​
 felix.auto.start.11= \ felix.auto.start.11= \
  ​reference:​file:​lib/​bundle/​bundle-jp2.jar  ​reference:​file:​lib/​bundle/​bundle-jp2.jar
 </​code>​ </​code>​
 +
 +
 +
 +==== Telling SIP Communicator Bundles about JP2 ====
  
   * Add all the packages of JP2 to the Import-Package attribute of the MANIFEST.MF of all other bundles.   * Add all the packages of JP2 to the Import-Package attribute of the MANIFEST.MF of all other bundles.
  
-  * Set org.osgi.framework.bootdelegation to JP2 classes in the execute script:+  * Set org.osgi.framework.bootdelegation to JP2 classes in the execute script. The original JP2 jars in -XBootclasspath are still needed by -javaagent.
 <​code>​ <​code>​
 javabin=`which java` javabin=`which java`
using-jp2-to-instrument-programs-based-on-apache-felix.txt · Last modified: 2019/10/06 20:37 (external edit)