指定Java虚拟机的内存限制有什么好处?

时间:2011-09-14 07:19:26

标签: java jvm

我在运行Java Application时设置了Java虚拟机的默认内存限制......

java -mx128m ClassName

我知道这会将最大内存分配池设置为128MB,但我不知道在指定JVM的内存限制方面有什么好处?

请在这个问题上赐教我......

5 个答案:

答案 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)

  1. 设置最大堆大小。总VM可能更大
  2. 始终存在限制,因为此参数具有默认值(至少对于Oracle / Sun VM)
  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