Java正在分配额外的2GB内存

时间:2012-03-12 07:32:12

标签: java memory virtual-machine

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

java -Xmx512M -jar program.jar

在我们的旧VPS上,您可以使用'top'命令查看正在使用的虚拟和驻留内存量。它会使用600-700mb的虚拟内存。现在在我们的新VPS上,使用相同的命令,虚拟内存似乎总是比-Xmx值多出约2GB。因此,虚拟内存大约在600-700mb左右,而不是2700-3000mb。

旧版VPS正在运行CentOS 5.7,新版本正在运行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命令行中指定的多。我在质疑为什么它比以前使用的更多。

2 个答案:

答案 0 :(得分:4)

堆不是唯一消耗虚拟内存的东西。虚拟内存是应用程序具有的地址空间量,而不是它使用的内存量(驻留程序是更好的指示符)

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

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

答案 1 :(得分:1)

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

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