• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dalvik.system;
18 
19 /**
20  * Provides an interface to VM-global, Dalvik-specific features.
21  * An application cannot create its own Runtime instance, and must obtain
22  * one from the getRuntime method.
23  *
24  * @hide
25  */
26 public final class VMRuntime {
27 
28     /**
29      * Holds the VMRuntime singleton.
30      */
31     private static final VMRuntime THE_ONE = new VMRuntime();
32 
33     /**
34      * Prevents this class from being instantiated.
35      */
VMRuntime()36     private VMRuntime() {
37     }
38 
39     /**
40      * Returns the object that represents the VM instance's Dalvik-specific
41      * runtime environment.
42      *
43      * @return the runtime object
44      */
getRuntime()45     public static VMRuntime getRuntime() {
46         return THE_ONE;
47     }
48 
49     /**
50      * Returns a copy of the VM's command-line property settings.
51      * These are in the form "name=value" rather than "-Dname=value".
52      */
properties()53     public native String[] properties();
54 
55     /**
56      * Returns the VM's boot class path.
57      */
bootClassPath()58     public native String bootClassPath();
59 
60     /**
61      * Returns the VM's class path.
62      */
classPath()63     public native String classPath();
64 
65     /**
66      * Returns the VM's version.
67      */
vmVersion()68     public native String vmVersion();
69 
70     /**
71      * Returns the name of the shared library providing the VM implementation.
72      */
vmLibrary()73     public native String vmLibrary();
74 
75     /**
76      * Gets the current ideal heap utilization, represented as a number
77      * between zero and one.  After a GC happens, the Dalvik heap may
78      * be resized so that (size of live objects) / (size of heap) is
79      * equal to this number.
80      *
81      * @return the current ideal heap utilization
82      */
getTargetHeapUtilization()83     public native float getTargetHeapUtilization();
84 
85     /**
86      * Sets the current ideal heap utilization, represented as a number
87      * between zero and one.  After a GC happens, the Dalvik heap may
88      * be resized so that (size of live objects) / (size of heap) is
89      * equal to this number.
90      *
91      * <p>This is only a hint to the garbage collector and may be ignored.
92      *
93      * @param newTarget the new suggested ideal heap utilization.
94      *                  This value may be adjusted internally.
95      * @return the previous ideal heap utilization
96      * @throws IllegalArgumentException if newTarget is &lt;= 0.0 or &gt;= 1.0
97      */
setTargetHeapUtilization(float newTarget)98     public float setTargetHeapUtilization(float newTarget) {
99         if (newTarget <= 0.0f || newTarget >= 1.0f) {
100             throw new IllegalArgumentException(newTarget +
101                     " out of range (0,1)");
102         }
103         /* Synchronize to make sure that only one thread gets
104          * a given "old" value if both update at the same time.
105          * Allows for reliable save-and-restore semantics.
106          */
107         synchronized (this) {
108             float oldTarget = getTargetHeapUtilization();
109             nativeSetTargetHeapUtilization(newTarget);
110             return oldTarget;
111         }
112     }
113 
114     /**
115      * Sets the target SDK version. Should only be called before the
116      * app starts to run, because it may change the VM's behavior in
117      * dangerous ways. Use 0 to mean "current" (since callers won't
118      * necessarily know the actual current SDK version, and the
119      * allocated version numbers start at 1).
120      */
setTargetSdkVersion(int targetSdkVersion)121     public native void setTargetSdkVersion(int targetSdkVersion);
122 
123     /**
124      * This method exists for binary compatibility.  It was part of a
125      * heap sizing API which was removed in Android 3.0 (Honeycomb).
126      */
127     @Deprecated
getMinimumHeapSize()128     public long getMinimumHeapSize() {
129         return 0;
130     }
131 
132     /**
133      * This method exists for binary compatibility.  It was part of a
134      * heap sizing API which was removed in Android 3.0 (Honeycomb).
135      */
136     @Deprecated
setMinimumHeapSize(long size)137     public long setMinimumHeapSize(long size) {
138         return 0;
139     }
140 
141     /**
142      * This method exists for binary compatibility.  It used to
143      * perform a garbage collection that cleared SoftReferences.
144      */
145     @Deprecated
gcSoftReferences()146     public void gcSoftReferences() {}
147 
148     /**
149      * This method exists for binary compatibility.  It is equivalent
150      * to {@link System#runFinalization}.
151      */
152     @Deprecated
runFinalizationSync()153     public void runFinalizationSync() {
154         System.runFinalization();
155     }
156 
157     /**
158      * Implements setTargetHeapUtilization().
159      *
160      * @param newTarget the new suggested ideal heap utilization.
161      *                  This value may be adjusted internally.
162      */
nativeSetTargetHeapUtilization(float newTarget)163     private native void nativeSetTargetHeapUtilization(float newTarget);
164 
165     /**
166      * This method exists for binary compatibility.  It was part of
167      * the external allocation API which was removed in Android 3.0 (Honeycomb).
168      */
169     @Deprecated
trackExternalAllocation(long size)170     public boolean trackExternalAllocation(long size) {
171         return true;
172     }
173 
174     /**
175      * This method exists for binary compatibility.  It was part of
176      * the external allocation API which was removed in Android 3.0 (Honeycomb).
177      */
178     @Deprecated
trackExternalFree(long size)179     public void trackExternalFree(long size) {}
180 
181     /**
182      * This method exists for binary compatibility.  It was part of
183      * the external allocation API which was removed in Android 3.0 (Honeycomb).
184      */
185     @Deprecated
getExternalBytesAllocated()186     public long getExternalBytesAllocated() {
187         return 0;
188     }
189 
190     /**
191      * Tells the VM to enable the JIT compiler. If the VM does not have a JIT
192      * implementation, calling this method should have no effect.
193      */
startJitCompilation()194     public native void startJitCompilation();
195 
196     /**
197      * Tells the VM to disable the JIT compiler. If the VM does not have a JIT
198      * implementation, calling this method should have no effect.
199      */
disableJitCompilation()200     public native void disableJitCompilation();
201 
202     /**
203      * Returns an array allocated in an area of the Java heap where it will never be moved.
204      * This is used to implement native allocations on the Java heap, such as DirectByteBuffers
205      * and Bitmaps.
206      */
newNonMovableArray(Class<?> componentType, int length)207     public native Object newNonMovableArray(Class<?> componentType, int length);
208 
209     /**
210      * Returns the address of array[0]. This differs from using JNI in that JNI might lie and
211      * give you the address of a copy of the array when in forcecopy mode.
212      */
addressOf(Object array)213     public native long addressOf(Object array);
214 
215     /**
216      * Removes any growth limits, allowing the application to allocate
217      * up to the maximum heap size.
218      */
clearGrowthLimit()219     public native void clearGrowthLimit();
220 
221     /**
222      * Returns true if either a Java debugger or native debugger is active.
223      */
isDebuggerActive()224     public native boolean isDebuggerActive();
225 
226     /**
227      * Registers a native allocation so that the heap knows about it and performs GC as required.
228      * If the number of native allocated bytes exceeds the native allocation watermark, the
229      * function requests a concurrent GC. If the native bytes allocated exceeds a second higher
230      * watermark, it is determined that the application is registering native allocations at an
231      * unusually high rate and a GC is performed inside of the function to prevent memory usage
232      * from excessively increasing.
233      */
registerNativeAllocation(int bytes)234     public native void registerNativeAllocation(int bytes);
235 
236     /**
237      * Registers a native free by reducing the number of native bytes accounted for.
238      */
registerNativeFree(int bytes)239     public native void registerNativeFree(int bytes);
240 
241     /**
242      * Fill in dex caches with classes, fields, and methods that are already loaded.
243      */
preloadDexCaches()244     public native void preloadDexCaches();
245 }
246