Mercurial > hg > truffle
view agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaVM.java @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | c18cbe5936b8 |
children |
line wrap: on
line source
/* * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ package sun.jvm.hotspot.utilities.soql; import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; public class JSJavaVM extends DefaultScriptObject { private static final int FIELD_ADDRESS_SIZE = 0; private static final int FIELD_BUILD_INFO = 1; private static final int FIELD_CPU = 2; private static final int FIELD_FLAGS = 3; private static final int FIELD_HEAP = 4; private static final int FIELD_OS = 5; private static final int FIELD_SYS_PROPS = 6; private static final int FIELD_THREADS = 7; private static final int FIELD_TYPE = 8; private static final int FIELD_VERSION = 9; private static final int FIELD_CLASS_PATH = 10; private static final int FIELD_BOOT_CLASS_PATH = 11; private static final int FIELD_USER_DIR = 12; private static final int FIELD_UNDEFINED = -1; public JSJavaVM(JSJavaFactory factory) { this.factory = factory; this.vm = VM.getVM(); } public Object get(String name) { int fieldID = getFieldID(name); switch (fieldID) { case FIELD_ADDRESS_SIZE: return new Long(getVMBit()); case FIELD_BUILD_INFO: return vm.getVMInternalInfo(); case FIELD_CPU: return vm.getCPU(); case FIELD_FLAGS: return getFlags(); case FIELD_HEAP: return getHeap(); case FIELD_OS: return vm.getOS(); case FIELD_SYS_PROPS: return getSysProps(); case FIELD_THREADS: return getThreads(); case FIELD_TYPE: return getType(); case FIELD_VERSION: return vm.getVMRelease(); case FIELD_CLASS_PATH: return getClassPath(); case FIELD_BOOT_CLASS_PATH: return getBootClassPath(); case FIELD_USER_DIR: return getUserDir(); case FIELD_UNDEFINED: default: return super.get(name); } } public Object[] getIds() { Object[] superIds = super.getIds(); Object[] tmp = fields.keySet().toArray(); Object[] res = new Object[superIds.length + tmp.length]; System.arraycopy(tmp, 0, res, 0, tmp.length); System.arraycopy(superIds, 0, res, tmp.length, superIds.length); return res; } public boolean has(String name) { if (getFieldID(name) != FIELD_UNDEFINED) { return true; } else { return super.has(name); } } public void put(String name, Object value) { if (getFieldID(name) == FIELD_UNDEFINED) { super.put(name, value); } } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("Java Hotspot "); buf.append(getType()); buf.append(' '); buf.append(getVMBit()); buf.append(" bit VM (build "); buf.append(vm.getVMRelease()); buf.append(")"); return buf.toString(); } //-- Internals only below this point private static Map fields = new HashMap(); private static void addField(String name, int fieldId) { fields.put(name, new Integer(fieldId)); } private static int getFieldID(String name) { Integer res = (Integer) fields.get(name); return (res != null)? res.intValue() : FIELD_UNDEFINED; } static { addField("addressSize", FIELD_ADDRESS_SIZE); addField("buildInfo", FIELD_BUILD_INFO); addField("cpu", FIELD_CPU); addField("flags", FIELD_FLAGS); addField("heap", FIELD_HEAP); addField("os", FIELD_OS); addField("sysProps", FIELD_SYS_PROPS); addField("threads", FIELD_THREADS); addField("type", FIELD_TYPE); addField("version", FIELD_VERSION); addField("classPath", FIELD_CLASS_PATH); addField("bootClassPath", FIELD_BOOT_CLASS_PATH); addField("userDir", FIELD_USER_DIR); } private long getVMBit() { // address size in bits return vm.getAddressSize() * 8; } private synchronized JSMap getFlags() { if (flagsCache == null) { VM.Flag[] flags = vm.getCommandLineFlags(); Map map = new HashMap(); if (flags != null) { for (int f = 0; f < flags.length; f++) { VM.Flag flag = flags[f]; map.put(flag.getName(), flag.getValue()); } } flagsCache = factory.newJSMap(map); } return flagsCache; } private synchronized JSJavaHeap getHeap() { if (heapCache == null) { heapCache = factory.newJSJavaHeap(); } return heapCache; } private synchronized JSMap getSysProps() { if (sysPropsCache == null) { Properties props = vm.getSystemProperties(); Map map = new HashMap(); if (props != null) { Enumeration e = props.propertyNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); map.put(key, props.getProperty(key)); } } sysPropsCache = factory.newJSMap(map); } return sysPropsCache; } private synchronized JSList getThreads() { if (threadsCache == null) { List threads = new ArrayList(0); threadsCache = factory.newJSList(threads); JavaThread jthread = vm.getThreads().first(); while (jthread != null) { threads.add(jthread); jthread = jthread.next(); } } return threadsCache; } private String getType() { if (vm.isClientCompiler()) { return "Client"; } else if (vm.isServerCompiler()) { return "Server"; } else { return "Core"; } } private String getClassPath() { return vm.getSystemProperty("java.class.path"); } private String getBootClassPath() { return vm.getSystemProperty("sun.boot.class.path"); } private String getUserDir() { return vm.getSystemProperty("user.dir"); } private JSMap flagsCache; private JSJavaHeap heapCache; private JSMap sysPropsCache; private JSList threadsCache; private final JSJavaFactory factory; private final VM vm; }