Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 5b1142d2b67af1fb376a14a24f7ecc294fe90cdd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en-us" lang="en-us">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="DC.Type" content="task"/>
<meta name="DC.Title" content="Basic Tutorial"/>
<meta name="DC.Relation" scheme="URI" content="../concepts/dominatortree.html"/>
<meta name="DC.Relation" scheme="URI" content="../concepts/gcroots.html"/>
<meta name="copyright" content="Copyright (c) 2008, 2017 SAP AG and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html " type="primary"/>
<meta name="DC.Rights.Owner" content="Copyright (c) 2008, 2017 SAP AG and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html " type="primary"/>
<meta name="DC.Format" content="XHTML"/>
<meta name="DC.Identifier" content="task_basictutorial"/>
<meta name="DC.Language" content="en-us"/>
<link rel="stylesheet" type="text/css" href="../styles/commonltr.css"/>
<title>Basic Tutorial</title>
</head>
<body id="task_basictutorial">


	<h1 class="title topictitle1">Basic Tutorial</h1>

	
	
	<div class="body taskbody">
		<div class="section context">
			<p class="p">
				This tutorial provides a "jumping-off place" to get familiar with
				Memory Analyzer.
			</p>

			
			<p class="p">
				If you are using Memory Analyzer installed into Eclipse rather than a stand-alone Memory Analyzer, 
				first open the 'Memory Analysis' perspective using:
				<span class="ph menucascade"><span class="ph uicontrol">Window</span> &gt; <span class="ph uicontrol">Perspective</span> &gt; <span class="ph uicontrol">Open Perspective</span> &gt; <span class="ph uicontrol">Other ...</span> &gt; <span class="ph uicontrol">Memory Analysis</span></span>
			</p>


			<p class="p">
				<strong class="ph b">Step 1 - Getting a Heap Dump</strong>
			</p>


			<p class="p">
				The Memory Analyzer works with
				<a class="xref" href="../concepts/heapdump.html">heap dumps</a>
				. Such a heap dump contains information about all Java objects alive
				at a given point in time. All current Java Virtual Machines can
				write heap dumps, but the exact steps depend on vendor, version and
				operation system. Find out more in the section
				<a class="xref" href="../tasks/acquiringheapdump.html">Acquiring Heap Dumps</a>
				.
			</p>


			<p class="p">
				Open
				<img class="image" src="../mimes/me76fc4.png" alt=""/>
				<a class="xref" href="javascript:liveAction(%22org.eclipse.mat.ui%22,%22org.eclipse.mat.ui.snapshot.actions.OpenSampleHeapDumpAction%22,%22org.eclipse.mat.ui.help/heapdump/HeapDumpSample.hprof%22)">
					a sample heap dump</a>
				if you view this page inside the Eclipse help center.
			</p>


			<p class="p">
				For the purpose of this tutorial, we use Java 6 and JConsole on
				Windows. Start your application with Java 6, then start
				<samp class="ph codeph">&lt;jre6&gt;/bin/jconsole.exe</samp>
				and select the running application (in this case Eclipse):
			</p>


			<img class="image" src="basictutorial_jconsole_open.png" alt="JConsole dialog to open a connection to a Virtual Machine."/>

			<p class="p">
				Then, select the operation
				<em class="ph i">dumpHeap</em>
				from the
				<em class="ph i">com.sun.management.HotSpotDiagnostic</em>
				MBean. The first parameter
				<em class="ph i">p0</em>
				is the full path to the heap dump file. Make sure you give it the
				file extension .hprof. The second parameter
				<em class="ph i">p1</em>
				should be left at true as we are only interested in live objects.
			</p>


			<img class="image" src="basictutorial_jconsole_mbean.png" alt="Select the dumpHeap method of the HotspotDiagnostics mbean."/>

			<p class="p">
				<strong class="ph b">Step 2 - The Overview</strong>
			</p>


			<p class="p">
				Open the heap dump via
				<span class="ph menucascade"><span class="ph uicontrol">File</span> &gt; <span class="ph uicontrol">
						<img class="image" src="../mimes/i-openhd.png" alt=""/>
						Open Heap Dump...
					</span></span>
				to see the overview page.
			</p>


			<img class="image" src="basictutorial_overview.png" alt="Memory Analyzer's overview page for a heap dump"/>

			<p class="p">
				On the right, you'll find the size of the dump and the number of
				classes, objects and class loaders.
			</p>

			<p class="p">
				Right below, the pie chart gives an impression on the biggest
				objects in the dump. Move your mouse over a slice to see the details
				of the objects in the object inspector on the left. Click on any
				slice to drill down and follow for example the outgoing references. 
			</p>


			<p class="p">
				<strong class="ph b">Step 3 - The Histogram</strong>
			</p>


			<p class="p">
				Select the
				<em class="ph i">histogram</em>
				from the tool bar to list the number of instances per class, the
				<a class="xref" href="../concepts/shallowretainedheap.html">shallow size</a>
				and the
				<a class="xref" href="../concepts/shallowretainedheap.html">retained size</a>
				.
			</p>


			<img class="image" src="basictutorial_histogram.png" alt="Histogram"/>

			<p class="p">
				The Memory Analyzer displays by default the retained size of
				individual objects. However, the retained size of a set of objects -
				in this case all instances of a particular class - needs to be
				calculated. 
			</p>


			<p class="p">
				To approximate the retained sizes for all rows, pick
				<img class="image" src="../mimes/i-calcrs.png" alt="Calculate retained size"/> icon
				from the tool bar. Alternatively, select a couple rows and use the
				context menu.
			</p>


			<img class="image" src="basictutorial_calc_retained.png" alt="Select calculate retained sizes from the tool bar"/>

			<p class="p">
				Using the
				<strong class="ph b">context menu</strong>
				, you can drill-down into the set of objects
				which the selected row
				represents. For example, you can list the
				objects with outgoing or
				incoming references. Or group the objects
				by the value of an
				attribute. Or group the collections by their
				size. Or or or...
			</p>


			<p class="p">
				One thing that makes the Memory Analyzer so powerful is the fact
				that one can run any action on any set of objects. Just drill down
				and slice your objects the way you need them.
			</p>


			<img class="image" src="basictutorial_context_menu.png" alt="Drill down via the context menu"/>

			<p class="p">
				Another important feature is the facility to
				<strong class="ph b">group any histogram by class loader, packages or superclass</strong>
				.
			</p>


			<img class="image" src="basictutorial_group_by.png" alt="Group the histogram by class loader or package via the tool bar"/>

			<p class="p">
				Any decent application loads different components by different
				class loaders. The Memory Analyzer attaches a meaningful label to
				the class loader - in the case of OSGi bundles it is the bundle id.
				Therefore it becomes a lot easier to divide the heap dump into
				smaller parts.
			</p>

			
			<p class="p">
				More: <a class="xref" href="../tasks/analyzingclassloader.html" title="Class loaders load classes into the memory of the JVM. When analyzing the heap, class loaders are very important for two reasons: First, applications typically load components using separate class loaders. Second, the loaded classes are usually stored in a separate space (e.g. the perm space) which can also be depleted.">Analyze Class Loader</a>
			</p>


			<img class="image" src="basictutorail_by_classloader.png" alt="Histogram grouped by class loader"/>

			<p class="p">
				Grouping the histogram by packages allows to drill-down along the
				Java package hierarchy.
			</p>


			<img class="image" src="basictutorail_by_package.png" alt="Histogram grouped by packages"/>
			
			<p class="p">
				Grouping the histogram by superclass provides an easy way to find for example all the subclasses of java.util.AbstractMap, etc...
			</p>

			
			<img class="image" src="basictutorial_by_superclass.png" alt="Histogram grouped by superclass"/>

			<p class="p">
				<strong class="ph b">Step 4 - The Dominator Tree</strong>
			</p>


			<p class="p">
				The
				<a class="xref" href="../concepts/dominatortree.html">dominator tree</a>
				displays the biggest objects in the heap dump. The next level of the
				tree lists those objects that would be garbage collected if all
				incoming references to the parent node were removed.
			</p>


			<p class="p">
				The dominator tree is a powerful tool to investigate which objects
				keep which other objects alive. Again, the tree can be grouped by
				class loader (e.g. components) and packages to ease the analysis.
			</p>


			<img class="image" src="basictutorial_dominator_tree.png" alt="Dominator Tree"/>

			<p class="p">
				<strong class="ph b">Step 5 - Path to GC Roots</strong>
			</p>


			<p class="p">
				<a class="xref" href="../concepts/gcroots.html">Garbage Collections Roots (GC roots)</a>
				are objects that are kept alive by the Virtual Machines itself.
				These include for example the thread objects of the threads
				currently running, objects currently on the call stack and classes
				loaded by the system class loader.
			</p>


			<p class="p">
				The (reverse) reference chain from an object to a GC root - the so
				called path to GC roots - explains why the object cannot be garbage
				collected. The path helps solving the classical memory leak in Java:
				those leaks exist because an object is still referenced even though
				the program logic will not access the object anymore.
			</p>


			<img class="image" src="basictutorial_path_menu.png" alt="Select path to GC roots from the context menu"/>

			<p class="p">
				Initially, the GC root reached by the shortest path is selected.
			</p>


			<img class="image" src="basictutorial_path.png" alt="Path to GC roots"/>

			<p class="p">
				<strong class="ph b">Step 6 - The Leak Report</strong>
			</p>


			<p class="p">
				The Memory Analyzer can inspect the heap dump for leak suspects,
				e.g. objects or set of objects which are suspiciously big. 
			</p>


			<img class="image" src="basictutorial_run_leak_suspects.png" alt="Run the leak report"/>

			<p class="p">
				Learn more in this blog posting:
				<a class="xref" href="http://memoryanalyzer.blogspot.com/2008/05/automated-heap-dump-analysis-finding.html">Automated Heap Dump Analysis: Finding Memory Leaks with One
					Click</a>
				.
			</p>

		</div>

	</div>

	<div class="related-links"><div class="relinfo relconcepts"><strong>Related concepts</strong><br/>
<div><a class="link" href="../concepts/dominatortree.html">Dominator Tree</a></div>
<div><a class="link" href="../concepts/gcroots.html">Garbage Collection Roots</a></div>
</div>
</div>

</body>
</html>

Back to the top