代码之家  ›  专栏  ›  技术社区  ›  Thirler

如何查看java使用的垃圾收集器

  •  14
  • Thirler  · 技术社区  · 16 年前

    Java虚拟机支持多种垃圾收集策略。

    article

    现在我想知道我的应用程序使用的是哪种(自动选择的)策略,有没有办法让JVM(版本1.6)打印这些信息?

    编辑:JVM检测它是处于客户机模式还是服务器模式。所以真正的问题是,我如何才能看到哪些已经被检测到?

    7 回复  |  直到 16 年前
        1
  •  15
  •   Joachim Sauer    16 年前

    http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html

    我们在JVM1.5上测试了一次,只设置了

    -server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
    

    结果显示

    41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs]
    41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs]
    

    其中PS表示平行扫气

        3
  •  8
  •   intropedro    15 年前

    把这个放在JAVA选项中:

    -XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
    

    对于 我们将在日志中看到:

     7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs]
    

    对于 使用ConcMarkSweepGC 我们将在日志中看到:

     5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.0123210 secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
    

    对于 我们将在日志中看到:

    30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs]
    
        4
  •  6
  •   Lord Nighton    10 年前

    GC 在运行时。我建议,一定要用工具。 为了定义GC版本,我们需要两个JVM附带的工具(放在 jdk/bin

    1. VisualVM -启动它并尝试分析某个进程(例如,您可以分析VisualVM本身)。您的个人资料将显示 PID 过程(参见屏幕截图中的绿色矩形)。
    2. jMap -开始使用此工具 -heap <PID> 选项,并找到一个专用于垃圾收集器类型的字符串(请参见屏幕截图上的粉红色线条)

    enter image description here

        5
  •  5
  •   jarnbjo    16 年前

    正如Joachim已经指出的,您参考的文章描述了Sun的VM提供的VM策略。VM规范本身并不要求特定的GC算法,因此在API中为这些算法设置枚举值是没有意义的。

    但是,您可以从管理API获得一些信息:

    List<GarbageCollectorMXBean> beans = 
        ManagementFactory.getGarbageCollectorMXBeans();
    

    遍历这些bean,您可以得到GC的名称(尽管只是一个字符串)和由不同GC管理的内存池的名称。

        6
  •  2
  •   vikas sharma viky    9 年前

    最好的方法是: 转到命令行并输入以下命令。

    java-XX:+PrintCommandLineFlags-版本

    C:\windows\system32>java -XX:+PrintCommandLineFlags -version
    -XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl
    ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd
    **ividualAllocation -XX:+UseParallelGC**
    java version "1.8.0_66"
    Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
    Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here`
    
        7
  •  1
  •   walkeros    11 年前

    您可以编写通过jmx连接到java进程的简单程序:

    public class PrintJMX {
      public static void main(String[] args) throws Exception {
        String rmiHostname = "localhost";
        String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi";
        JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl);
    
        JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL);
        MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
    
    
        ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*");
    
        for (ObjectName name : mbsc.queryNames(gcName, null)) {
          GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc,
            name.getCanonicalName(),
            GarbageCollectorMXBean.class);
    
          System.out.println(gc.getName());
        }
    
      }
    }