为什么堆内存使用和加载数量 类 不断增加?

Why do heap memory usage and number of loaded classes keep increasing?

我正在使用 JVM Explorer - link to JVM Explorer 来分析我的 Spring 应用程序。我有以下问题。

在垃圾收集过程完成后向应用程序发送一些请求后 - enlarge image

Why 'Used Heap Memory' keeps increasing even after the application has started up and have not received any requests yet? (Image 1)

您的 JVM 中的某些东西正在创建对象。您将需要一个内存分析器来查看正在执行的操作。它可以是 Swing、yoru 应用程序或其他库的一部分。

顺便说一句,大多数分析工具使用处理大量垃圾的 JMX。例如当我在我的某些应用程序上 运行 FlightRecorder 或 VisualVM 时,它显示 JMX 监控正在产生大部分垃圾。

Why even after garbage collection and before receiving any requests 'Used Heap Memory' keeps increasing? (Image2)

无论是在创建对象还是在创建对象。

Why after garbage collection, by sending some requests to the application number of loaded classes is increasing?

类 是延迟加载的。有些 类 在您做某事之前不需要。

Is not the application supposed to use previous classes?

是的,但这并不意味着它不需要更多 类。

why is it just increasing almost everything (heap, number of loaded classes)? (Image3)

您的应用程序正在做更多的工作。

如果你不想知道应用程序在做什么,我建议使用内存分析器,如 VisualVM 或 Flight Recorder。我使用 YourKit 来解决这类问题。

注意:调整 Java 程序以使其不产生垃圾需要付出艰苦的努力,我想说大多数库只会在它导致已知的性能问题时才尝试减少垃圾。

我喜欢@PeterLawrey 的好答案,但是那里缺少这个:

内存主要用于使用,而不是备用可能您的应用程序编写得很好:它可以使用小内存工作,并且可以重新创建它需要的所有内容,但它也可以有效地利用以下事实:您的系统有很多内存,应用程序使用所有可能的内存来更有效地工作。

我很容易想象,不断占用内存的东西是例如缓存。如果缓存包含大量数据,应用程序运行速度更快。

如果您没有OutOfMemoryError这样的问题,您就不必担心。您还是应该提高警惕,进一步检查,但您描述的情况并不自动表示有问题。

类似于Windows用户不断的感叹"I have bought more memory but my Windows uses it all up"——内存在用就好了!这就是我们购买它的目的!