code: package org.gridkit.jvmtool.stacktrace;
  
  import java.lang.management.ThreadMXBean;
  
  import javax.management.JMX;
  import javax.management.MBeanServerConnection;
  import javax.management.MalformedObjectNameException;
  import javax.management.ObjectName;
  
  /**
   * Additional methods available in modern JVMs.
   *
   * @author Alexey Ragozin (alexey.ragozin@gmail.com)
   */
  public interface ThreadMXBeanEx extends java.lang.management.ThreadMXBean {
  
      public static final ObjectName THREADING_MBEAN = BeanHelper.name("java.lang:type=Threading");
  
      public long[] getThreadCpuTime(long[] ids);
  
      public long[] getThreadUserTime(long[] ids);
  
      public long[] getThreadAllocatedBytes(long[] ids);
  
      public static class BeanHelper {
  
          private static ObjectName name(String name) {
              try {
                  return new ObjectName(name);
              } catch (MalformedObjectNameException e) {
                  throw new RuntimeException(e);
              }
          }
  
          public static ThreadMXBean connectThreadMXBean(MBeanServerConnection mserver) {
              ThreadMXBean bean;
              try {
                  bean = JMX.newMXBeanProxy(mserver, THREADING_MBEAN, ThreadMXBeanEx.class);
              } catch(Exception e) {
                  bean = JMX.newMXBeanProxy(mserver, THREADING_MBEAN, ThreadMXBean.class);
              }
              return bean;
          }
      }
  }
  