【问题标题】:Difference betweeen jvm on linux and solaris machineslinux和solaris机器上jvm的区别
【发布时间】:2013-10-23 05:51:56
【问题描述】:

我在 linux 和 solaris 机器上运行 2 个 jboss5.1 服务器,具有类似的 jvm(xms 和 xmx)配置。但是当我检查服务器启动时的内存使用情况时:

  • linux 机器 -- 2.1gb 内存使用 (RES)

  • Solaris 机器 -- 500mb 内存使用量

Linux 上 jboss 进程使用的内存从一开始就超过 1 GB(甚至在任何类加载开始之前)。当我从 linux 进行转储时,它的大小仅为 700 mb 左右。

是什么导致了这种内存差异?

【问题讨论】:

  • 您使用的是什么 JVM(版本、编辑器)?使用了哪些选项,所有这些选项?是否涉及本机库?您使用什么命令来测量内存使用情况?两个操作系统上的pmap -x java_pid 是什么意思?

标签: java linux jboss solaris


【解决方案1】:

很多事情都会有所作为,但这里没有足够的信息来了解是什么。例如,它们是 64 位操作系统还是 64 位 JVM? malloc 的行为怎么样 - 这取决于操作系统。仅仅因为一个进程请求 N 字节的内存并不意味着它会立即获得那么多内存——内存分配器可以非常聪明。然后是一个问题,就操作系统如何报告它而言,它是否实际上是一个苹果对苹果的测量。

“内存使用”意味着很多东西。我们是在谈论 Java 堆(如果您在启动后获取两个 VM 的堆转储以及相同的启动位工作,它们的大小是相同还是不同?),还是加上类数据等?图片中还有热点,将 Java 字节码编译为本机代码,这在两个操作系统之间会有所不同(如果您的 Solaris 机器是 Sparc 机器,大小可能会有很大差异)

最有可能的是 64 位与 32 位,但无法说。您可以在每个上使用一些本机分析工具来查看哪些调用正在分配内存 - 这将开始澄清事情。

除非它引起了问题,否则可能不必担心 - 但健康的好奇心是一件好事。

【讨论】:

  • 尝试使用 32 位和 64 位,但结果相同。 JProfiler 和转储(内存分析器)没有显示两者之间的任何差异。问题是 linux 机器应用程序出现 OutOfMemory 即使我们可以看到内存使用率很高但仍然小于我们的最大堆大小,即 3GB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多