Java 垃圾收集行为怪异

Java 垃圾收集行为怪异,java,performance,memory,garbage-collection,hybris,Java,Performance,Memory,Garbage Collection,Hybris,我刚刚接触到一个项目,他们让我调查服务器(应用程序)为什么会表现得很奇怪。重新启动后,它们的速度非常快(您的应用程序出现内存泄漏 这不是垃圾收集器(GC)问题,而是应用程序中的错误。这意味着一些对象已创建,但未使用GC清理,因为应用程序中仍然存在指向这些对象的引用链接。您应该调查哪些对象未清理,并跟踪它们是如何创建的以及引用保留在哪里的 正如您提到的TomCat,我将首先检查servlet(如果您使用Spring,则检查控制器和服务)对于类属性变量。您是否曾在代码中清空对象?您是否只是继续创建对

我刚刚接触到一个项目,他们让我调查服务器(应用程序)为什么会表现得很奇怪。重新启动后,它们的速度非常快(您的应用程序出现内存泄漏

这不是垃圾收集器(GC)问题,而是应用程序中的错误。这意味着一些对象已创建,但未使用GC清理,因为应用程序中仍然存在指向这些对象的引用链接。您应该调查哪些对象未清理,并跟踪它们是如何创建的以及引用保留在哪里的


正如您提到的TomCat,我将首先检查servlet(如果您使用Spring,则检查控制器和服务)对于类属性变量。

您是否曾在代码中清空对象?您是否只是继续创建对象而不丢弃旧的对象?…不,我们不继续创建对象。但是,我们确实在缓存中保留了很多产品和变体。可能在内存紧张时缓存没有释放对象。因此内存泄漏。(这是一种可能性……)根据图表,您有一个约12GB的已提交堆,而使用的堆甚至没有触及10GB线,因此我看不到任何与垃圾收集相关的问题。实际问题应该是,为什么系统在重载时开始交换,而据报告使用的物理内存仍为约85%。但这不是Java问题…查找内存泄漏的方法是使用内存配置文件和一些堆快照来了解什么类型的对象正在消耗内存。然后反向工作…对。这是正确的方法,但我个人发现,如果我知道要查找的内容并且应用程序具有清晰的结构,则很容易找到错误的代码。如果没有如果你是对的,那么你就可以使用堆快照和相关的东西。我个人使用Oracle VisualVM工具来实现这一点。@Pavlo你是如何计算内存泄漏的?而堆和伊甸园图可能显示内存泄漏的趋势,但不确定。但是,这些图只覆盖了4小时,这还不够。如果没有内存泄漏,那会是什么呢?@Erik我将补充说从应用程序启动到重新启动的图表