J. Duke | 319a3b9 | 2007-12-01 00:00:00 +0000 | [diff] [blame^] | 1 | <html> |
| 2 | <head> <title>JVM TI Demonstration Code</title> </head> |
| 3 | |
| 4 | <h1>JVM TI Demonstration Code</h1> |
| 5 | |
| 6 | <p> |
| 7 | The |
| 8 | Java<sup><font size=-2>TM</font></sup> Virtual Machine Tools Interface (JVM TI) |
| 9 | is a native tool interface provided in JDK 5.0 and newer. |
| 10 | Native libraries that use JVM TI and are loaded into the |
| 11 | Java Virtual Machine |
| 12 | via the -agentlib, -agentpath, or -Xrun (deprecated) interfaces, are |
| 13 | called Agents. |
| 14 | <p> |
| 15 | <A HREF="http://java.sun.com/j2se/latest/docs/guide/jvmti">JVM TI</A> |
| 16 | was designed to work with the |
| 17 | Java Native Interface |
| 18 | (<A HREF="http://java.sun.com/j2se/latest/docs/guide/jni">JNI</A>), |
| 19 | and eventually displace the |
| 20 | Java Virtual Machine Debugging Interface |
| 21 | (<A HREF="http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jvmdi-spec.html">JVMDI</A>) |
| 22 | and the |
| 23 | Java Virtual Machine Profiling Interface |
| 24 | (<A HREF="http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/index.html">JVMPI</A>). |
| 25 | |
| 26 | <p> |
| 27 | We have created a set of demonstration agents that should |
| 28 | help show many of the features and abilities of the |
| 29 | interface. This list of demonstration agents will change over time. |
| 30 | They are provided as educational tools and as starting |
| 31 | points for Java tool development. |
| 32 | |
| 33 | <p> |
| 34 | These agents are built with every JDK build and some basic testing is performed |
| 35 | on a regular basis, but no extensive testbases currently |
| 36 | exist for these agents. |
| 37 | Every JDK installation should include all the pre-built binaries and sources for |
| 38 | all these agents, just look in the demo/jvmti directory of your JDK. |
| 39 | |
| 40 | |
| 41 | <h2>Using or Running These Agents</h2> |
| 42 | |
| 43 | <p> |
| 44 | Using these agents will require the VM to locate the shared library file |
| 45 | before any actual Java code is run. |
| 46 | The JDK installation should contain all the agent libraries in |
| 47 | the ${JAVA_HOME}/demo/jvmti/<i>agent-name</i>/lib directories. |
| 48 | The Solaris 64bit version would be contained in the sparcv9 or amd64 |
| 49 | subdirectory. |
| 50 | If 'java' complains that it can't find the library, |
| 51 | you may need to add the directory containing the library into the |
| 52 | LD_LIBRARY_PATH environment variable (Unix), or the PATH environment |
| 53 | variable (Windows). |
| 54 | This is system and platform specific. |
| 55 | If you are using 64bit Solaris (e.g. 'java -d64'), |
| 56 | you should use LD_LIBRARY_PATH64. |
| 57 | Some agents such as hprof (heap/cpu profiler) and jdwp (debugger backend) |
| 58 | are located inside the primary JDK directories and will always be found |
| 59 | in those locations. |
| 60 | |
| 61 | <p> |
| 62 | The agents that instrument classfiles |
| 63 | (i.e. BCI, usually through the java_crw_demo library) |
| 64 | such as hprof, heapTracker, mtrace, and minst, |
| 65 | also need to have the Java classes they use available in the bootclasspath. |
| 66 | The one used by hprof is already in the bootclasspath, and the |
| 67 | other agents will make attempts at automatically adding their jar file |
| 68 | (e.g. heapTracker.jar, mtrace.jar, or minst.jar) to the bootclasspath |
| 69 | with AddToBootstrapClassLoaderSearch from JVM TI at startup |
| 70 | (see the agent_util code). |
| 71 | This is done by locating this jar file at |
| 72 | ${JAVA_HOME}/demo/jvmti/<i>agent-name</i> |
| 73 | where JAVA_HOME is obtained by calling GetSystemProperty from JVM TI |
| 74 | with "java.home". |
| 75 | We recognize that this is not ideal, but felt that as just demonstration |
| 76 | code it was acceptable. |
| 77 | Ideally the agent could find out the actual directory it came from and |
| 78 | locate the jar file relative to that location. |
| 79 | Our demonstration agents currently do not do this. |
| 80 | |
| 81 | <p> |
| 82 | If you choose to modify or change these agents, the above information |
| 83 | is important in making everything is found. |
| 84 | It is recommended that you change the name of the agent when you |
| 85 | modify it to avoid conflicts with the existing demo agents. |
| 86 | Or better yet, go to http://jdk.dev.java.net and submit your |
| 87 | changes to the agent as an RFE to the JDK. |
| 88 | |
| 89 | |
| 90 | <h2> Demonstration Agents Available </h2> |
| 91 | |
| 92 | <ul> |
| 93 | |
| 94 | <li> |
| 95 | <A HREF="versionCheck">versionCheck</A> |
| 96 | <br> |
| 97 | This is a extremely small agent that does nothing but check the |
| 98 | version string supplied in the jvmti.h file, with the version |
| 99 | number supplied by the VM at runtime. |
| 100 | </li> |
| 101 | |
| 102 | <li> |
| 103 | <A HREF="mtrace">mtrace</A> |
| 104 | <br> |
| 105 | This is a small agent that does method tracing. |
| 106 | It uses Bytecode Instrumentation (BCI) via the java_crw_demo library. |
| 107 | </li> |
| 108 | |
| 109 | <li> |
| 110 | <A HREF="minst">minst</A> |
| 111 | <br> |
| 112 | This is an even smaller agent that does just method entry tracing. |
| 113 | It also uses Bytecode Instrumentation (BCI) via the java_crw_demo library, |
| 114 | but the instrumentation code is pure Java (no Java native methods used). |
| 115 | NOTE: Be sure to check out java.lang.instrument for a way to avoid |
| 116 | native code agents completely. |
| 117 | </li> |
| 118 | |
| 119 | <li> |
| 120 | <A HREF="gctest">gctest</A> |
| 121 | <br> |
| 122 | This is a small agent that does garbage collection counting. |
| 123 | </li> |
| 124 | |
| 125 | <li> |
| 126 | <A HREF="heapViewer">heapViewer</A> |
| 127 | <br> |
| 128 | This is a small agent that does some basic heap inspections. |
| 129 | </li> |
| 130 | |
| 131 | <li> |
| 132 | <A HREF="heapTracker">heapTracker</A> |
| 133 | <br> |
| 134 | This is a small agent that does BCI to capture object creation |
| 135 | and track them. |
| 136 | It uses Bytecode Instrumentation (BCI) via the java_crw_demo library. |
| 137 | </li> |
| 138 | |
| 139 | <li> |
| 140 | <A HREF="waiters">waiters</A> |
| 141 | <br> |
| 142 | This is a small agent that gets information about threads |
| 143 | waiting on monitors. |
| 144 | </li> |
| 145 | |
| 146 | <li> |
| 147 | <A HREF="hprof">hprof</A> |
| 148 | <br> |
| 149 | This is a large agent that does heap and cpu profiling. |
| 150 | This demo agent is actually built into the |
| 151 | |
| 152 | Java Runtime Environment (JRE). |
| 153 | It uses Bytecode Instrumentation (BCI) via the java_crw_demo library. |
| 154 | <br> |
| 155 | <b>Note:</b> hprof is NOT a small or simple agent, the other smaller demos |
| 156 | should be looked at first. |
| 157 | </li> |
| 158 | |
| 159 | </ul> |
| 160 | |
| 161 | |
| 162 | |
| 163 | <h2>Agent Support</h2> |
| 164 | |
| 165 | <ul> |
| 166 | |
| 167 | <li> |
| 168 | <A HREF="java_crw_demo">java_crw_demo</A> |
| 169 | <br> |
| 170 | This is a demo C library that does class file to class file |
| 171 | transformations or BCI (Bytecode Instrumentation). |
| 172 | It is used by several of the above agents. |
| 173 | </li> |
| 174 | |
| 175 | |
| 176 | </ul> |
| 177 | |
| 178 | |
| 179 | |
| 180 | <h2>Native Library Build Hints</h2> |
| 181 | |
| 182 | <p> |
| 183 | All libraries loaded into java are assumed to be MT-safe (Multi-thread safe). |
| 184 | This means that multiple threads could be executing the code at the same |
| 185 | time, and static or global data may need to be placed in critical |
| 186 | sections. See the Raw Monitor interfaces for more information. |
| 187 | |
| 188 | <p> |
| 189 | All native libraries loaded into the |
| 190 | Java Virtual Machine, |
| 191 | including Agent libraries, |
| 192 | need to be compiled and built in a compatible way. |
| 193 | Certain native compilation options or optimizations should be avoided, |
| 194 | and some are required. |
| 195 | More information on this options is available in the man pages for |
| 196 | the various compilers. |
| 197 | |
| 198 | <p> |
| 199 | Some native compiler and linker options can create fatal or |
| 200 | erroneous behavior when native agent libraries are operating |
| 201 | inside the Java Virtual Machine. |
| 202 | It would take too many words to describe all the possible issues with all |
| 203 | the native compiler options, optimizations, and settings. |
| 204 | Here are some recommendations on the basic compiler and linker options |
| 205 | we recommend: |
| 206 | |
| 207 | <ul> |
| 208 | |
| 209 | <h3> Solaris </h3> |
| 210 | |
| 211 | <li> |
| 212 | On Solaris, using the Sun Studio 11 C compiler, |
| 213 | the typical compile and link command lines might look something like: |
| 214 | <br> |
| 215 | For 32bit SPARC: |
| 216 | <br> |
| 217 | <code><ul> |
| 218 | cc -xO2 -mt -xregs=no%appl -xmemalign=4s -xarch=v8 -KPIC -c <i>*.c</i> |
| 219 | <br> |
| 220 | cc -mt -xarch=v8 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc |
| 221 | </code></ul> |
| 222 | <br> |
| 223 | For 64bit SPARC: |
| 224 | <br> |
| 225 | <code><ul> |
| 226 | cc -xO2 -mt -xregs=no%appl -xarch=v9 -KPIC -c <i>*.c</i> |
| 227 | <br> |
| 228 | cc -mt -xarch=v9 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc |
| 229 | </code></ul> |
| 230 | <br> |
| 231 | For X86: |
| 232 | <br> |
| 233 | <code><ul> |
| 234 | cc -xO2 -mt -xregs=no%frameptr -KPIC -c <i>*.c</i> |
| 235 | <br> |
| 236 | cc -mt -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc |
| 237 | </code></ul> |
| 238 | <br> |
| 239 | For AMD64: |
| 240 | <br> |
| 241 | <code><ul> |
| 242 | cc -xO2 -mt -xregs=no%frameptr -xarch=amd64 -KPIC -c <i>*.c</i> |
| 243 | <br> |
| 244 | cc -mt -xarch=amd64 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc |
| 245 | </code></ul> |
| 246 | <br> |
| 247 | </li> |
| 248 | |
| 249 | <li> |
| 250 | Architecture/File Format: |
| 251 | For SPARC 32bit use <code>-xarch=v8</code>, |
| 252 | for SPARC 64bit use <code>-xarch=v9</code>, |
| 253 | for X86 (32-bit) |
| 254 | <i> |
| 255 | leave the option off or use <code>-xarch=generic</code> |
| 256 | </i>, |
| 257 | and for AMD64 (64bit) use <code>-xarch=amd64</code> |
| 258 | with both C and C++. |
| 259 | <br> |
| 260 | This is to be specific as to the architecture and the file format |
| 261 | of the .o files (and ultimately of the .so). |
| 262 | </li> |
| 263 | |
| 264 | <li> |
| 265 | MT-Safe, Position Independent: Use <code>-KPIC -mt</code> |
| 266 | with both C and C++. |
| 267 | </li> |
| 268 | |
| 269 | <li> |
| 270 | Register usage: For SPARC (both 32bit and 64bit) use |
| 271 | <code>-xregs=no%appl</code> and for X86 and AMD64 use <code>-xregs=no%frameptr</code> |
| 272 | with both C and C++. |
| 273 | </li> |
| 274 | |
| 275 | <li> |
| 276 | Alignment: For SPARC 32bit use -xmemalign=4s and for SPARC 64bit do NOT use <code>-xmemalign=4</code> |
| 277 | with both C and C++. |
| 278 | </li> |
| 279 | |
| 280 | <li> |
| 281 | Dependencies: Use <code>ldd -r <i>LibraryName</i></code>. |
| 282 | <br> |
| 283 | After the shared library has been built, the utility |
| 284 | <code>ldd</code> can be used to verify that all dependent libraries |
| 285 | have been satisfied, and all externs can be found. |
| 286 | If <code>ldd</code> says anything is missing, it is very likely that the JVM will also |
| 287 | be unable to load this library. |
| 288 | This usually means that you missed some <code>-l<i>name</i></code> |
| 289 | options when building the library, or perhaps forgot a <code>-R path</code> |
| 290 | option that tells the library where to look for libraries at runtime. |
| 291 | </li> |
| 292 | |
| 293 | <h3> Linux </h3> |
| 294 | |
| 295 | <li> |
| 296 | On Linux, using the gcc version 3.2, |
| 297 | the typical compile and link command lines might look something like: |
| 298 | <br> |
| 299 | For X86: |
| 300 | <br> |
| 301 | <code><ul> |
| 302 | gcc -O2 -fPIC -pthread -DLINUX -c <i>*.c</i> |
| 303 | <br> |
| 304 | gcc -z defs -static-libgcc -shared -mimpure-text -o <i>libXXX.so *.o</i> -lc |
| 305 | </code></ul> |
| 306 | <br> |
| 307 | For AMD64: |
| 308 | <br> |
| 309 | <code><ul> |
| 310 | gcc -O2 -fPIC -pthread -DLINUX -D_LP64=1 -c <i>*.c</i> |
| 311 | <br> |
| 312 | gcc -z defs -static-libgcc -shared -mimpure-text -o <i>libXXX.so *.o</i> -lc |
| 313 | </code></ul> |
| 314 | <br> |
| 315 | </li> |
| 316 | |
| 317 | <li> |
| 318 | MT-Safe, Position Independent: |
| 319 | Use <code>-fPIC -pthread</code>. |
| 320 | </li> |
| 321 | |
| 322 | <li> |
| 323 | Agent Demo Code: Needs -DLINUX |
| 324 | </li> |
| 325 | |
| 326 | <li> |
| 327 | Register Usage: Use <code>-fno-omit-frame-pointer</code>. |
| 328 | <br> |
| 329 | It is important that these libraries have frame pointer register usage, see the above comments on the Solaris |
| 330 | <code>-xregs=no%frameptr</code> |
| 331 | option. |
| 332 | </li> |
| 333 | |
| 334 | <li> |
| 335 | Library: Use -static-libgcc -mimpure-text. |
| 336 | <br> |
| 337 | When building the shared library (-shared option), this option |
| 338 | allows for maximum portability of the library between different |
| 339 | flavors of Linux. |
| 340 | The problem we have seen with Linux is that we cannot depend |
| 341 | on a compatible shared gcc library existing on all the versions of |
| 342 | Linux we can run on. |
| 343 | By doing this static link, the version script becomes more |
| 344 | important, making sure you don't expose any extern symbols |
| 345 | you didn't intend to. |
| 346 | </li> |
| 347 | |
| 348 | <li> |
| 349 | Dependencies: Use <code>ldd -r <i>LibraryName</i></code>. |
| 350 | <br> |
| 351 | Provides the same checking as Solaris (see above). |
| 352 | </li> |
| 353 | |
| 354 | <h3> Windows </h3> |
| 355 | |
| 356 | <li> |
| 357 | On Windows and using the Microsoft C++ Compiler Visual Studio .NET 2003, |
| 358 | the typical compile and link command lines might look something like: |
| 359 | <br> |
| 360 | For X86: |
| 361 | <br> |
| 362 | <code><ul> |
| 363 | cl /O1 /MD /D _STATIC_CPPLIB /c <i>*.c</i> |
| 364 | <br> |
| 365 | link /dll /opt:REF /out:<i>XXX.dll *.obj</i> |
| 366 | </code></ul> |
| 367 | <br> |
| 368 | For AMD64: |
| 369 | <br> |
| 370 | <code><ul> |
| 371 | cl /O1 /MD /D _STATIC_CPPLIB /c <i>*.c</i> |
| 372 | <br> |
| 373 | link /dll /opt:REF /out:<i>XXX.dll *.obj</i> |
| 374 | </code></ul> |
| 375 | <br> |
| 376 | </li> |
| 377 | |
| 378 | <li> |
| 379 | Library: Use <code>/opt:REF </code> when building the dll. |
| 380 | </li> |
| 381 | |
| 382 | <li> |
| 383 | MS DLL Runtime: Use the <code>/MD /D _STATIC_CPPLIB</code> option. |
| 384 | <br> |
| 385 | This causes your dll to become dependent on MSVCRT.DLL and/or |
| 386 | the newer C++ runtime MSVCR71.DLL. |
| 387 | The option /D _STATIC_CPPLIB prevents you from becoming dependent on the |
| 388 | C++ library MSVCP71.DLL. |
| 389 | This is what we use in the JDK, but there are probably many combinations |
| 390 | that you could safely use, unfortunately there are many combinations |
| 391 | of runtimes that will not work. |
| 392 | Check the Microsoft site on proper use of runtimes. |
| 393 | </li> |
| 394 | |
| 395 | <li> |
| 396 | Dependencies: Use VC++ <code>dumpbin /exports</code> and the VC++ "Dependency Walker". |
| 397 | <br> |
| 398 | Provides dependency information similar to <code>ldd</code>. |
| 399 | </li> |
| 400 | |
| 401 | </ul> |
| 402 | |
| 403 | |
| 404 | <h2>For More Information</h2> |
| 405 | |
| 406 | <p> |
| 407 | Remember, the complete source to all these agents is contained in the JDK |
| 408 | installations at demo/jvmti. |
| 409 | |
| 410 | <p> |
| 411 | For more detailed information on JVM TI, refer to |
| 412 | <A HREF="http://java.sun.com/j2se/latest/docs/guide/jvmti"> |
| 413 | http://java.sun.com/j2se/latest/docs/guide/jvmti.</A> |
| 414 | |
| 415 | <p> |
| 416 | More information on using JNI and building native libraries refer to: |
| 417 | <A HREF="http://java.sun.com/j2se/latest/docs/guide/jni"> |
| 418 | http://java.sun.com/j2se/latest/docs/guide/jni</A>. |
| 419 | |
| 420 | <p> |
| 421 | Additional information can also be found by doing a search on "jvmti" at |
| 422 | <A HREF="http://java.sun.com/j2se">http://java.sun.com/j2se</A>. |
| 423 | Various technical articles are also available through this website. |
| 424 | And don't forget the |
| 425 | Java Tutorials at |
| 426 | <A HREF="http://java.sun.com/docs/books/tutorial">http://java.sun.com/docs/books/tutorial</A> |
| 427 | for getting a quick start on all the various interfaces. |
| 428 | |
| 429 | <h2>Comments and Feedback</h2> |
| 430 | |
| 431 | <p> |
| 432 | Comments regarding JVM TI or on any of these demonstrations should be |
| 433 | sent through |
| 434 | <A HREF="http://java.sun.com/mail">http://java.sun.com/mail/</A> |
| 435 | |
| 436 | |
| 437 | |
| 438 | </html> |