我在运行Java Application时设置了Java虚拟机的默认内存限制......
java -mx128m ClassName
我知道这会将最大内存分配池设置为128MB,但我不知道在指定JVM的内存限制方面有什么好处?
请在这个问题上赐教我......
答案 0 :(得分:8)
在Sun的1.6 JVM上,在服务器级机器上(意味着具有2 CPUs and at least 2GB of physical memory的机器),默认的最大堆大小为smaller of 1/4th of the physical memory or 1GB。使用-Xmx
可以更改它。
为什么要限制Java使用的内存量?有两个原因。
首先,Java的自动内存管理倾向于从操作系统中获取尽可能多的内存,然后为了程序的利益进行管理。如果你在与Java程序相同的机器上运行其他程序,那么它将获得超过其公平份额的内存,从而给它们带来压力。如果您正在运行Java程序的多个副本,它们将相互竞争,并且您可能最终会遇到一些缺乏内存的实例。对堆大小设置上限可让您管理 - 如果您有32 GB的RAM,并且正在运行四个进程,则可以将每个堆限制为大约8 GB(稍微好一些),并确信它们都将全部获得适量的记忆。
其次(第一个真正的另一个方面),如果一个进程占用的内存比操作系统可以从物理内存提供的内存多,它就会使用虚拟内存,它会被分页到磁盘。这很慢。 Java可以通过使垃圾收集器更加努力来减少其内存使用量。这也很慢 - 但不像转到磁盘那么慢。因此,您可以限制堆大小以避免Java进程被分页,从而提高性能。
答案 1 :(得分:4)
将为JVM定义默认堆大小限制。此设置允许您覆盖它,通常可以指定您希望将更多内存分配给Java进程。
答案 2 :(得分:3)
答案 3 :(得分:2)
关于java和内存SO: Java memory explained
已经有了一个问题找到一篇关于Java内存的非常好的文章here。它概述了存储器,如何使用,如何清洁以及如何测量。
内存的默认值是(之前的java 6):
-Xms size in bytes 设置Java堆的初始大小。该 默认大小为2097152(2MB)。值必须是和的倍数 大于,1024字节(1KB)。 (-server标志增加了 默认大小为32M。)
-Xmn 大小(以字节为单位)设置Eden的初始Java堆大小 代。默认值为640K。 (-server标志增加 默认大小为2M。)
-Xmx 以字节为单位的大小设置Java堆可以的最大大小 增长。默认大小为64M。 (-server标志增加了 默认大小为128M。)最大堆限制大约为2 GB(2048MB)。
另一个源(here)声明在Java 6中,默认堆大小取决于系统内存量。
答案 4 :(得分:1)
我认为这应该有助于避免高内存消耗(由于错误或许多分配和解除分配)。如果您设计的是低内存系统(例如具有少量RAM,移动电话等的旧计算机),您可以使用它。
或者,使用此选项可以增加默认内存限制,如果它不够,并且您的正常行为正在获得OutOfMemoryException
。