Index: lucene/core/src/java/org/apache/lucene/util/RamUsageEstimator.java =================================================================== --- lucene/core/src/java/org/apache/lucene/util/RamUsageEstimator.java (revision 1499915) +++ lucene/core/src/java/org/apache/lucene/util/RamUsageEstimator.java (working copy) @@ -213,11 +213,7 @@ int objectAlignment = 8; try { final Class beanClazz = Class.forName("com.sun.management.HotSpotDiagnosticMXBean"); - final Object hotSpotBean = ManagementFactory.newPlatformMXBeanProxy( - ManagementFactory.getPlatformMBeanServer(), - "com.sun.management:type=HotSpotDiagnostic", - beanClazz - ); + final Object hotSpotBean = getHotSpotDiagnosticsMXBean(beanClazz); final Method getVMOptionMethod = beanClazz.getMethod("getVMOption", String.class); final Object vmOption = getVMOptionMethod.invoke(hotSpotBean, "ObjectAlignmentInBytes"); objectAlignment = Integer.parseInt( @@ -272,6 +268,33 @@ return supportedFeatures.size() == JvmFeature.values().length; } + /** + * Try to get the diagnostic mxbean without calling {@link ManagementFactory#getPlatformMBeanServer()} + * which starts AWT thread (and shows junk in the dock) on a Mac. + */ + private static Object getHotSpotDiagnosticsMXBean(Class beanClazz) throws Exception { + // Java 7+, HotSpot + try { + return ManagementFactory.class.getMethod("getPlatformMXBean", Class.class).invoke(null, beanClazz); + } catch (Exception e) { + // ignore. + } + + // Java 6, HotSpot + try { + Class sunMF = Class.forName("sun.management.ManagementFactory"); + return sunMF.getMethod("getDiagnosticMXBean").invoke(null); + } catch (Exception e) { + // Ignore. + } + + // Last resort option is an attempt to get it from ManagementFactory's server anyway. + final Object hotSpotBean = ManagementFactory.newPlatformMXBeanProxy( + ManagementFactory.getPlatformMBeanServer(), + "com.sun.management:type=HotSpotDiagnostic", beanClazz); + return hotSpotBean; + } + /** * Aligns an object size to be the next multiple of {@link #NUM_BYTES_OBJECT_ALIGNMENT}. */