我在 linux 和 solaris 机器上运行 2 个 jboss5.1 服务器,具有类似的 jvm(xms 和 xmx)配置。但是当我检查服务器启动时的内存使用情况时:
linux 机器 -- 2.1gb 内存使用 (RES)
Solaris 机器——500mb 内存使用
linux 上 jboss 进程使用的内存从一开始就超过 1 GB(甚至在任何类加载开始之前)。当我从 linux 进行转储时,它的大小仅为 700 mb 左右。
是什么导致了这样的记忆差异?
很多事情都可能有所作为,这里没有足够的信息来知道是什么。例如,它们是 64 位操作系统还是 64 位 JVM?malloc 的行为怎么样 - 这取决于操作系统。仅仅因为一个进程请求 N 字节的内存并不意味着它会立即获得那么多内存——内存分配器可以非常聪明。然后是一个问题,就操作系统如何报告它而言,它是否实际上是一个苹果对苹果的测量。
“内存使用”意味着很多东西。我们是在谈论 Java 堆(如果您在启动后获取两个 VM 的堆转储以及相同的启动位工作,它们的大小是相同还是不同?),还是加上类数据等?图片中还有热点,将 Java 字节码编译为本机代码,这在两个操作系统之间会有所不同(如果您的 Solaris 机器是 Sparc 机器,大小可能会有很大差异)
最有可能的是 64 位与 32 位,但不可能说。您可以在每个上使用一些本机分析工具来查看哪些调用正在分配内存 - 这将开始澄清事情。
除非它引起了问题,否则可能不必担心——但健康的好奇心是一件好事。