一尘不染

Tomcat的内存消耗大于堆+ permgen空间

tomcat

我发现OS所说的与jVisualVM所说的在Tomcat RAM消耗方面不匹配。

从htop来看,Tomcat JVM具有 993 MB 的常驻内存

从jVisualVM,Tomcat JVM正在使用

  • 堆最大:1,070,399,488 B
  • 堆大小: 298.438.656 B
  • 使用的堆:变量,介于170MB和270MB之间
  • PermGen最大值:268,435,456 B
  • 彼尔姆·Gen 大小: 248,872,960 B
  • 使用的PermGen:略有变化,大约150MB

据我了解,操作系统内存消耗应为堆大小+ PermGen大小〜= 522 MB。但这比我观察到的 471 MB

有人知道我在这里想念什么吗?

PS:我知道我的最大堆比使用的堆大得多,但是我假设如果JVM不使用它(即堆大小较小),那将不起作用。

谢谢!渣


阅读 267

收藏
2020-06-16

共1个答案

一尘不染

据我了解,操作系统内存消耗应为堆大小+ PermGen大小〜= 522 MB。但这比我观察到的少了471 MB。有人知道我在这里想念什么吗?

如果我理解这个问题,那么您将看到的是内存碎片和其他方面的JVM内存开销的组合。我们经常看到生产程序的内存使用量是我们的内存设置所期望的两倍。

内存碎片可能意味着,尽管JVM认为操作系统已为其分配了一定数量的字节,但由于内存子系统的优化,必须增加一定数量的字节。

在JVM开销方面,标准内存配置中不包含许多其他存储区域。这是一个很好的讨论。报价:

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

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