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

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

>为什么’使用堆内存’即使在应用程序之后也会不断增加
已启动并尚未收到任何请求? (图1)
>为什么即使在垃圾收集之后和收到任何请求之前
‘二手堆内存’不断增加? (图像2)
>为什么在垃圾收集之后,通过向应用程序发送一些请求,加载类的数量正在增加?应用程序不应该使用以前的类吗?为什么它只是增加几乎所有东西(堆,加载类的数量)? (图像3)

申请开始后 – enlarge image

单击“运行垃圾收集器”按钮后. – enlarge image

在完成垃圾收集程序 – 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应用程序或其他库的一部分.

BTW大多数分析工具使用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程序需要付出艰苦的努力,这样才不会产生垃圾,我会说大多数库只会在导致已知性能问题的情况下尝试减少垃圾.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...