Java 垃圾收集 - 如何查找调用时正在运行的方法

Posted

技术标签:

【中文标题】Java 垃圾收集 - 如何查找调用时正在运行的方法【英文标题】:Java Garbage Collection - How to find what method was running when it was called 【发布时间】:2010-09-01 19:26:40 【问题描述】:

假设我正在执行垃圾收集未并行运行的 jvm。那是当 GC 执行时,我的主线程停止了。

有没有一种方法可以指定在调用 GC 的当前时刻正在运行什么方法?我知道我可以获得有关时间的信息,但这还不够。 我认为这样的分析信息对于 JVM 来说很容易提供,因为它只是返回一个暂停线程的每个堆栈的最顶层元素(堆栈帧)的问题。

谢谢。

【问题讨论】:

您对哪种集合(eden、survivor scavenge、tenured、full GC)感兴趣?在现代 Sun JVM 的默认配置下,eden 可以非常频繁地被收集(如果正在创建许多对象,则很容易每秒几次),但在某些程序的整个生命周期中可能不会有一次完整的 GC。 【参考方案1】:

我认为您希望确保垃圾收集不会影响您的基准测试。 一些想法:

    垃圾收集是您软件的一部分,它始终会影响您的软件,因此它应该在您的基准测试中体现出来。 多次测量您的函数并忽略最慢的 3% 结果。 在启动计时器之前调用 System.gc()。

【讨论】:

【参考方案2】:

一般不会。 如果你可以,那么它是供应商特定的扩展。

问题是,你为什么想知道?

【讨论】:

我目前正在做一些基准测试。我想看看在基准方法执行时是否调用了 GC。【参考方案3】:

如果您授予对 JMX 的访问权限,您可以看到内存消耗,并且在出现峰值的地方也会进行垃圾收集。

查看正在运行的方法并不精确,但从堆栈顶部您总是可以得到 String.equals() 而一无所知。

【讨论】:

以上是关于Java 垃圾收集 - 如何查找调用时正在运行的方法的主要内容,如果未能解决你的问题,请参考以下文章

java垃圾回收

java垃圾回收

Java垃圾收集机制

java中是怎样进行垃圾回收的?

了解java垃圾收集中的足迹测量

标记为垃圾收集vs符合java中的垃圾收集条件