blob: 1e544534a16fcd7b9b4a5b2600b3992a83769cdf [file] [log] [blame]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001<html>
2<head>
3 <title>Controlling the Embedded VM</title>
4 <link rel=stylesheet href="android.css">
5</head>
6
7<body>
8<h1>Controlling the Embedded VM</h1>
9
10<ul>
Andy McFaddenf20c92f2010-02-01 14:39:21 -080011 <li><a href="#introduction">Introduction</a> (read this first!)
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080012 <li><a href="#checkjni">Extended JNI Checks</a>
13 <li><a href="#assertions">Assertions</a>
14 <li><a href="#verifier">Bytecode Verification and Optimization</a>
15 <li><a href="#execmode">Execution Mode</a>
16 <li><a href="#dp">Deadlock Prediction</a>
17 <li><a href="#stackdump">Stack Dumps</a>
Andy McFadden0af0a8c2009-04-03 11:09:44 -070018 <li><a href="#dexcheck">DEX File Checksums</a>
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080019</ul>
20
Andy McFaddenf20c92f2010-02-01 14:39:21 -080021<h2><a name="introduction">Introduction (read this first!)</a></h2>
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080022
23<p>The Dalvik VM supports a variety of command-line arguments
24(use <code>adb shell dalvikvm -help</code> to get a summary), but
25it's not possible to pass arbitrary arguments through the
26Android application runtime. It is, however, possible to affect the
27VM behavior through certain system properties.
28
29<p>For all of the features described below, you would set the system property
30with <code>setprop</code>,
31issuing a shell command on the device like this:
32<pre>adb shell setprop &lt;name&gt; &lt;value&gt;</pre>
33
Andy McFaddenf20c92f2010-02-01 14:39:21 -080034<p><strong>The Android runtime must be restarted before the changes will take
35effect</strong> (<code>adb shell stop; adb shell start</code>). This is because the
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080036settings are processed in the "zygote" process, which starts early and stays
37around "forever".
38
Andy McFaddenf20c92f2010-02-01 14:39:21 -080039<p>You may not be able to set <code>dalvik.*</code> properties or restart
40the system as an unprivileged user. You can use
Andy McFaddenc7659ec2009-09-18 16:14:41 -070041<code>adb root</code> or run the <code>su</code> command from the device
42shell on "userdebug" builds to become root first. When in doubt,
43<pre>adb shell getprop &lt;name&gt;</pre>
44will tell you if the <code>setprop</code> took.
45
46<p>If you don't want the property to evaporate when the device reboots,
47add a line to <code>/data/local.prop</code> that looks like:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080048<pre>&lt;name&gt; = &lt;value&gt;</pre>
49
Andy McFaddenc7659ec2009-09-18 16:14:41 -070050<p>Such changes will survive reboots, but will be lost if the data
51partition is wiped. (Hint: create a <code>local.prop</code>
Andy McFaddenf20c92f2010-02-01 14:39:21 -080052on your workstation, then <code>adb push local.prop /data</code>. Or,
Andy McFaddenc7659ec2009-09-18 16:14:41 -070053use one-liners like
54<code>adb shell "echo name = value &gt;&gt; /data/local.prop"</code> -- note
55the quotes are important.)
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080056
57
58<h2><a name="checkjni">Extended JNI Checks</a></h2>
59
60<p>JNI, the Java Native Interface, provides a way for code written in the
61Java programming language
62interact with native (C/C++) code. The extended JNI checks will cause
63the system to run more slowly, but they can spot a variety of nasty bugs
64before they have a chance to cause problems.
65
66<p>There are two system properties that affect this feature, which is
67enabled with the <code>-Xcheck:jni</code> command-line argument. The
68first is <code>ro.kernel.android.checkjni</code>. This is set by the
69Android build system for development builds. (It may also be set by
70the Android emulator unless the <code>-nojni</code> flag is provided on the
71emulator command line.) Because this is an "ro." property, the value cannot
72be changed once the device has started.
73
74<p>To allow toggling of the CheckJNI flag, a second
75property, <code>dalvik.vm.checkjni</code>, is also checked. The value
76of this overrides the value from <code>ro.kernel.android.checkjni</code>.
77
78<p>If neither property is defined, or <code>dalvik.vm.checkjni</code>
79is set to <code>false</code>, the <code>-Xcheck:jni</code> flag is
80not passed in, and JNI checks will be disabled.
81
82<p>To enable JNI checking:
83<pre>adb shell setprop dalvik.vm.checkjni true</pre>
84
85<p>You can also pass JNI-checking options into the VM through a system
86property. The value set for <code>dalvik.vm.jniopts</code> will
Andy McFaddenc7659ec2009-09-18 16:14:41 -070087be passed in as the <code>-Xjniopts</code> argument. For example:
88<pre>adb shell setprop dalvik.vm.jniopts forcecopy</pre>
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080089
90<p>For more information about JNI checks, see
91<a href="jni-tips.html">JNI Tips</a>.
92
93
94<h2><a name="assertions">Assertions</a></h2>
95
96<p>Dalvik VM supports the Java programming language "assert" statement.
97By default they are off, but the <code>dalvik.vm.enableassertions</code>
98property provides a way to set the value for a <code>-ea</code> argument.
99
100<p>The argument behaves the same as it does in other desktop VMs. You
101can provide a class name, a package name (followed by "..."), or the
102special value "all".
103
104<p>For example, this:
105<pre>adb shell setprop dalvik.vm.enableassertions all</pre>
106enables assertions in all non-system classes.
107
108<p>The system property is much more limited than the full command line.
109It is not possible to specify more than one <code>-ea</code> entry, and there
110is no way to specify a <code>-da</code> entry. There is presently no
111equivalent for <code>-esa</code>/<code>-dsa</code>.
112
113
114<h2><a name="verifier">Bytecode Verification and Optimization</a></h2>
115
116<p>The system tries to pre-verify all classes in a DEX file to reduce
117class load overhead, and performs a series of optimizations to improve
118runtime performance. Both of these are done by the <code>dexopt</code>
119command, either in the build system or by the installer. On a development
120device, <code>dexopt</code> may be run the first time a DEX file is used
121and whenever it or one of its dependencies is updated ("just-in-time"
122optimization and verification).
123
124<p>There are two command-line flags that control the just-in-time
125verification and optimization,
126<code>-Xverify</code> and <code>-Xdexopt</code>. The Android framework
127configures these based on the <code>dalvik.vm.dexopt-flags</code>
128property.
129
130<p>If you set:
131<pre>adb shell setprop dalvik.vm.dexopt-flags v=a,o=v</pre>
132then the framework will pass <code>-Xverify:all -Xdexopt:verified</code>
133to the VM. This enables verification, and only optimizes classes that
134successfully verified. This is the safest setting, and is the default.
135<p>You could also set <code>dalvik.vm.dexopt-flags</code> to <code>v=n</code>
136to have the framework pass <code>-Xverify:none -Xdexopt:verified</code>
137to disable verification. (We could pass in <code>-Xdexopt:all</code> to
138allow optimization, but that wouldn't necessarily optimize more of the
139code, since classes that fail verification may well be skipped by the
140optimizer for the same reasons.) Classes will not be verified by
141<code>dexopt</code>, and unverified code will be loaded and executed.
142
143<p>Enabling verification will make the <code>dexopt</code> command
144take significantly longer, because the verification process is fairly slow.
145Once the verified and optimized DEX files have been prepared, verification
146incurs no additional overhead except when loading classes that failed
147to pre-verify.
148
149<p>If your DEX files are processed with verification disabled, and you
150later turn the verifier on, application loading will be noticeably
151slower (perhaps 40% or more) as classes are verified on first use.
152
153<p>For best results you should force a re-dexopt of all DEX files when
154this property changes. You can do this with:
155<pre>adb shell "rm /data/dalvik-cache/*"</pre>
156This removes the cached versions of the DEX files. Remember to
157stop and restart the runtime (<code>adb shell stop; adb shell start</code>).
158
159<p>(Previous version of the runtime supported the boolean
160<code>dalvik.vm.verify-bytecode</code> property, but that has been
161superceded by <code>dalvik.vm.dexopt-flags</code>.)</p>
162
163
164<h2><a name="execmode">Execution Mode</a></h2>
165
166<p>The current implementation of the Dalvik VM includes three distinct
167interpreter cores. These are referred to as "fast", "portable", and
168"debug". The "fast" interpreter is optimized for the current
169platform, and might consist of hand-optimized assembly routines. In
170constrast, the "portable" interpreter is written in C and expected to
171run on a broad range of platforms. The "debug" interpreter is a variant
172of "portable" that includes support for profiling and single-stepping.
173
Andy McFaddenc7659ec2009-09-18 16:14:41 -0700174<p>The VM may also support just-in-time compilation. While not strictly
175a different interpreter, the JIT compiler may be enabled or disabled
176with the same flag. (Check the output of <code>dalvikvm -help</code> to
177see if JIT compilation is enabled in your VM.)
178
179<p>The VM allows you to choose between "fast", "portable", and "jit" with an
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800180extended form of the <code>-Xint</code> argument. The value of this
181argument can be set through the <code>dalvik.vm.execution-mode</code>
182system property.
183
184<p>To select the "portable" interpreter, you would use:
185<pre>adb shell setprop dalvik.vm.execution-mode int:portable</pre>
186If the property is not specified, the most appropriate interpreter
187will be selected automatically. At some point this mechanism may allow
188selection of other modes, such as JIT compilation.
189
190<p>Not all platforms have an optimized implementation. In such cases,
191the "fast" interpreter is generated as a series of C stubs, and the
192result will be slower than the
193"portable" version. (When we have optimized versions for all popular
194architectures the naming convention will be more accurate.)
195
196<p>If profiling is enabled or a debugger is attached, the VM
197switches to the "debug" interpreter. When profiling ends or the debugger
198disconnects, the original interpreter is resumed. (The "debug" interpreter
199is substantially slower, something to keep in mind when evaluating
200profiling data.)
201
202
203<h2><a name="dp">Deadlock Prediction</a></h2>
204
205<p>If the VM is built with <code>WITH_DEADLOCK_PREDICTION</code>, the deadlock
206predictor can be enabled with the <code>-Xdeadlockpredict</code> argument.
207(The output from <code>dalvikvm -help</code> will tell you if the VM was
208built appropriately -- look for <code>deadlock_prediction</code> on the
209<code>Configured with:</code> line.)
210This feature tells the VM to keep track of the order in which object
211monitor locks are acquired. If the program attempts to acquire a set
212of locks in a different order from what was seen earlier, the VM logs
213a warning and optionally throws an exception.
214
215<p>The command-line argument is set based on the
216<code>dalvik.vm.deadlock-predict</code> property. Valid values are
217<code>off</code> to disable it (default), <code>warn</code> to log the
218problem but continue executing, <code>err</code> to cause a
219<code>dalvik.system.PotentialDeadlockError</code> to be thrown from the
220<code>monitor-enter</code> instruction, and <code>abort</code> to have
221the entire VM abort.
222
223<p>You will usually want to use:
224<pre>adb shell setprop dalvik.vm.deadlock-predict err</pre>
225unless you are keeping an eye on the logs as they scroll by.
226
227<p>Please note that this feature is deadlock prediction, not deadlock
228detection -- in the current implementation, the computations are performed
229after the lock is acquired (this simplifies the code, reducing the
230overhead added to every mutex operation). You can spot a deadlock in a
231hung process by sending a <code>kill -3</code> and examining the stack
232trace written to the log.
233
234<p>This only takes monitors into account. Native mutexes and other resources
235can also be the cause of deadlocks, but will not be detected by this.
236
237
238<h2><a name="stackdump">Stack Dumps</a></h2>
239
240<p>Like other desktop VMs, when the Dalvik VM receives a SIGQUIT
241(Ctrl-\ or <code>kill -3</code>), it dumps stack traces for all threads.
242By default this goes to the Android log, but it can also be written to a file.
243
244<p>The <code>dalvik.vm.stack-trace-file</code> property allows you to
245specify the name of the file where the thread stack traces will be written.
246The file will be created (world writable) if it doesn't exist, and the
247new information will be appended to the end of the file. The filename
248is passed into the VM via the <code>-Xstacktracefile</code> argument.
249
250<p>For example:
251<pre>adb shell setprop dalvik.vm.stack-trace-file /tmp/stack-traces.txt</pre>
252
253<p>If the property is not defined, the VM will write the stack traces to
254the Android log when the signal arrives.
255
Andy McFadden0af0a8c2009-04-03 11:09:44 -0700256
257<h2><a name="dexcheck">DEX File Checksums</a></h2>
258
259<p>For performance reasons, the checksum on "optimized" DEX files is
260ignored. This is usually safe, because the files are generated on the
261device, and have access permissions that prevent modification.
262
263<p>If the storage on a device becomes unreliable, however, data corruption
264can occur. This usually manifests itself as a repeatable virtual machine
265crash. To speed diagnosis of such failures, the VM provides the
266<code>-Xcheckdexsum</code> argument. When set, the checksums on all DEX
267files are verified before the contents are used.
268
269<p>The application framework will provide this argument during VM
270creation if the <code>dalvik.vm.check-dex-sum</code> property is enabled.
271
272<p>To enable extended DEX checksum verification:
273<pre>adb shell setprop dalvik.vm.check-dex-sum true</pre>
274
275<p>Incorrect checksums will prevent the DEX data from being used, and will
276cause errors to be written to the log file. If a device has a history of
277problems it may be useful to add the property to
278<code>/data/local.prop</code>.
279
280<p>Note also that the
281<code>dexdump</code> tool always verifies DEX checksums, and can be used
282to check for corruption in a large set of files.
283
284
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800285<address>Copyright &copy; 2008 The Android Open Source Project</address>
286
287</body></html>