【发布时间】:2011-11-16 18:39:25
【问题描述】:
我在运行 Java 应用程序时设置了 Java 虚拟机的默认内存限制...
java -mx128m ClassName
我知道这会将最大内存分配池设置为 128MB,但我不知道指定 JVM 的内存限制有什么好处?
请在这个问题上赐教...
【问题讨论】:
我在运行 Java 应用程序时设置了 Java 虚拟机的默认内存限制...
java -mx128m ClassName
我知道这会将最大内存分配池设置为 128MB,但我不知道指定 JVM 的内存限制有什么好处?
请在这个问题上赐教...
【问题讨论】:
将为 JVM 定义一个默认的堆大小限制。此设置允许您覆盖它,通常是为了指定您希望为 java 进程分配更多内存。
【讨论】:
Runtime.getRuntime().maxMemory(); 来找出 jvm 使用的设置,否则请查阅你的 jvm 的文档,我运行 man java 来查找我的默认值机器。
我认为这应该有助于避免高内存消耗(由于错误或由于许多分配和释放)。如果您为低内存系统(例如 RAM 很少的旧电脑、手机等)设计,您会使用它。
或者,使用它来增加默认内存限制,如果它对您来说还不够,并且您会收到OutOfMemoryExceptions 用于正常行为。
【讨论】:
【讨论】:
已经有一个关于java和内存的问题SO: Java memory explained
在here 找到了一篇关于 Java 内存的非常好的文章。它概述了内存、如何使用、如何清理以及如何测量。
内存的默认值是(java 6之前的):
-Xms 以字节为单位的大小 设置 Java 堆的初始大小。这 默认大小为 2097152 (2MB)。这些值必须是的倍数,并且 大于 1024 字节 (1KB)。 (-server 标志增加 默认大小为 32M。)
-Xmn 以字节为单位的大小 设置 Eden 的初始 Java 堆大小 一代。默认值为 640K。 (-server 标志增加 默认大小为 2M。)
-Xmx 以字节为单位的大小 设置 Java 堆可以达到的最大大小 生长。默认大小为 64M。 (-server 标志增加 默认大小为 128M。)最大堆限制约为 2 GB (2048MB)。
另一个来源 (here) 指出,在 Java 6 中,默认堆大小取决于系统内存量。
【讨论】:
在 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 进程被分页,从而提高性能。
【讨论】: