繁体   English   中英

为JVM启动内存分配

[英]Starting memory allocation for JVM

我开始在java命令中使用-Xmx选项,以允许我的进程使用更多的内存(256Mb,虽然我认为我目前使用的内存少于128Mb)。 我还注意到启动内存的-Xms选项,默认值为2Mb。 我该怎么设置这个值以及为什么?


参考:Java

-Xmx参数定义堆可以为JVM访问的最大内存大小。 您必须很好地了解您的程序并查看它在负载下的执行情况并相应地设置此参数。 如果程序的堆内存达到最大堆大小,则较低的值可能导致OutOfMemoryException或性能非常差。 如果您的程序在专用服务器上运行,则可以将此参数设置得更高,因为它不会影响其他程序。

-Xms参数设置JVM的初始和最小堆内存大小。 这意味着当您启动程序时,JVM将立即分配此数量的内存。 如果您的程序从一开始就消耗大量堆内存,这将非常有用。 这避免了JVM需要定期增加堆大小,因此您可以在那里获得一些性能。 如果您不知道此参数是否对您有所帮助,请不要使用它。

对于像Resin这样的服务器端Java应用程序来说,将最小-Xms和最大-Xmx堆大小设置为相同的值是一种很好的做法。 您可以设置为256或512Mb。

堆大小对于您的应用程序找到权利应该是“正确的”虽然并不容易。 如果它太小,你就会耗尽内存,如果你要浪费内存,就会冒着长时间GC暂停的风险。 当出现问题(并且它们总是出错)时,您拥有的堆越多,您需要调试的堆越多,泄漏所需的时间就越长。

理想情况下,我会将-Xms设置为我认为应用程序需要运行的-Xmx ,并将-Xmx设置为大于此值的值(但不要太大)。 始终打开详细垃圾回收并绘制正在使用的堆图以检查您设置的值。

当我绘制堆图时,我会查看发生的集合数和类型。 重要的是不要有太多。 然而,重要的是不要有如此巨大的堆,以至于很少,因为当它们发生时(并且完全的gc是不可避免的)它们会受到伤害。 理想情况下,正在寻找具有非常低暂停时间的常规间隔良好的gcs。

也就是说对于32位Windows -Xms应该与-Xmx相同,这是因为Java(抛开jrockit)需要连续的内存而Windows的内存映射是碎片化的,因此它需要尽可能早地获取并锁定堆。

Xmx是内存池的上限。 Xms是初始大小。 这就是它的全部内容。 每种方法的适当大小取决于应用程序的复杂程度。 将初始大小设置为高于2mb的主要优点就是JVM花费更少的时间从OS请求更多内存。 如果您设置了256mb的上限,则初始大小为32mb-64mb对于大多数企业应用程序来说并不合理。

更多信息: http//java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html

我该怎么设置这个值以及为什么?

取决于您的课程申请。

如果您知道您的应用程序最初消耗,假设在第一分钟内使用64 MB,那么使用默认值(2mb)将使VM请求内存多次,直到达到此64mb。 这些内存请求会减慢您的应用程序的速度,因为垃圾收集器可能会在VM请求更多之前尝试释放空间多次运行。

如果你已经知道你将使用as 64 mb,那么使用-Xms参数可以让你预先分配那个内存。

如果你消耗128mb并且你有足够的可用内存,你可以使用java -Xms128m并且不用担心长时间请求更多内存。

但同样,这取决于您的应用程序的功能,内存如何使用,何时需要。 等等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM