1 /*
   2  * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.debug;
  24 
  25 import static java.lang.Thread.currentThread;
  26 
  27 import java.lang.management.ManagementFactory;
  28 import java.lang.management.ThreadInfo;
  29 import java.lang.management.ThreadMXBean;
  30 
  31 import javax.management.ObjectName;
  32 
  33 public class Management {
  34 
  35     private static final com.sun.management.ThreadMXBean threadMXBean = Management.initThreadMXBean();
  36 
  37     /**
  38      * The amount of memory allocated by
  39      * {@link com.sun.management.ThreadMXBean#getThreadAllocatedBytes(long)} itself.
  40      */
  41     private static final long threadMXBeanOverhead = -getCurrentThreadAllocatedBytes() + getCurrentThreadAllocatedBytes();
  42 
  43     public static long getCurrentThreadAllocatedBytes() {
  44         return threadMXBean.getThreadAllocatedBytes(currentThread().getId()) - threadMXBeanOverhead;
  45     }
  46 
  47     private static com.sun.management.ThreadMXBean initThreadMXBean() {
  48         try {
  49             return (com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
  50         } catch (Error err) {
  51             return new UnimplementedBean();
  52         }
  53     }
  54 
  55     public static ThreadMXBean getThreadMXBean() {
  56         return threadMXBean;
  57     }
  58 
  59     private static class UnimplementedBean implements ThreadMXBean, com.sun.management.ThreadMXBean {
  60 
  61         @Override
  62         public ObjectName getObjectName() {
  63             return null;
  64         }
  65 
  66         @Override
  67         public long getThreadAllocatedBytes(long arg0) {
  68             return 0;
  69         }
  70 
  71         @Override
  72         public long[] getThreadAllocatedBytes(long[] arg0) {
  73             return null;
  74         }
  75 
  76         @Override
  77         public long[] getThreadCpuTime(long[] arg0) {
  78             return null;
  79         }
  80 
  81         @Override
  82         public long[] getThreadUserTime(long[] arg0) {
  83             return null;
  84         }
  85 
  86         @Override
  87         public boolean isThreadAllocatedMemoryEnabled() {
  88             return false;
  89         }
  90 
  91         @Override
  92         public boolean isThreadAllocatedMemorySupported() {
  93             return false;
  94         }
  95 
  96         @Override
  97         public void setThreadAllocatedMemoryEnabled(boolean arg0) {
  98         }
  99 
 100         @Override
 101         public int getThreadCount() {
 102             return 0;
 103         }
 104 
 105         @Override
 106         public int getPeakThreadCount() {
 107             return 0;
 108         }
 109 
 110         @Override
 111         public long getTotalStartedThreadCount() {
 112             return 0;
 113         }
 114 
 115         @Override
 116         public int getDaemonThreadCount() {
 117             return 0;
 118         }
 119 
 120         @Override
 121         public long[] getAllThreadIds() {
 122             return null;
 123         }
 124 
 125         @Override
 126         public ThreadInfo getThreadInfo(long id) {
 127             return null;
 128         }
 129 
 130         @Override
 131         public ThreadInfo[] getThreadInfo(long[] ids) {
 132             return null;
 133         }
 134 
 135         @Override
 136         public ThreadInfo getThreadInfo(long id, int maxDepth) {
 137             return null;
 138         }
 139 
 140         @Override
 141         public ThreadInfo[] getThreadInfo(long[] ids, int maxDepth) {
 142             return null;
 143         }
 144 
 145         @Override
 146         public boolean isThreadContentionMonitoringSupported() {
 147             return false;
 148         }
 149 
 150         @Override
 151         public boolean isThreadContentionMonitoringEnabled() {
 152             return false;
 153         }
 154 
 155         @Override
 156         public void setThreadContentionMonitoringEnabled(boolean enable) {
 157         }
 158 
 159         @Override
 160         public long getCurrentThreadCpuTime() {
 161             return 0;
 162         }
 163 
 164         @Override
 165         public long getCurrentThreadUserTime() {
 166             return 0;
 167         }
 168 
 169         @Override
 170         public long getThreadCpuTime(long id) {
 171             return 0;
 172         }
 173 
 174         @Override
 175         public long getThreadUserTime(long id) {
 176             return 0;
 177         }
 178 
 179         @Override
 180         public boolean isThreadCpuTimeSupported() {
 181             return false;
 182         }
 183 
 184         @Override
 185         public boolean isCurrentThreadCpuTimeSupported() {
 186             return false;
 187         }
 188 
 189         @Override
 190         public boolean isThreadCpuTimeEnabled() {
 191             return false;
 192         }
 193 
 194         @Override
 195         public void setThreadCpuTimeEnabled(boolean enable) {
 196         }
 197 
 198         @Override
 199         public long[] findMonitorDeadlockedThreads() {
 200             return null;
 201         }
 202 
 203         @Override
 204         public void resetPeakThreadCount() {
 205         }
 206 
 207         @Override
 208         public long[] findDeadlockedThreads() {
 209             return null;
 210         }
 211 
 212         @Override
 213         public boolean isObjectMonitorUsageSupported() {
 214             return false;
 215         }
 216 
 217         @Override
 218         public boolean isSynchronizerUsageSupported() {
 219             return false;
 220         }
 221 
 222         @Override
 223         public ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers) {
 224             return null;
 225         }
 226 
 227         @Override
 228         public ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers) {
 229             return null;
 230         }
 231     }
 232 }