繁体   English   中英

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

[英]Java is Allocating Extra 2gb of Memory

我有一个新的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命令行中指定的多。 我在质疑为什么它比以前使用了更多。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM