我开始使用命令-Xmx
上的选项java
来允许我的进程使用更多内存(256Mb,尽管我认为我目前使用的内存少于 128Mb)。我还注意到-Xms
启动内存的选项,默认值为 2Mb。我应该将此值设置为什么,为什么?
4 回答
该-Xmx
参数定义了 JVM 堆可以达到的最大内存大小。您必须非常了解您的程序并查看它在负载下的性能并相应地设置此参数。如果您的程序的堆内存达到最大堆大小,较低的值可能会导致OutOfMemoryException
性能下降或非常差。如果您的程序在专用服务器上运行,您可以将此参数设置得更高,因为它不会影响其他程序。
该-Xms
参数设置 JVM 的初始和最小堆内存大小。这意味着当您启动程序时,JVM 将立即分配此内存量。如果您的程序从一开始就消耗大量堆内存,这将非常有用。这避免了 JVM 需要定期增加堆大小,因此您可以获得一些性能。如果您不知道此参数是否会对您有所帮助,请不要使用它。
对于像 Resin 这样的服务器端 Java 应用程序,最好将最小-Xms
和最大-Xmx
堆大小设置为相同的值。您可以设置为 256 或 512Mb。
堆大小应该为您的应用程序找到正确的“正确”,但并不容易。如果它太小,你会耗尽内存,如果太大,你会浪费内存,并且会有长时间 GC 暂停的风险。当事情出错(而且总是出错)时,你拥有的堆越多,你需要调试的堆就越多,任何泄漏都需要越长的时间才能显现出来。
理想情况下,我将设置-Xms
为我认为我的应用程序需要运行的大小,并且-Xmx
设置为大于此的值(但不要太大)。始终打开详细垃圾收集并绘制正在使用的堆以检查您设置的值。
当我绘制堆图表时,我会查看发生的集合数量和类型。重要的是不要有太多。然而,同样重要的是不要有一个大到很少的堆,因为当它们发生时(并且完整的 gc 是不可避免的)它们会受到伤害。理想情况下,正在寻找一组间隔良好且暂停时间非常短的常规 gcs。
这对于 32 位 Windows-Xms
应该与此相同,-Xmx
因为 Java(撇开 jrockit 不谈)需要连续的内存,并且 Windows 的内存映射是碎片化的,因此尽早获取和锁定堆是值得的。
Xmx 是内存池的上限。Xms 是初始大小。这就是它的全部。每个的适当大小将取决于您的应用程序的复杂性。将初始大小设置为高于 2mb 的主要优点只是 JVM 将花费更少的时间从操作系统请求更多内存。如果您设置了 256mb 的上限,那么 32mb-64mb 的初始大小对于大多数企业应用程序来说并不是不合理的。
更多信息:http: //java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html
我应该将此值设置为什么,为什么?
当然取决于你的应用。
如果您知道您的应用程序最初消耗最多,比如说第一分钟 64 mb,然后使用默认值 (2mb),将使 VM 多次请求内存,直到达到这个 64mb。这些内存请求会稍微减慢您的应用程序,因为垃圾收集器可能会在 VM 请求更多之前运行多次尝试释放空间。
如果您已经知道将使用 64 mb 作为起始空间,则 using-Xms
参数将让您预先分配该内存。
如果您正在消耗 128mb 并且您有足够的可用内存,您可以使用java -Xms128m
并且不用担心长时间请求更多内存。
但同样,这取决于您的应用程序做什么、如何使用内存以及何时需要。等等等等