【问题标题】:Java is Allocating Extra 2gb of MemoryJava 正在分配额外的 2gb 内存
【发布时间】:2012-03-28 14:59:39
【问题描述】:

我有一个新的 VPS 来运行我和一些伙伴制作的一些 java 程序。我用这样的一行开始这个过程:

java -Xmx512M -jar program.jar

在我们的旧 VPS 上,您可以使用“top”命令查看正在使用多少虚拟和常驻内存。它将使用 600-700mb 的虚拟内存。现在在我们的新 VPS 上,使用相同的命令,虚拟内存似乎总是比 -Xmx 值多出 ~2gb。因此,虚拟内存不是大约 600-700mb,而是 2700-3000mb。

旧 VPS 运行 CentOS 5.7,新 VPS 运行 CentOS 6.2。两者都运行 JRE 1.7u3 64bit。

为什么会这样,我该如何解决?

编辑:顶部

PID   USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
27645 pyro    20   0 3003m 270m  10m S  5.0  1.7   1:19.18 java -Xmx512M -jar cserver.jar

另一个编辑: 我不质疑为什么虚拟内存使用的内存比 java 命令行中指定的多。我在质疑为什么它的使用量比以前多得多。

【问题讨论】:

  • 使用'ps -ef'检查你的java进程是否确实使用了Xmx512m参数,如果是,用top的输出更新你的问题。
  • 如果驻留大小为270MB且没有分页问题,​​是不是有问题?
  • 如果程序自旧 VPS 以来没有任何更改,并且使用旧 VPS,虚拟内存将仅使用 ~600-700mb,那么是的,似乎有些不对劲。新旧 VPS 运行相同的操作系统和相同的 Java 版本。
  • 操作系统没有变化。 JVM 版本没有变化。申请代码有变化吗?
  • 一个非常相似的线程,得到了很好的答案。 stackoverflow.com/questions/561245/…

标签: java memory virtual-machine


【解决方案1】:

堆并不是唯一消耗虚拟内存的东西。虚拟内存是应用程序拥有的地址空间量而不是它正在使用的内存量(驻留是一个更好的指标)

虚拟内存包括所有线程堆栈空间、直接内存和内存映射文件。

我要检查的第一件事是您的应用程序使用的线程数,线程越多,虚拟内存就越多。

【讨论】:

  • 我知道虚拟内存的事情。我只是好奇为什么它会在这个新的 VPS 上分配这么多内存。两个 VPS 都运行相同版本的 Java (1.7u3) 和相同的操作系统 (CentOS 6.2)。除此之外,该程序自 VPS 切换以来没有任何变化。
  • 如果你运行pmap -x {pid}。通常当人们说什么都没有改变时,这意味着他们不知道有什么改变了,但显然有什么改变了。 ;)
  • 感谢 pmap 命令。显然我被误导了,我的一个朋友告诉我,我们的旧 VPS 实际上是 CentOS 5.7 而不是 6.2。发现“问题”(根本不是问题)与 glibc 2.11 的匿名堆映射有关。
  • 所以这可能是原因。如果这是一个问题或只是误导,它仍在解决。 pmap 应该可以帮助你。默认线程堆栈大小可能要大得多,从而导致保留更多的虚拟内存(这也可能不是问题)
  • 我认为这是问题所在,将旧 vps 的 pmap 与新 vps 的相同进程进行比较,新 vps 显示更多 [anon] 映射,其中每个占用约 64mb 的虚拟。旧 vps 的 pmap 中的少数 [anon] 仅占用约 1mb。由于 64mb 块,我将假设它来自更新的 glibc 版本。 pmap 命令帮助我识别了这一点,谢谢!!
【解决方案2】:

虚拟内存使用量是指使用了多少地址空间,不一定直接转化为 RAM 使用量。堆栈、映射文件(包括二进制文件和库)等都对虚拟内存有贡献,但并不总是对实际使用的 RAM 有贡献。请注意,您的 RES(驻留在 RAM 中)内存使用量仅为 270 MB,相当不错。在 32 位机器上,您可能会遇到地址空间限制,因此如果您接近 2 GB 标记(该值也可能是 1 GB 或 3 GB,具体取决于操作系统),那么虚拟内存是一种稀缺资源。在 64 位系统上,虚拟内存(地址空间)接近于无限,因此,高值本身不需要被视为风险。当然,如果它也与实际的高 RAM 使用率或大量映射文件有关,而您无法找出原因,则值得研究。

当然,JVM 也有一些实际开销(在物理分配的内存中),与垃圾收集器的内务、编译器的工作、本机代码等有关,这也会反映在虚拟内存的使用上。但是由于 RES 和 SHR 的位置不是很高,我想说没有理由恐慌,尤其是如果你是 64 位的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2011-07-11
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多