JVM堆参数
在阅读了关于这个主题的已经被问及的问题之后,我仍然无法清楚地看到-Xms选项
我的问题是: java -Xms=512m -Xmx=512m
和java -Xms=64m -Xmx=512m
什么区别?
现在我有以下答案:
唯一的区别是在我的应用程序运行期间将运行的垃圾回收数量以及内存分配的数量。 我对吗 ?
这是我的这个答案的原因:
将-Xms
选项设置为512m
不会导致我的应用程序在启动后使用真正的512M
物理内存。 我想这与现代操作系统虚拟内存pipe理和懒惰页面分配有关。 (我注意到,将-Xms
设置为512M
或64M
并不会改变Linux上的顶层或Windows上的任务pipe理器报告的最初使用的内存)
有人可以帮我理解这个Xms
选项的影响,或者指向我的链接,这将有助于我理解它吗?
提前致谢
马努
总结链接后发现的信息:JVM分配由-Xms指定的数量,但操作系统通常不会分配实际页面,直到需要为止。 所以JVM按Xms指定的方式分配虚拟内存,但只根据需要分配物理内存。
你可以通过使用Sysinternals的Process Explorer而不是Windows上的任务pipe理器来看到。
所以使用-Xms64M和-Xms512M有一个真正的区别。 但是我认为最重要的区别就是你已经指出的那个:如果你真的需要512MB的,但是只能从64MB开始的话,那么垃圾收集器会更频繁地运行。
JVM将以最初的堆级别从内存使用开始。 如果maxheap更高,则会随着内存要求超过当前内存而增长到maxheap大小。
所以,
- -Xms512m -Xmx512m
JVM以512 M开始,永远不会resize。
- -Xms64m -Xmx512m
如果mem,JVM以64M开始,增长(最大达512)。 要求超过64。
除了标准的Heap参数-Xms
和-Xmx
,还需要知道-XX:PermSize
和-XX:MaxPermSize
,它用于指定Perm Gen空间的大小,因为即使在堆中的其他代中可以有空间,也可以运行内存不足,如果你的perm gen空间满了。 这个链接也有一些重要的JVM参数很好的概述。
JVM自动调整堆大小,这意味着它将尝试为您的应用程序find最佳的堆大小。 -Xms和-Xmx只是指定了JVM可以操作的范围,并调整了堆的大小。 如果-Xms和-Xmx是相同的值,那么JVM的堆大小将保持不变。
通常最好只设置-Xmx并让JVMfind最佳的堆大小,除非在JVM启动时需要给JVM一大堆的特殊原因。
就JVM实际向OS请求内存而言,我相信这取决于JVM的平台和实现。 我想,它不会要求内存,直到你的应用程序真正需要它。 -Xmx和-Xms只保留内存。
如果在启动时写入:-Xms512m -Xmx512m,那么java在那个512m内存的RAM中为其进程分配,不能增加。
-Xms64m -Xmx512m启动时,java只为其进程分配64m的ram,但java可以增加内存占用,而512m。
我认为第二件事情是更好的,因为你给java自动内存pipe理。
我在scala
创build了这个玩具的例子, my_file.scala
:
object MyObject { def main(args: Array[String]) { var ab = ArrayBuffer.empty[Int] for (i <- 0 to 100 * 1000 * 1000) { ab += i if (i % 10000 == 0) { println("On : %s".format(i)) } } } }
我跑了它:
scala -J-Xms500m -J-Xmx7g my_file.scala
和
scala -J-Xms7g -J-Xmx7g my_file.scala
-Xms500m
版本肯定有明显的暂停。 我认为短暂的停顿是垃圾收集运行,长时间的是堆分配。