151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.misc; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport static java.lang.Thread.State.*; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Properties; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Set; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class VM { 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* The following methods used to be native methods that instruct 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the VM to selectively suspend certain threads in low-memory 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * situations. They are inherently dangerous and not implementable 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on native threads. We removed them in JDK 1.2. The skeletons 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * remain so that existing applications that use these methods 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will still work. 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean suspended = false; 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean threadsSuspended() { 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return suspended; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean allowThreadSuspension(ThreadGroup g, boolean b) { 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return g.allowThreadSuspension(b); 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean suspendThreads() { 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski suspended = true; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Causes any suspended threadgroups to be resumed. 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void unsuspendThreads() { 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski suspended = false; 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Causes threadgroups no longer marked suspendable to be resumed. 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void unsuspendSomeThreads() { 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Deprecated fields and methods -- Memory advice not supported in 1.2 */ 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final int STATE_GREEN = 1; 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final int STATE_YELLOW = 2; 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final int STATE_RED = 3; 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final int getState() { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return STATE_GREEN; 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void asChange(int as_old, int as_new) { } 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** @deprecated */ 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void asChange_otherthread(int as_old, int as_new) { } 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Not supported in 1.2 because these will have to be exported as 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JVM functions, and we are not sure we want do that. Leaving 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * here so it can be easily resurrected -- just remove the // 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * comments. 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Resume Java profiling. All profiling data is added to any 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * earlier profiling, unless <code>resetJavaProfiler</code> is 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * called in between. If profiling was not started from the 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * command line, <code>resumeJavaProfiler</code> will start it. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * NOTE: Profiling must be enabled from the command line for a 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.prof report to be automatically generated on exit; if not, 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * writeJavaProfilerReport must be invoked to write a report. 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see resetJavaProfiler 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see writeJavaProfilerReport 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // public native static void resumeJavaProfiler(); 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Suspend Java profiling. 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // public native static void suspendJavaProfiler(); 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initialize Java profiling. Any accumulated profiling 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * information is discarded. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // public native static void resetJavaProfiler(); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Write the current profiling contents to the file "java.prof". 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the file already exists, it will be overwritten. 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // public native static void writeJavaProfilerReport(); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static volatile boolean booted = false; 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Invoked by by System.initializeSystemClass just before returning. 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Subsystems that are invoked during initialization can check this 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // property in order to avoid doing things that should wait until the 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // application class loader has been set up. 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void booted() { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski booted = true; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean isBooted() { 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return booted; 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // A user-settable upper limit on the maximum amount of allocatable direct 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // buffer memory. This value may be changed during VM initialization if 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // "java" is launched with "-XX:MaxDirectMemorySize=<size>". 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The initial value of this field is arbitrary; during JRE initialization 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // it will be reset to the value specified on the command line, if any, 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // otherwise to Runtime.getRuntime.maxDirectMemory(). 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static long directMemory = 64 * 1024 * 1024; 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Returns the maximum amount of allocatable direct buffer memory. 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The directMemory variable is initialized during system initialization 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // in the saveAndRemoveProperties method. 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static long maxDirectMemory() { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return directMemory; 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // User-controllable flag that determines if direct buffers should be page 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // aligned. The "-XX:+PageAlignDirectMemory" option can be used to force 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // buffers, allocated by ByteBuffer.allocateDirect, to be page aligned. 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean pageAlignDirectMemory; 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Returns {@code true} if the direct buffers should be page aligned. This 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // variable is initialized by saveAndRemoveProperties. 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean isDirectMemoryPageAligned() { 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return pageAlignDirectMemory; 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // A user-settable boolean to determine whether ClassLoader.loadClass should 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // accept array syntax. This value may be changed during VM initialization 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // via the system property "sun.lang.ClassLoader.allowArraySyntax". 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The default for 1.5 is "true", array syntax is allowed. In 1.6, the 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // default will be "false". The presence of this system property to 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // control array syntax allows applications the ability to preview this new 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // behaviour. 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean defaultAllowArraySyntax = false; 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean allowArraySyntax = defaultAllowArraySyntax; 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The allowArraySyntax boolean is initialized during system initialization 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // in the saveAndRemoveProperties method. 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // It is initialized based on the value of the system property 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // "sun.lang.ClassLoader.allowArraySyntax". If the system property is not 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // provided, the default for 1.5 is "true". In 1.6, the default will be 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // "false". If the system property is provided, then the value of 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // allowArraySyntax will be equal to "true" if Boolean.parseBoolean() 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // returns "true". Otherwise, the field will be set to "false". 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean allowArraySyntax() { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return allowArraySyntax; 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean allowGetCallerClass = true; 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Reflection.getCallerClass(int) is enabled by default. 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // It can be disabled by setting the system property 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // "jdk.reflect.allowGetCallerClass" to "false". It cannot be 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // disabled if the logging stack walk (to find resource bundles) 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // is enabled. 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static boolean allowGetCallerClass() { 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return allowGetCallerClass; 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the system property of the specified key saved at 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * system initialization time. This method should only be used 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for the system properties that are not changed during runtime. 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * It accesses a private copy of the system properties so 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that user's locking of the system properties object will not 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cause the library to deadlock. 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Note that the saved system properties do not include 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the ones set by sun.misc.Version.init(). 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static String getSavedProperty(String key) { 23946e3649f898305d185fc40bae2542e933a16b619Piotr Jastrzebski // TODO(narayan): Why is this commented out ? 24046e3649f898305d185fc40bae2542e933a16b619Piotr Jastrzebski // if (savedProps.isEmpty()) 24146e3649f898305d185fc40bae2542e933a16b619Piotr Jastrzebski // throw new IllegalStateException("Should be non-empty if initialized"); 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return savedProps.getProperty(key); 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // TODO: the Property Management needs to be refactored and 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the appropriate prop keys need to be accessible to the 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // calling classes to avoid duplication of keys. 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final Properties savedProps = new Properties(); 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Save a private copy of the system properties and remove 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the system properties that are not intended for public access. 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This method can only be invoked during system initialization. 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void saveAndRemoveProperties(Properties props) { 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (booted) 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalStateException("System initialization has completed"); 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski savedProps.putAll(props); 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Set the maximum amount of direct memory. This value is controlled 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // by the vm option -XX:MaxDirectMemorySize=<size>. 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The maximum amount of allocatable direct buffer memory (in bytes) 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // from the system property sun.nio.MaxDirectMemorySize set by the VM. 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The system property will be removed. 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String s = (String)props.remove("sun.nio.MaxDirectMemorySize"); 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (s != null) { 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (s.equals("-1")) { 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // -XX:MaxDirectMemorySize not given, take default 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski directMemory = Runtime.getRuntime().maxMemory(); 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long l = Long.parseLong(s); 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (l > -1) 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski directMemory = l; 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Check if direct buffers should be page aligned 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s = (String)props.remove("sun.nio.PageAlignDirectMemory"); 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ("true".equals(s)) 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pageAlignDirectMemory = true; 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Set a boolean to determine whether ClassLoader.loadClass accepts 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // array syntax. This value is controlled by the system property 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // "sun.lang.ClassLoader.allowArraySyntax". 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s = props.getProperty("sun.lang.ClassLoader.allowArraySyntax"); 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski allowArraySyntax = (s == null 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ? defaultAllowArraySyntax 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski : Boolean.parseBoolean(s)); 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Reflection.getCallerClass(int) is enabled by default. 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // It can be disabled by setting a system property (but only if 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the logging stack walk is not enabled) 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s = props.getProperty("jdk.reflect.allowGetCallerClass"); 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski allowGetCallerClass = (s != null 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ? (s.isEmpty() || Boolean.parseBoolean(s)) 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski : true) || 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Boolean.valueOf(props.getProperty("jdk.logging.allowStackWalkSearch")); 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove other private system properties 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // used by java.lang.Integer.IntegerCache 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski props.remove("java.lang.Integer.IntegerCache.high"); 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // used by java.util.zip.ZipFile 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski props.remove("sun.zip.disableMemoryMapping"); 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // used by sun.launcher.LauncherHelper 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski props.remove("sun.java.launcher.diag"); 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Initialize any miscellenous operating system settings that need to be 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // set for the class libraries. 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void initializeOSEnvironment() { 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Current count of objects pending for finalization */ 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static volatile int finalRefCount = 0; 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Peak count of objects pending for finalization */ 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static volatile int peakFinalRefCount = 0; 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gets the number of objects pending for finalization. 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the number of objects pending for finalization. 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static int getFinalRefCount() { 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return finalRefCount; 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gets the peak number of objects pending for finalization. 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the peak number of objects pending for finalization. 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static int getPeakFinalRefCount() { 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return peakFinalRefCount; 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Add <tt>n</tt> to the objects pending for finalization count. 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param n an integer value to be added to the objects pending 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for finalization count 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static void addFinalRefCount(int n) { 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The caller must hold lock to synchronize the update. 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski finalRefCount += n; 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (finalRefCount > peakFinalRefCount) { 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski peakFinalRefCount = finalRefCount; 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns Thread.State for the given threadStatus 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static Thread.State toThreadState(int threadStatus) { 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((threadStatus & JVMTI_THREAD_STATE_RUNNABLE) != 0) { 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return RUNNABLE; 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((threadStatus & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) { 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return BLOCKED; 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) { 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return WAITING; 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) { 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return TIMED_WAITING; 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((threadStatus & JVMTI_THREAD_STATE_TERMINATED) != 0) { 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return TERMINATED; 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if ((threadStatus & JVMTI_THREAD_STATE_ALIVE) == 0) { 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return NEW; 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return RUNNABLE; 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* The threadStatus field is set by the VM at state transition 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the hotspot implementation. Its value is set according to 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the JVM TI specification GetThreadState function. 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_ALIVE = 0x0001; 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_TERMINATED = 0x0002; 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_RUNNABLE = 0x0004; 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400; 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010; 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020; 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 388