1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
   2 <html>
   3 <head>
   4 <!--
   5 
   6   Copyright 2003 Wily Technology, Inc.
   7 
   8 -->
   9 </head>
  10 
  11 <body bgcolor="white">
  12 
  13 Provides services that allow Java programming language agents to instrument programs running on the JVM. 
  14 The mechanism for instrumentation is modification of the byte-codes of methods.
  15 
  16 <h2>Package Specification</h2>
  17 
  18 <P> 
  19 An agent is deployed as a JAR file. An attribute in the JAR file manifest specifies the
  20 agent class which will be loaded to start the agent. For implementations that support a command-line 
  21 interface, an agent is started by specifying an option on the command-line.  
  22 Implementations may also support a mechanism to start agents some time after the VM has
  23 started. For example, an implementation may provide a mechanism that allows a tool to 
  24 <i>attach</i> to a running application, and initiate the loading of the tool's agent into
  25 the running application. The details as to how the load is initiated, is implementation
  26 dependent.
  27 
  28 <h3>Command-Line Interface</h3>
  29 
  30 <P> 
  31 On implementations with a command-line interface, an agent is started by
  32 adding this option to the command-line:
  33 <blockquote>
  34 <code><b>-javaagent:</b></code><i>jarpath[</i><code><b>=</b></code><i>options]</i>
  35 </blockquote>
  36 <i>jarpath</i> is the path to the agent JAR file.
  37 <i>options</i> is the agent options.
  38 This switch may be used multiple times on the same command-line, 
  39 thus creating multiple agents.
  40 More than one agent may use the same <i>jarpath</i>.
  41 An agent JAR file must conform to the JAR file specification.
  42 
  43 <P>
  44 The manifest of the agent JAR file must contain the attribute <code>Premain-Class</code>. The
  45 value of this attribute is the name of the <i>agent class</i>. The agent class must implement a 
  46 public static <code>premain</code> method similar in principle to the <code>main</code> application 
  47 entry point.  After the Java Virtual Machine (JVM) has initialized, each <code>premain</code> method 
  48 will be called in the order the agents were specified, then the real application
  49 <code>main</code> method will be called. 
  50 Each <code>premain</code> method must return in order for the startup sequence to proceed.
  51 
  52 <P>
  53 The <code>premain</code> method has one of two possible signatures. The JVM first attempts to
  54 invoke the following method on the agent class:
  55 
  56 <blockquote>
  57 <code>public static void
  58 premain(String agentArgs, Instrumentation inst);
  59 </code>
  60 </blockquote>
  61 
  62 <P>
  63 If the agent class does not implement this method then the JVM will attempt to invoke:
  64 
  65 <blockquote>
  66 <code>public static void
  67 premain(String agentArgs);
  68 </code>
  69 </blockquote>
  70 
  71 <P>
  72 The agent class may also have an <code>agentmain</code> method for use when the agent is started 
  73 after VM startup. When the agent is started using a command-line option, the <code>agentmain</code>
  74 method is not invoked.
  75 
  76 
  77 <P>
  78 The agent class will be loaded by the system class loader
  79 (see {@link java.lang.ClassLoader#getSystemClassLoader ClassLoader.getSystemClassLoader}). This is
  80 the class loader which typically loads the class containing the application <code>main</code> method.
  81 The <code>premain</code> methods will be run under the same security and classloader 
  82 rules as the application <code>main</code> method.
  83 There are no modeling restrictions on what the agent <code>premain</code> method may do.
  84 Anything application <code>main</code> can do, including creating threads, is legal from <code>premain</code>.
  85 
  86 <P>
  87 Each agent is passed its agent options via the <code>agentArgs</code> parameter.
  88 The agent options are passed as a single string,
  89 any additional parsing should be performed by the agent itself.
  90 
  91 <P>
  92 If the agent cannot be resolved 
  93 (for example, because the agent class cannot be loaded,
  94 or because the agent class does not have an appropriate <code>premain</code> method), the JVM will abort.
  95 If a <code>premain</code> method throws an uncaught exception, the JVM will abort.
  96 
  97 
  98 
  99 <h3>Starting Agents After VM Startup</h3>
 100 
 101 <p>
 102 An implementation may provide a mechanism to start agents sometime after the
 103 the VM has started. The details as to how this is initiated are implementation 
 104 specific but typically the application has already started and its <code>
 105 main</code> method has already been invoked. In cases where an implementation
 106 supports the starting of agents after the VM has started the following applies:
 107 
 108 <ol>
 109   <li><p>The manifest of the agent JAR must contain the attribute <code>Agent-Class</code>. 
 110       The value of this attribute is the name of the <i>agent class</i>. </p></li> 
 111       
 112   <li><p>The agent class must implement a public static <code>agentmain</code> method. </p></li>
 113 
 114   <li><p>The system class loader (
 115       {@link java.lang.ClassLoader#getSystemClassLoader ClassLoader.getSystemClassLoader}) must
 116       support a mechanism to add an agent JAR file to the system class path. <p></li>
 117 </ol>  
 118 
 119 <P>
 120 The agent JAR is appended to the system class path. This is the class loader that typically loads 
 121 the class containing the application <code>main</code> method. The agent class is loaded and the
 122 JVM attempts to invoke the <code>agentmain</code> method. The JVM first attempts to invoke 
 123 the following method on the agent class:
 124 
 125 <blockquote>
 126 <code>public static void
 127 agentmain(String agentArgs, Instrumentation inst);
 128 </code>
 129 </blockquote>
 130 
 131 <P>
 132 If the agent class does not implement this method then the JVM will attempt to invoke:
 133 
 134 <blockquote>
 135 <code>public static void
 136 agentmain(String agentArgs);
 137 </code>
 138 </blockquote>
 139 
 140 <P>
 141 The agent class may also have an <code>premain</code> method for use when the agent is started
 142 using a command-line option. When the agent is started after VM startup the <code>premain</code>
 143 method is not invoked.
 144 
 145 
 146 <P>
 147 The agent is passed its agent options via the <code>agentArgs</code> parameter.
 148 The agent options are passed as a single string,
 149 any additional parsing should be performed by the agent itself. 
 150 
 151 <P>
 152 The <code>agentmain</code> method should do any necessary initialization 
 153 required to start the agent. When startup is complete the method should 
 154 return. If the agent cannot be started
 155 (for example, because the agent class cannot be loaded,
 156 or because the agent class does not have a conformant <code>agentmain</code> method), the JVM will
 157 not abort. If the <code>agentmain</code> method throws an uncaught exception it will be ignored.
 158 
 159 
 160 
 161 <h3>Manifest Attributes</h3>
 162 The following manifest attributes are defined for an agent JAR file:
 163 <blockquote>
 164 <dl>
 165 <dt><code>Premain-Class</code></dt>
 166 <dd>
 167                         When an agent is specified at JVM launch time this attribute
 168                         specifies the agent class.
 169                         That is, the class containing the <code>premain</code> method.
 170                         When an agent is specified at JVM launch time this attribute
 171                         is required. If the attribute is not present the JVM will abort.
 172                         Note: this is a class name, not a file name or path.                                                    
 173 </dd>
 174 
 175 <dt><code>Agent-Class</code></dt>
 176 <dd>
 177                         If an implementation supports a mechanism to start agents 
 178                         sometime after the VM has started then this attribute specifies
 179                         the agent class.
 180                         That is, the class containing the <code>agentmain</code> method.
 181                         This attribute is required, if it is not present the agent
 182                         will not be started.
 183                         Note: this is a class name, not a file name or path.
 184 </dd>                     
 185 
 186 <dt><code>Boot-Class-Path</code></dt>
 187 <dd>
 188                         A list of paths to be searched by the bootstrap class
 189                         loader. Paths represent directories or libraries
 190                         (commonly referred to as JAR or zip libraries on
 191                         many platforms).                        
 192                         These paths are searched by the
 193                         bootstrap class loader after the platform specific
 194                         mechanisms of locating a class have failed.
 195                         Paths are searched in the order listed.
 196                         Paths in the list are separated by one or more spaces.
 197                         A path takes the syntax of the path component of a
 198                         hierarchical URI. The path is
 199                         absolute if it begins with a slash character ('/'),
 200                         otherwise it is relative. A relative path is resolved
 201                         against the absolute path of the agent JAR file.
 202                         Malformed and non-existent paths are ignored.   
 203                         When an agent is started sometime after the VM has
 204                         started then paths that do not represent a JAR file
 205                         are ignored.
 206                         This attribute is optional.
 207 </dd>
 208 <dt><code>Can-Redefine-Classes</code></dt>
 209 <dd>
 210                         Boolean (<code>true</code> or <code>false</code>, case irrelevant).
 211                         Is the ability to redefine classes
 212                         needed by this agent.
 213                         Values other than <code>true</code> are considered <code>false</code>.
 214                         This attribute is optional, the default is <code>false</code>.
 215 </dd>
 216 <dt><code>Can-Retransform-Classes</code></dt>
 217 <dd>
 218                         Boolean (<code>true</code> or <code>false</code>, case irrelevant).
 219                         Is the ability to retransform classes
 220                         needed by this agent.
 221                         Values other than <code>true</code> are considered <code>false</code>.
 222                         This attribute is optional, the default is <code>false</code>.
 223 </dd>
 224 <dt><code>Can-Set-Native-Method-Prefix</code></dt>
 225 <dd>
 226                         Boolean (<code>true</code> or <code>false</code>, case irrelevant).
 227                         Is the ability to set native method prefix needed by this agent.
 228                         Values other than <code>true</code> are considered <code>false</code>.
 229                         This attribute is optional, the default is <code>false</code>.
 230 </dd>
 231 </dl>
 232 </blockquote>
 233 
 234 <p> 
 235 An agent JAR file may have both the <code>Premain-Class</code> and <code>Agent-Class</code>
 236 attributes present in the manifest. When the agent is started on the command-line using
 237 the <code>-javaagent</code> option then the <code>Premain-Class</code> attribute
 238 specifies the name of the agent class and the <code>Agent-Class</code> attribute is
 239 ignored. Similarly, if the agent is started sometime after the VM has started, then
 240 the <code>Agent-Class</code> attribute specifies the name of the agent class
 241 (the value of <code>Premain-Class</code> attribute is ignored).
 242 
 243 <h2>Related Documentation</h2>
 244 
 245 For tool documentation, please see:
 246 <ul>
 247   <li><a href="{@docRoot}/../technotes/tools/index.html">JDK Tools and Utilities</a>
 248 </ul>
 249 
 250 @since JDK1.5
 251 @revised 1.6
 252 
 253 </body>
 254 </html>