2
|
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>
|