Java垃圾回收时间?

10

我有一个非常注重性能的Java应用程序。(我知道我应该使用C或其他语言。但现在是Java.) 我正在尝试避免创建和丢弃对象。现在我需要知道垃圾收集仍在进行多少次。

我该如何找出?

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


提醒一下,C并非完全优于Java——这取决于你如何比较它们。我找到了一个好的比较,结论是对于内存占用和数值密集型程序来说,C比Java更好,而Java则具有更好的多线程支持。几年前我看过一篇研究论文发现(如果你让Java的堆增长到4倍于C堆的大小),在许多Sourceforge程序中两种语言的性能没有差异。 - Zim-Zam O'Pootertoot
可能是 调整垃圾回收以实现低延迟 的重复问题。 - Jacob Schoen
4个回答

9

或者你可以让JVM打印GC活动。我使用的设置如下:

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

GC活动将被记录到一个文件logs/gc.log中。


7
你可以使用类似于VisualVM的工具来监控应用程序活动。确保您正在使用适当的GC算法。
Oracle JVM提供了多种类型的垃圾收集器:
  • 吞吐量收集器
  • 并发低暂停收集器
  • 增量(有时称为火车)低暂停收集器:
这里阅读更多关于这些收集器的信息。

2
注意:对于低GC程序,VisualVM会比您的应用程序创建更多的垃圾。因此我使用的是不免费的YourKit。我建议先从VisualVM开始。 - Peter Lawrey
还有一个名为VisualGC的VisualVM插件,可以实时显示每个堆空间正在发生的情况。https://blogs.oracle.com/klc/entry/visualgc_plugin_for_visualvm - Aaron

2
你可以使用VisualVm来实现这一点,它正是你所需要的。
如下图所示,你可以看到非常有用的GC活动:

enter image description here

除了GC活动之外,你还有很多细节信息,例如:堆使用情况、CPU使用情况、对象实例使用情况等。


1

Jprofiler,它可以同时启用内存分析以评估内存使用情况和动态分配泄漏,以及CPU分析以评估线程冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接