指定Java虚拟机内存限制有哪些优势?

8
我已经设置了Java应用程序运行时的Java虚拟机默认内存限制,就像这样...
java -mx128m ClassName

我知道这将把最大内存分配池设置为128MB,但我不知道指定JVM内存限制的好处是什么?
请在这个问题上启迪我...
5个回答

8
在Sun的1.6 JVM上,在服务器级别的机器上(意味着具有2个CPU和至少2GB的物理内存),默认的最大堆大小是物理内存的四分之一或1GB中较小的一个。使用-Xmx可以更改这个值。
为什么要限制Java使用的内存量?有两个原因。
首先,Java的自动内存管理会尽可能地从操作系统中获取更多的内存,并为程序的受益进行管理。如果您在同一台机器上运行其他程序和Java程序,则Java程序会占用超过其公平份额的内存,对其他程序造成压力。如果您运行多个Java程序副本,则它们将相互竞争,您可能会发现某些实例的内存不足。设置堆大小限制可以帮助您管理这个问题-如果您有32 GB的RAM,并且正在运行四个进程,则可以将每个堆限制在约8 GB左右(稍少一些更好),并确信它们都能获得正确数量的内存。
其次(实际上是第一个方面的另一个方面),如果一个进程占用的内存超过了物理内存供应的操作系统,它将使用虚拟内存,并被分页到磁盘上。这是非常缓慢的。Java可以通过使其垃圾回收器更加努力来减少其内存使用量。这也很慢-但不像访问磁盘那么慢。因此,您可以限制堆大小以避免Java进程被分页,从而提高性能。

4

JVM会为堆大小定义一个默认限制。这个设置允许您覆盖它,通常是为了指定要分配给Java进程的更多内存。


JVM 的默认内存限制是多少? - Saravanan
@Saravanan,默认情况下,JVM的实现是特定的,并且在某些JVM上甚至可以根据系统配置在运行时选择默认值。我的机器上默认值为64MB。 - krock
非常感谢。如何检查它? - Saravanan
@Saravanan,在运行时,您可以运行Runtime.getRuntime().maxMemory();来查找JVM正在使用的设置,否则请查阅您的JVM文档。我运行了man java来查找我的机器上的默认值。 - krock

3
  1. 这设置了最大堆大小。总的虚拟机可能更大。
  2. 因为这个参数有默认值(至少对于Oracle / Sun VM),所以总是有限制的。
  3. 因此,好处可能是:您可以将内存提供给实际需要工作(有效)的应用程序,或者如果从另一个方向考虑:(略微)限制最大内存使用,以管理在一台机器上不同应用程序之间的资源分配。

2

关于Java和内存已经有一个问题 SO: Java memory explained

这里有一篇非常好的关于Java内存的文章 here。它概述了内存的使用、清理以及如何测量。

默认的内存设置(Java 6之前):

-Xms 字节大小 设置Java堆的初始大小。默认大小为2097152(2MB)。值必须是1024字节(1KB)的倍数且大于1024字节。 (-server标志将默认大小增加到32M。)

-Xmn 字节大小 设置Eden代的Java堆的初始大小。默认值为640K。 (-server标志将默认大小增加到2M。)

-Xmx 字节大小 设置Java堆可以增长到的最大大小。默认大小为64M。 (-server标志将默认大小增加到128M。)最大堆限制约为2GB(2048MB)。

另一个来源 (here) 表示,在Java 6中,默认堆大小取决于系统内存的数量。


1

我认为这应该有助于避免高内存消耗(由于错误或由于许多分配和释放)。如果您设计低内存系统(例如具有少量RAM的旧计算机,移动电话等),则可以使用此选项。

或者,如果默认内存限制不足以满足您的需求,并且您在正常行为中遇到OutOfMemoryException,则可以使用此选项来增加内存限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接