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

标签 java spring spring-mvc memory profiling

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

  • 为什么“Used Heap Memory”在应用程序结束后仍持续增加 已启动但尚未收到任何请求? (图一)

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

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

    应用程序启动后 - enlarge image enter image description here

    点击“运行垃圾收集器”按钮后。 - enlarge image

enter image description here

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

enter image description here

最佳答案

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?

类是延迟加载的。在你做某事之前,有些类(class)是不需要的。

Is not the application supposed to use previous classes?

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

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

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

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

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

关于java - 为什么堆内存使用量和加载类的数量不断增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31108772/

相关文章:

java - 使用 getServletConfig().getServletContext().getAttribute() (Java) 时获取 NPE

java - Spring 更改 URI 上的媒体类型并以 .au 结尾

java - 无法实例化 UriInfo 指定的类是接口(interface)

java - Spring中的自动缓存失效

java - view.properties 在我的项目 spring mvc jasperreports 中的位置

java - 声明为 Final 的经典变量是否包含与非 Final 变量不同的内存段?

java - 如何在 NetBeans 中使用 Tess4j

java - 读取文本文件时收到来自 Eclipse 的错误

spring - NoClassDefFoundError(javax/ws/rs/ProcessingException) 在 spring 服务中使用 Jersey lib

java - Spring Rest Hibernate 创建嵌套对象