java垃圾回收器回调

java垃圾回收器回调,java,performance,garbage-collection,Java,Performance,Garbage Collection,在使用jvisualvm查找性能问题时,我发现我的java应用程序(1000个类)在一个操作期间创建了很多临时对象(比如X),这些对象在操作后符合GC的条件,但只有少数对象(比如Y)是可引用的。 减少临时对象的数量可能会提高性能(创建、删除/GC对象和RAM的CPU周期)。 缺少的信息是正在创建的类型或临时对象。我可以访问代码并尝试找出答案,但这将花费大量时间来跟踪所有代码流 我能想到的另一种方法是让GC在日志中放一条消息,说明释放了哪种类型的对象,这将给我关于可能的罪犯的提示 java GC是

在使用jvisualvm查找性能问题时,我发现我的java应用程序(1000个类)在一个操作期间创建了很多临时对象(比如X),这些对象在操作后符合GC的条件,但只有少数对象(比如Y)是可引用的。 减少临时对象的数量可能会提高性能(创建、删除/GC对象和RAM的CPU周期)。 缺少的信息是正在创建的类型或临时对象。我可以访问代码并尝试找出答案,但这将花费大量时间来跟踪所有代码流

我能想到的另一种方法是让GC在日志中放一条消息,说明释放了哪种类型的对象,这将给我关于可能的罪犯的提示


java GC是否有提供此信息的工具?

您可以覆盖
finalize()
方法()并在那里打印一些信息

当垃圾回收确定不再有对对象的引用时,由垃圾回收器对该对象调用。子类重写finalize方法以处置系统资源或执行其他清理


您可以覆盖
finalize()
方法()并在那里打印一些信息

当垃圾回收确定不再有对对象的引用时,由垃圾回收器对该对象调用。子类重写finalize方法以处置系统资源或执行其他清理


我认为不可能从GC获取每个对象的日志记录或回调,但可以通过JMX以编程方式获取累积的统计信息。这显示了如何从Oracle记录的
GarbageCollectorMXBean
实例获取通知


也许你把香蕉削错了头。您可以监视显示活动对象的内存快照,而不是关注死对象的情况。您可以使用
VisualVM
动态执行此操作,也可以使用
jmap
实用程序保存内存转储。这将为优化内存配置文件提供大量输入。毕竟,您对GC监控有什么期望?所有上升的都必须下降。所有活动对象都将在某个点死亡。检查您的活动对象。

我认为不可能从GC获取每个对象的日志记录或回调,但您可以通过JMX以编程方式获取累积的统计信息。这显示了如何从Oracle记录的
GarbageCollectorMXBean
实例获取通知


也许你把香蕉削错了头。您可以监视显示活动对象的内存快照,而不是关注死对象的情况。您可以使用
VisualVM
动态执行此操作,也可以使用
jmap
实用程序保存内存转储。这将为优化内存配置文件提供大量输入。毕竟,您对GC监控有什么期望?所有上升的都必须下降。所有活动对象都将在某个点死亡。检查您的活动对象。

JDK有一个名为
jmap
的工具,它可以按类报告对象的分布-类直方图。不过,它对活动对象执行此操作

通过获取多类直方图并对其进行比较,可以通过死类构造相似的直方图

我已经自动化了这个过程,您可以使用工具和
hh
命令为堆中的垃圾生成类直方图


你可以找到更多的细节

JDK有一个名为
jmap
的工具,它可以按类-类直方图报告对象的分布。不过,它对活动对象执行此操作

通过获取多类直方图并对其进行比较,可以通过死类构造相似的直方图

我已经自动化了这个过程,您可以使用工具和
hh
命令为堆中的垃圾生成类直方图


你可以找到更多的细节

使用像AppDynamics这样的工具(也有其他的替代方法),这将快速帮助您识别有争议的代码。值得一提的是,Java垃圾收集器非常擅长处理创建了大量非常短暂的对象的情况。使用像AppDynamics这样的工具(也有其他替代方法),这将很快帮助您识别有争议的代码,Java垃圾收集器真的很擅长处理创建了很多非常短命的对象的情况。这似乎只是为了调试,所以我想是可以的。使用终结器会给我提供所需的信息,但我必须为我的所有类添加终结器,我正在寻找快捷方式:)。这似乎只是为了调试,所以我想可以使用终结器提供所需的信息,但我必须为所有类添加终结器,我正在寻找快捷方式:)。我的问题是临时/短期对象的数量太多(~1GB的RAM)而非临时对象的实际数量约为200 MB。这意味着在运行时,应用程序从RAM创建写/读1GB数据,并调用相应的构造函数。提高性能的一个可能方法是不要创建太多临时对象并传递单个对象。我的问题是临时/短期对象的数量太大(大约1GB的RAM),而非临时对象的实际数量约为200 MB。这意味着在运行时,应用程序从RAM创建写/读1GB数据,并调用相应的构造函数。提高性能的一种可能方法是不要创建太多临时对象,而是传递单个对象。