【问题标题】:java eliminating garbage generationjava消除垃圾产生
【发布时间】:2015-05-24 03:07:40
【问题描述】:

假设我们有一个独立工作的 java 任务,并且我们能够使用 visualvm 对其进行监控......并且我们注意到连续的垃圾创建和周期性的 gc 像这样。

我们如何检测到底是什么导致了这个问题

有没有办法查看哪个方法执行产生了垃圾?我们如何看到垃圾是从哪里来的?

是的,我们可以看到究竟是什么对象在分配内存,但这并没有帮助...我相信很多对象后来被创建和垃圾处理,但我不知道发生在哪里以及究竟是什么原因造成的...

我们通常如何做到这一点?使用什么工具?任何有关此主题的链接表示赞赏

注意这里的问题不是 GC 参数优化,而是代码优化,我们想要消除不必要的对象创建,也许使用原语代替等等......

【问题讨论】:

  • 垃圾收集是 Java 应用程序生命周期中完全正常的一部分。为什么特别是它正在发生的事实令人担忧?您要解决的问题是什么?
  • 我已经更新了最后一部分,但是你是对的,我知道任何 jvm 应用程序都应该这样做,但在这种情况下,我们想要优化代码,我们需要检测什么代码创建那些不必要的对象。我只能看到我的应用程序分配了很多 byte[] 和 char[] 但是从什么函数到哪里?这就是问题
  • GC 不是问题,它的频率会导致问题,我想优化代码,以便这个 GC 很少或更多地运行 10 次......是的,我可以阅读整个源代码,但是我想要一个可以分析并告诉我垃圾是在哪里创建的工具...
  • 不要忘记String 对象是由char 数组支持的——您很可能会看到应用程序创建的许多Strings 的支持数组。您可能还会发现,如果您通过第三方应用服务器(例如 JBoss)运行应用程序,那么大量对象实际上是由应用服务器创建和管理的。

标签: java memory-management optimization garbage-collection garbage


【解决方案1】:

最简单的方法是使用 JProfiler 之类的工具并记录分配情况。 “分配热点”视图将显示您的应用程序分配对象的方法。更多详情可查看here

当您无法使用分析器时,另一种方法是进行堆转储并调查其中包含的对象。然后根据这些信息假设它们是用哪种方法实例化的。

【讨论】:

  • 从视觉 vm 我可以看到大部分内存是 byte[] 或 char[] 但它可以是任何地方... jprofiler 是否显示什么方法生成了哪些对象?
  • @Vach 是的 - 你会在分配调用树中看到它。
  • YourKit 可以做同样的事情吗?也许你用过它
  • 是的 - YourKit 完全一样
【解决方案2】:

我建议在 jvisualvm 中安装 VisualGC 插件。它可以让您很好地了解发生的小型和完整 GC 的数量。

如果您正在寻找垃圾回收对象和可能的内存泄漏机会,那么您应该在代码工作流的两个不同实例中检查堆转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2014-07-12
    • 2021-12-31
    • 2016-12-31
    相关资源
    最近更新 更多