2015-06-29 32 views
7

我正在使用JVM Explorer - link to JVM Explorer来剖析我的Spring应用程序。我有关于它的以下问题。为什么堆内存使用率和加载的类数不断增加?

  • 为什么“使用的堆内存”保持应用程序 已启动,并没有收到任何请求,但即使增加? (图1)

  • 为什么即使在垃圾收集之后和接收任何请求之前 '已使用的堆内存'不断增加? (Image2)

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

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

    单击 '运行垃圾收集器' 按钮后。 - enlarge image

enter image description here

将一些应用程序的请求下无用数据收集过程完成后 - enlarge image

enter image description here

回答

4

为什么 '使用的堆内存' 不断即使在申请后也会增加已经启动并且还没有收到任何请求? (图1)

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

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

为什么即使在垃圾收集之后,接收到任何请求之前'已使用的堆内存'不断增加? (Image2)

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

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

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

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

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

为什么它只是增加几乎所有东西(堆,加载类的数量)? (Image3)

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

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

注意:调整Java程序以避免产生垃圾并且我会说大多数程序库只会在导致已知性能问题时尝试减少垃圾,这很难。

+0

感谢您的回答,我尝试使用VisualVM,但无法管理运行它。哪个分析器最适合与Eclipse集成?我的问题是与VisualVM是在这里http://stackoverflow.com/questions/31064849/visualvm-is-unable-to-profile-a-web-application-on-eclipse –

+0

@DanielNewton我会说,日食和视觉vm是我遇到的第三个最喜欢的IDE和分析器。当我用yourkit使用intellij时,我没有遇到任何问题。 –

+0

我看飞行记录器怎么样? –

1

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

内存主要是指使用,不要被幸免。它很容易成为你的应用程序写得很好的情况:它可以使用一个小内存,它可以重新创建所需的所有内容,但它也可以有效地利用这个事实,即你的系统有很多内存和应用程序使用所有可能的内存更有效地工作。

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

如果您没有像OutOfMemoryError这样的问题,您不必担心。你应该保持警惕并进一步检查它,但是你所描述的情况并不是自动的表示有什么错误。

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

相关问题