代码之家  ›  专栏  ›  技术社区  ›  Luan Kevin Ferreira

如何以编程方式获取GC类直方图

  •  3
  • Luan Kevin Ferreira  · 技术社区  · 6 年前

    我希望以编程方式获得以下命令的相同结果:

    jcmd <pid> GC.class_histogram | grep 'sun.util'
    
     728:            27           2592  sun.util.calendar.Gregorian$Date
     800:            44           2112  sun.util.locale.LocaleObjectCache$CacheEntry
     816:            36           2016  sun.util.calendar.ZoneInfo
    1169:            22            880  sun.util.locale.BaseLocale$Key
    

    ...

    我已经搜索了很多答案,但没有一个答案是明确的,我想做什么就做什么,有什么办法吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Luan Kevin Ferreira    6 年前

    以下代码显示相同的结果:

    import javax.management.MBeanException;
    import javax.management.ReflectionException;
    
    import com.sun.management.DiagnosticCommandMBean;
    
    import sun.management.ManagementFactoryHelper;
    
    @SuppressWarnings("restriction")
    public class ClassHistogram {
    
        public static void main(String[] args) throws MBeanException, ReflectionException {
            DiagnosticCommandMBean dcmd = ManagementFactoryHelper.getDiagnosticCommandMBean();
    
            String[] emptyStringArgs = {};
            Object[] dcmdArgs = { emptyStringArgs };
            String[] signature = { String[].class.getName() };
            System.out.println(dcmd.invoke("gcClassHistogram", dcmdArgs, signature));
        }
    
    }
    

    参考可用命令: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

        2
  •  1
  •   the8472    6 年前

    这个 jcmd manpage 涵盖了这一点。

    要从远程计算机或使用不同标识符调用诊断命令,可以使用com。太阳经营DiagnosticCommandMBean接口。有关DiagnosticCommandMBean接口的更多信息,请参阅 http://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean.html