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

我正在使用JVM Explorer - 链接到JVM资源管理器,来分析我的Spring应用程序。 我有关于它的以下问题。

  • 为什么即使在应用程序启动并且还没有收到任何请求之后,“使用的堆内存”仍然在不断增加? (图1)

  • 为什么即使在垃圾回收之后,在接收到任何请求之前,“已使用的堆内存”不断增加? (图像2)

  • 为什么在垃圾回收之后,通过向应用程序发送一些请求来加载类的数量正在增加? 应用程序是否应该使用以前的类? 为什么它几乎增加了所有内容(堆,加载类的数量)? (图像3)

    应用程序启动后 - 放大图像 在这里输入图像描述

    点击“运行垃圾收集器”按钮后。 - 放大图像

  • 在这里输入图像描述

    垃圾收集程序完成后向应用程序发送一些请求后 - 放大图像

    在这里输入图像描述


    为什么即使在应用程序启动并且还没有收到任何请求之后,“使用的堆内存”仍然在不断增加? (图1)

    您的JVM中的某些内容正在创建对象。 你需要一个内存分析器来查看正在做什么。 它可能是Swing的一部分,或者yoru应用程序或其他库。

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

    为什么即使在垃圾回收之后,在接收到任何请求之前,“已使用的堆内存”不断增加? (图像2)

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

    为什么在垃圾回收之后,通过向应用程序发送一些请求来加载类的数量正在增加?

    类被延迟加载。 有些课程在你做某事之前不需要。

    应用程序是否应该使用以前的类?

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

    为什么它几乎增加了所有内容(堆,加载类的数量)? (图像3)

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

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

    注意:调整Java程序需要花费很大力气,因此它不会产生垃圾,而且我会说大多数库只会在导致已知性能问题时尝试减少垃圾。


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

    记忆主要是为了被使用,而不是被遗忘。 很容易出现这样的情况:你的应用程序写得很好:它可以用一个小内存工作,并且可以重新创建它所需的所有内容,但它也可以有效地利用你的系统有很多内存和应用程序使用所有可能的内存更有效地工作。

    我可以很容易想象,持续占用内存的东西就是缓存。 如果缓存包含大量数据,则应用程序运行得更快。

    如果你没有像OutOfMemoryError这样的问题,你不必担心。 你应该保持警惕并进一步检查,但你描述的情况并不意味着有什么不对。

    这类似于Windows用户的不断哀叹:“我已经购买了更多的内存,但是我的Windows使用了所有的内存” - 使用内存时效果很好! 这就是我们买它的原因!

    链接地址: http://www.djcxy.com/p/3345.html

    上一篇: Why do heap memory usage and number of loaded classes keep increasing?

    下一篇: Is Go subject to the same subtle memory