2013-04-17 206 views
8

我在Java中有一个对性能非常敏感的应用程序。 (我知道我实际上应该使用C或其他东西,但它现在是Java)。我试图避免创建和扔掉对象。现在我需要知道还有多少垃圾正在收集。Java垃圾收集时间?

我如何知道?

如果可能,我想有一个以毫秒或纳秒为单位的数字,它不需要安装更多的软件。

+0

刚抬起头C不比Java更好 - 这取决于你如何比较它们。 [这是一个很好的比较我发现](http://www.azulsystems.com/blog/cliff/2009-09-06-java-vs-c-performanceagain),底线是C比Java更好内存占用和数字密集型程序,而Java具有更好的多线程支持。我几年前阅读的一篇研究论文发现(如果让Java的堆增长到C堆的4倍),许多Sourceforge程序在两种语言之间没有性能差异。 –

+0

[为低延迟调优垃圾回收](http://stackoverflow.com/questions/2781797/tuning-garbage-collections-for-low-latency) –

回答

2

您可以使用VisualVm,这正是您所需要的。
正如你可以看到下面你有GC活动,这是非常有用的:

enter image description here

你身边有很多细节有GC的活动,如:堆使用,CPU使用率,对象实例的使用等

7

您可以使用像VisualVM这样的工具来监视应用程序活动。确保你使用适当的GC算法。

甲骨文JVM提供了多种类型的垃圾收集器的:

  • 吞吐量集电极
  • 并发低暂停集电极
  • 增量(有时称为列车)低暂停集电极:

阅读更多关于这些收藏家here

+0

+1关于垃圾回收类型的不错建议:) – Stephan

+2

+1注意:对于低GC程序,VisualVM将创建比应用程序更多的垃圾。为此我使用YourKit,这不是免费的。我会从VisualVM开始。 –

+0

VisualVM还有一个名为VisualGC的插件,可以实时显示每个堆空间正在发生的情况。 https://blogs.oracle.com/klc/entry/visualgc_plugin_for_visualvm – Aaron

1

Jprofiler,它启用两个内存配置文件来评估内存使用情况和动态分配泄漏以及CPU分析以评估线程冲突。

7

或者你可以让JVM打印GC活动。这些设置,我有:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -Xloggc:logs/gc.log 

GC活动打印到文件日志/ gc.log ..