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 <= 0.0 or >= 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 <size> 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 <size> 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