Tomcat内存消耗超过堆+ permgen空间

Mar*_*arc 13 java memory tomcat jvm

我观察到操作系统所说的内容与jVisualVM所说的内容之间的Tomcat RAM消耗不匹配.

从htop开始,Tomcat JVM拥有993 MB的驻留内存

从jVisualVM,Tomcat JVM正在使用

  • 堆最大值:1,070,399,488 B
  • 堆大小:298.438.656 B.
  • 堆使用:可变,介于170MB和270MB之间
  • PermGen Max:268,435,456 B
  • PermGen尺寸:248,872,960 B
  • PermGen使用:略有变化,约150MB

根据我的理解,操作系统内存消耗应该是堆大小+ PermGen大小〜= 522 MB.但这比我观察到的要少471 MB.

任何人都知道我在这里错过了什么?

PS:我知道我的最大堆远远高于使用的,但我认为如果JVM不使用它(即堆大小较低)应该没有效果.

谢谢!渣

Gra*_*ray 5

根据我的理解,操作系统内存消耗应该是堆大小+ PermGen大小〜= 522 MB.但这比我观察到的要少471 MB.任何人都知道我在这里错过了什么?

如果我理解你所看到的问题是内存碎片和其他领域的JVM内存开销的组合.我们经常看到生产程序的内存使用量是我们从内存设置中看到的2倍.

内存碎片可能意味着虽然JVM认为操作系统已经为其提供了一定数量的字节,但由于内存子系统的优化,必须给出一定的额外字节数.

就JVM开销而言,标准内存配置中还包含许多其他存储区域.这是一个很好的讨论.报价:

以下是不属于垃圾收集堆的事物的示例,但它们是进程所需的内存的一部分:

  • 用于实现JVM的代码
  • 实现JVM的数据结构的C手动堆
  • 系统中所有线程的堆栈(app + JVM)
  • 缓存的Java字节码(用于库和应用程序)
  • JITed机器代码(用于库和应用程序)
  • 所有已加载类的静态变量