<?xml version="1.0" encoding="UTF-8"?> | |
<!-- | |
Copyright (c) 2008, 2012 SAP AG and others. | |
All rights reserved. This program and the accompanying materials | |
are made available under the terms of the Eclipse Public License 2.0 | |
which accompanies this distribution, and is available at | |
https://www.eclipse.org/legal/epl-2.0/ | |
SPDX-License-Identifier: EPL-2.0 | |
Contributors: | |
SAP AG - initial API and implementation | |
--> | |
<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "reference.dtd" > | |
<reference id="ref_analyzingmemoryconsumption" xml:lang="en-us"> | |
<title>Analyzing Memory Consumption</title> | |
<shortdesc /> | |
<prolog> | |
<copyright> | |
<copyryear year=""></copyryear> | |
<copyrholder> | |
Copyright (c) 2008, 2010 SAP AG and others. | |
All rights reserved. This program and the accompanying materials | |
are made available under the terms of the Eclipse Public License 2.0 | |
which accompanies this distribution, and is available at | |
https://www.eclipse.org/legal/epl-2.0/ | |
</copyrholder> | |
</copyright> | |
</prolog> | |
<refbody> | |
<section> | |
<p> | |
An easy way to start looking for areas for optimization is to use the <xref href="inspections/component_report.dita">Component Report</xref>. | |
Additionally, the following queries may be useful to perform the analysis manually: | |
</p> | |
<simpletable relcolwidth="2* 3*" | |
id="analyzingmemoryconsumptiontable"> | |
<strow> | |
<stentry>Class Histogram</stentry> | |
<stentry> | |
Memory Analyzer provides a developer with a | |
possibility to focus on a particular piece | |
of code by using filters in the Class | |
Histogram: | |
<image href="../mimes/7507ab60.png" align="left" placement="break"> | |
<alt>Filter of java.util.* in top row of histogram</alt> | |
</image> | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Retained Set</stentry> | |
<stentry> | |
Looking what a set of objects retains (how much memory and what types of | |
objects) may give some ideas where to optimize. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Collections query group</stentry> | |
<stentry> | |
A number of queries provided under the <b>Collections</b> query group give the opportunity | |
to analyze the ways collections are used e.g. how much they are filled, what the sizes are, | |
what the collision ratio (for hash maps) is, etc... See <xref href="../tasks/analyzingjavacollectionusage.dita">Analyzing Java Collection Usage</xref>. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Group by Value</stentry> | |
<stentry> | |
The Group by Value query provides the possibility to group a set of objects | |
by the value of a certain field. It is very useful for searching redundant | |
data. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Immediate Dominators</stentry> | |
<stentry> | |
When you have found a suspect, that consumes | |
a lot of memory, you can use the dominators | |
query to find out what keeps this suspect in | |
memory. With this query you can also skip | |
the dominators that are of no interest for | |
you, e.g. | |
<cmdname>java.*</cmdname> | |
packages: | |
<image href="../mimes/m317da505.png" align="left" placement="break"> | |
<alt>skip parameter in query wizard for immediate dominators query</alt> | |
</image>image> | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>OQL</stentry> | |
<stentry> | |
<p> | |
The two most common ways to "waste" memory | |
are: | |
</p> | |
<ul> | |
<li> | |
Inefficient use of data structures, like | |
keeping millions of empty lists or | |
HashMaps. With OQL you can easily find | |
e.g. all instances of ArrayList which | |
are empty and have never been modified: | |
<codeblock>SELECT * FROM java.util.ArrayList WHERE size=0 AND modCount=0</codeblock> | |
</li> | |
<li> | |
A lot of redundant data, e.g. redundant | |
<cmdname>Strings</cmdname> | |
or | |
<cmdname>char[]</cmdname> | |
. Below you can find two examples of OQL | |
queries to operate with Strings: | |
<codeblock>SELECT * FROM java.lang.String s WHERE s.count >= 100</codeblock> | |
<codeblock>SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*day"</codeblock> | |
</li> | |
</ul> | |
</stentry> | |
</strow> | |
</simpletable> | |
</section> | |
</refbody> | |
</reference> |