java 消除垃圾产生

java eliminating garbage generation

假设我们有 java 个独立工作的任务,我们可以使用 visualvm 监控它...我们注意到持续的垃圾创建和周期性的 gc,就像这样。

我们如何检测导致此问题的确切原因

有没有办法查看哪个方法执行产生了垃圾?我们怎么知道垃圾来自哪里?

是的,我们可以看到究竟是什么对象在分配内存,但这没有帮助...我相信很多对象都是在创建后被丢弃的,但我无法弄清楚发生了什么以及究竟是什么导致了这种情况...

我们通常是怎么做的?使用什么工具?任何关于此主题的链接都值得赞赏

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

最简单的方法是使用JProfiler 之类的工具记录分配情况。 "Allocation HotSpot" 视图将显示您的应用程序分配对象的方法。可以找到更多详细信息 here

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

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

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