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 垃圾收集 - 如何查找调用时正在运行的方法的主要内容,如果未能解决你的问题,请参考以下文章