1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage dalvik.system;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provides an interface to VM-global, Dalvik-specific features.
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * An application cannot create its own Runtime instance, and must obtain
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one from the getRuntime method.
23979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson *
24979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson * @deprecated this is an internal Dalvik class that is not appropriate for
25979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson *      general use. It will be removed from the public API in a future release.
26979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class VMRuntime {
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the VMRuntime singleton.
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final VMRuntime THE_ONE = new VMRuntime();
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Prevents this class from being instantiated.
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private VMRuntime() {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the object that represents the VM instance's Dalvik-specific
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * runtime environment.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the runtime object
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static VMRuntime getRuntime() {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return THE_ONE;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the current ideal heap utilization, represented as a number
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * between zero and one.  After a GC happens, the Dalvik heap may
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resized so that (size of live objects) / (size of heap) is
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * equal to this number.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the current ideal heap utilization
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native float getTargetHeapUtilization();
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the current ideal heap utilization, represented as a number
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * between zero and one.  After a GC happens, the Dalvik heap may
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resized so that (size of live objects) / (size of heap) is
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * equal to this number.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
68979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     * <p>This is only a hint to the garbage collector and may be ignored.
69979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     *
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newTarget the new suggested ideal heap utilization.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                  This value may be adjusted internally.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the previous ideal heap utilization
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException if newTarget is &lt;= 0.0 or &gt;= 1.0
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public float setTargetHeapUtilization(float newTarget) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (newTarget <= 0.0 || newTarget >= 1.0) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException(newTarget +
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    " out of range (0,1)");
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* Synchronize to make sure that only one thread gets
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * a given "old" value if both update at the same time.
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Allows for reliable save-and-restore semantics.
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        synchronized (this) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            float oldTarget = getTargetHeapUtilization();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            nativeSetTargetHeapUtilization(newTarget);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return oldTarget;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the minimum heap size, or zero if no minimum is in effect.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the minimum heap size value
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long getMinimumHeapSize() {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return nativeMinimumHeapSize(0, false);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the desired minimum heap size, and returns the
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * old minimum size.  If size is larger than the maximum
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * size, the maximum size will be used.  If size is zero
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * or negative, the minimum size constraint will be removed.
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
106979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     * <p>Synchronized to make the order of the exchange reliable.
107979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     *
108979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     * <p>This is only a hint to the garbage collector and may be ignored.
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param size the new suggested minimum heap size, in bytes
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the old minimum heap size value
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized long setMinimumHeapSize(long size) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return nativeMinimumHeapSize(size, true);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If set is true, sets the new minimum heap size to size; always
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * returns the current (or previous) size.
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param size the new suggested minimum heap size, in bytes
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param set if true, set the size based on the size parameter,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            otherwise ignore it
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the old or current minimum heap size value
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private native long nativeMinimumHeapSize(long size, boolean set);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Requests that the virtual machine collect available memory,
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and collects any SoftReferences that are not strongly-reachable.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native void gcSoftReferences();
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Does not return until any pending finalizers have been called.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This may or may not happen in the context of the calling thread.
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * No exceptions will escape.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native void runFinalizationSync();
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Implements setTargetHeapUtilization().
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newTarget the new suggested ideal heap utilization.
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                  This value may be adjusted internally.
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private native void nativeSetTargetHeapUtilization(float newTarget);
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Asks the VM if &lt;size&gt; bytes can be allocated in an external heap.
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This information may be used to limit the amount of memory available
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to Dalvik threads.  Returns false if the VM would rather that the caller
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * did not allocate that much memory.  If the call returns false, the VM
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * will not update its internal counts.  May cause one or more GCs as a
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * side-effect.
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Called by JNI code.
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@hide}
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param size The number of bytes that have been allocated.
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return true if the VM thinks there's enough process memory
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         to satisfy this request, or false if not.
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native boolean trackExternalAllocation(long size);
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Tells the VM that &lt;size&gt; bytes have been freed in an external
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * heap.  This information may be used to control the amount of memory
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * available to Dalvik threads.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Called by JNI code.
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@hide}
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param size The number of bytes that have been freed.  This same number
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             should have been passed to trackExternalAlloc() when
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             the underlying memory was originally allocated.
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native void trackExternalFree(long size);
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of externally-allocated bytes being tracked by
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * trackExternalAllocation/Free().
185979baaeae3122b0c7ad5b24e7842472127b8a967Jesse Wilson     *
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of bytes
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public native long getExternalBytesAllocated();
1896bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng
1906bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng    /**
1916bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng     * Tells the VM to enable the JIT compiler. If the VM does not have a JIT
1926bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng     * implementation, calling this method should have no effect.
1936bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng     *
1946bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng     * {@hide}
1956bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng     */
196a97ed1382c4e74704b44d366cf464bef5757c6b0Ben Cheng    public native void startJitCompilation();
1976bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng
198f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng    /**
199f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng     * Tells the VM to disable the JIT compiler. If the VM does not have a JIT
200f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng     * implementation, calling this method should have no effect.
201f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng     *
202f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng     * {@hide}
203f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng     */
204f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng    public native void disableJitCompilation();
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
206