Java虚拟机支持多种垃圾收集策略。
这article解释了他们。
现在我想知道我的应用程序正在使用哪种(自动选择的)策略,有没有办法让JVM(版本1.6)打印这些信息?
编辑:JVM检测它是处于客户端还是服务器模式。所以问题是我如何才能看到哪些被发现?
答案 0 :(得分:15)
jmap -heap
打印堆摘要。使用GC算法,堆配置和生成明智的堆使用情况。
http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html
答案 1 :(得分:13)
http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html适用于J2SE 6,并声明默认为Parallel Collector。
我们仅通过设置
在JVM 1.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代表Parallel Scavenging
答案 2 :(得分:8)
把它放在JAVA_OPTS:
中-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
对于 UseSerialGC ,我们将在日志中看到:
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]
对于 UseConcMarkSweepGC ,我们会在日志中看到:
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]
对于 UseParallelGC ,我们将在日志中看到:
30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs]
答案 3 :(得分:5)
正如Joachim已经指出的那样,您所引用的文章描述了Sun的VM提供的VM策略。 VM规范本身并不强制要求特定的GC算法,因此具有例如特定的GC算法是没有意义的。 API中这些的枚举值。
但是,您可以从Management API获取一些信息:
List<GarbageCollectorMXBean> beans =
ManagementFactory.getGarbageCollectorMXBeans();
通过这些bean进行迭代,您可以获取GC的名称(尽管只作为字符串)和内存池的名称,这些名称由不同的GC管理。
答案 4 :(得分:5)
看起来,我们有更方便的方法在运行时定义GC
的版本。总是使用工具,我的建议。
要定义GC版本,我们需要两个JVM附带的工具(放在jdk/bin
目录中):
答案 5 :(得分:1)
您可以编写通过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());
}
}
}
答案 6 :(得分:1)
获得这个的最佳方法是: 转到命令行并输入以下命令。
java -XX:+ PrintCommandLineFlags -version
它会显示结果如:
$scope.extraIds = result.extraIds.map(function (item) {
return item.id;
});