【发布时间】: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