Java 如何找到创建垃圾对象的代码

Java 如何找到创建垃圾对象的代码,java,garbage-collection,jvm,heap-memory,Java,Garbage Collection,Jvm,Heap Memory,应用程序正在创建3GB的垃圾对象,这将回收垃圾。创建垃圾及其后续收集的过程每30分钟重复一次。我接受了堆转储,可以识别不可访问的对象,但无法识别创建这些不可访问对象的代码。请让我知道是否有办法在不购买Jprofiler/YourKit的情况下找出导致此问题的代码。您可以随时使用Java飞行记录器和Java任务控制来代替Jprofiler/YourKit。从Oracle JDK 7 Update 40(7u40)版本开始,它就受到支持。除非您的版本低于此版本 您可以尝试获取堆转储并将其提供给内存

应用程序正在创建3GB的垃圾对象,这将回收垃圾。创建垃圾及其后续收集的过程每30分钟重复一次。我接受了堆转储,可以识别不可访问的对象,但无法识别创建这些不可访问对象的代码。请让我知道是否有办法在不购买Jprofiler/YourKit的情况下找出导致此问题的代码。

您可以随时使用Java飞行记录器和Java任务控制来代替Jprofiler/YourKit。从Oracle JDK 7 Update 40(7u40)版本开始,它就受到支持。除非您的版本低于此版本


您可以尝试获取堆转储并将其提供给内存分析工具:
它应该会让你对你拥有的很多东西有一些了解,可能还有它们的来源。

什么似乎是个问题?收集垃圾有什么问题?创建3GB垃圾的过程及其收集每隔30分钟重复一次。记忆图上布满了密密麻麻的群山。我希望这是非常稀疏的,更少的GC频率和更少的垃圾创建。因此,您需要知道代码的哪一部分正在创建垃圾,您知道对象是什么吗?如果您这样做了,请查找创建它们的内容,然后释放引用。GC是Java编程的正常部分。现在,如果你在短时间内保存东西,并且应该缓存它们以避免额外的垃圾,这是你应用程序中的架构决策。我理解这一点,并不担心我保存引用的对象,因为这些是架构决策。找出代码中垃圾的引用,然后进行演绎,这是一个巨大的任务尝试分配探查器。飞行记录器不是商业功能吗?请查看下面URL中的许可部分。我相信没有具体的支票。我记得有一次我用它来评估,试过了。堆转储有助于查找不可访问/垃圾对象,但不查找它们的调用层次结构。JDK 7飞行记录器对我帮助很大。