我有一个新的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命令行中指定的多。我在质疑为什么它比以前使用的更多。
答案 0 :(得分:4)
堆不是唯一消耗虚拟内存的东西。虚拟内存是应用程序具有的地址空间量,而不是它使用的内存量(驻留程序是更好的指示符)
虚拟内存包括所有线程堆栈空间,直接内存和内存映射文件。
我要检查的第一件事是应用程序使用的线程数,线程越多,虚拟内存越多。
答案 1 :(得分:1)
虚拟内存使用意味着使用了多少地址空间,并不一定直接转换为RAM使用情况。堆栈,映射文件(包括二进制文件和库)等都有助于虚拟内存,但并不总是对实际使用的RAM有用。请注意,您的RES(驻留在RAM中)内存使用量仅为270 MB。在32位计算机上,您可能会遇到地址空间限制,因此如果接近2 GB标记,则虚拟内存是稀缺资源(该值也可能是1 GB或3 GB,具体取决于操作系统)。在64位系统上,虚拟内存(地址空间)接近无限制,因此高价值本身不需要被视为风险。当然,如果它也与实际的高RAM使用率或许多映射文件有关,你无法找到使用的原因,那么值得研究。
当然,JVM也有一些实际的开销(在物理分配的内存中),与垃圾收集器的内务管理,编译器的工作,本机代码等有关,这也将反映在虚拟内存使用中。但由于RES和SHR位置不是很高,我认为没有理由恐慌,特别是如果你是64位。