author | tschatzl |
Wed, 19 Aug 2015 13:59:39 +0200 | |
changeset 32379 | aa14adafaf0f |
parent 26201 | 40a873d21081 |
permissions | -rw-r--r-- |
2 | 1 |
/* |
5506 | 2 |
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. |
2 | 3 |
* |
4 |
* Redistribution and use in source and binary forms, with or without |
|
5 |
* modification, are permitted provided that the following conditions |
|
6 |
* are met: |
|
7 |
* |
|
8 |
* - Redistributions of source code must retain the above copyright |
|
9 |
* notice, this list of conditions and the following disclaimer. |
|
10 |
* |
|
11 |
* - Redistributions in binary form must reproduce the above copyright |
|
12 |
* notice, this list of conditions and the following disclaimer in the |
|
13 |
* documentation and/or other materials provided with the distribution. |
|
14 |
* |
|
5506 | 15 |
* - Neither the name of Oracle nor the names of its |
2 | 16 |
* contributors may be used to endorse or promote products derived |
17 |
* from this software without specific prior written permission. |
|
18 |
* |
|
19 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
|
20 |
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
|
21 |
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
22 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
23 |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
24 |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
25 |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
26 |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
27 |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
28 |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
29 |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
30 |
*/ |
|
31 |
||
32 |
README |
|
33 |
------ |
|
34 |
||
35 |
Design and Implementation: |
|
36 |
||
37 |
* The Tracker Class (Tracker.java & hprof_tracker.c) |
|
38 |
It was added to the sun.tools.hprof.Tracker in JDK 5.0 FCS, then |
|
39 |
moved to a package that didn't cause classload errors due to |
|
40 |
the security manager not liking the sun.* package name. |
|
41 |
5091195 detected that this class needs to be in com.sun.demo.jvmti.hprof. |
|
42 |
The BCI code will call these static methods, which will in turn |
|
43 |
(if engaged) call matching native methods in the hprof library, |
|
44 |
with the additional current Thread argument (Thread.currentThread()). |
|
45 |
Doing the currentThread call on the Java side was necessary due |
|
46 |
to the difficulty of getting the current thread while inside one |
|
47 |
of these Tracker native methods. This class lives in rt.jar. |
|
48 |
||
49 |
* Byte Code Instrumentation (BCI) |
|
50 |
Using the ClassFileLoadHook feature and a C language |
|
51 |
implementation of a byte code injection transformer, the following |
|
52 |
bytecodes get injections: |
|
53 |
- On entry to the java.lang.Object <init> method, |
|
54 |
a invokestatic call to |
|
55 |
Tracker.ObjectInit(this); |
|
56 |
is injected. |
|
57 |
- On any newarray type opcode, immediately following it, |
|
58 |
the array object is duplicated on the stack and an |
|
59 |
invokestatic call to |
|
60 |
Tracker.NewArray(obj); |
|
61 |
is injected. |
|
62 |
- On entry to all methods, a invokestatic call to |
|
63 |
Tracker.CallSite(cnum,mnum); |
|
64 |
is injected. The hprof agent can map the two integers |
|
65 |
(cnum,mnum) to a method in a class. This is the BCI based |
|
66 |
"method entry" event. |
|
67 |
- On return from any method (any return opcode), |
|
68 |
a invokestatic call to |
|
69 |
Tracker.ReturnSite(cnum,mnum); |
|
70 |
is injected. |
|
71 |
All classes found via ClassFileLoadHook are injected with the |
|
72 |
exception of some system class methods "<init>" and "finalize" |
|
73 |
whose length is 1 and system class methods with name "<clinit>", |
|
74 |
and also java.lang.Thread.currentThread() which is used in the |
|
75 |
class Tracker (preventing nasty recursion issue). |
|
76 |
System classes are currently defined as any class seen by the |
|
77 |
ClassFileLoadHook prior to VM_INIT. This does mean that |
|
78 |
objects created in the system classes inside <clinit> might not |
|
79 |
get tracked initially. |
|
80 |
See the java_crw_demo source and documentation for more info. |
|
81 |
The injections are based on what the hprof options |
|
82 |
are requesting, e.g. if heap=sites or heap=all is requested, the |
|
83 |
newarray and Object.<init> method injections happen. |
|
84 |
If cpu=times is requested, all methods get their entries and |
|
85 |
returns tracked. Options like cpu=samples or monitor=y |
|
86 |
do not require BCI. |
|
87 |
||
88 |
* BCI Allocation Tags (hprof_tag.c) |
|
89 |
The current jlong tag being used on allocated objects |
|
90 |
is an ObjectIndex, or an index into the object table inside |
|
91 |
the hprof code. Depending on whether heap=sites or heap=dump |
|
92 |
was asked for, these ObjectIndex's might represent unique |
|
93 |
objects, or unique allocation sites for types of objects. |
|
94 |
The heap=dump option requires considerable more space |
|
95 |
due to the one jobject per ObjectIndex mapping. |
|
96 |
||
97 |
* BCI Performance |
|
98 |
The cpu=times seems to have the most negative affect on |
|
99 |
performance, this could be improved by not having the |
|
100 |
Tracker class methods call native code directly, but accumulate |
|
101 |
the data in a file or memory somehow and letting it buffer down |
|
102 |
to the agent. The cpu=samples is probably a better way to |
|
103 |
measure cpu usage, varying the interval as needed. |
|
104 |
The heap=dump seems to use memory like crazy, but that's |
|
105 |
partially the way it has always been. |
|
106 |
||
107 |
* Sources in the JDK workspace |
|
108 |
The sources and Makefiles live in: |
|
26201
40a873d21081
8043936: Drop HPROF as demo, keep as HPROF agent shipped with JDK
sla
parents:
25859
diff
changeset
|
109 |
src/jdk.hprof.agent/* |
2 | 110 |
src/share/demo/jvmti/java_crw_demo/* |
26201
40a873d21081
8043936: Drop HPROF as demo, keep as HPROF agent shipped with JDK
sla
parents:
25859
diff
changeset
|
111 |
make/lib/Lib-jdk.hprof.agent.gmk |
2 | 112 |
|
113 |
-------- |