[英]Java: what is the official way to store large data (>2GB) in memory?
[英]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.