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

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

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

谢谢。

【问题讨论】:

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

标签: java garbage-collection profiling


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多