JVM堆参数

Man*_*lva 64 java jvm-arguments

看完已经问到的关于这个问题的问题和大量的谷歌搜索我仍然无法清楚地看到-Xms选项

我的问题是:java -Xms=512m -Xmx=512m和之间的区别是什么java -Xms=64m -Xmx=512m

现在我有以下答案:

唯一的区别在于在我的应用程序运行期间将运行的垃圾收集的数量和内存分配的数量.我对吗 ?

以下是我回答这个问题的原因:

-Xms选项设置为512m不会导致我的应用程序512M在启动后使用真正的物理内存.我想这与现代操作系统虚拟内存管理和延迟页面分配有关.(我注意到设置-Xms512M或者64M不会改变Linux上的top或Windows上的任务管理器报告的所有初始使用内存)

有人可以帮助我理解这个Xms选项的影响,还是指向可以帮助我理解它的链接?

提前致谢

马努

Ste*_* B. 35

JVM将从初始堆级别的内存使用开始.如果maxheap更高,它将增长到maxheap大小,因为内存要求超过了它的当前内存.

所以,

  • -Xms512m -Xmx512m

JVM以512 M开始,从不调整大小.

  • -Xms64m -Xmx512m

如果mem,JVM以64M开始,增长(最大上限为512).要求超过64.

  • 通常,如果您知道启动时的应用程序会消耗特定数量的内存,则可以将初始堆大小设置为更大的值.这可以防止JVM在启动时花费执行时间多次调整堆大小.这种特殊用途是一种非常常见的优化,通过避免昂贵的分配周期使eclipse运行得更快. (3认同)
  • 据我所知,唯一的风险是因为你分配了太多虚拟内存而耗尽了虚拟内存 - 但是如果你的应用程序确实需要将要发生的内存. (2认同)
  • 我认为真正的语法是-Xms64m而不是-Xms = 64m.如果我弄错了,请回滚! (2认同)

Tur*_*smo 34

总结链接后找到的信息:JVM分配-Xms指定的数量,但操作系统通常不需要分配实际页面.因此,JVM按照Xms的指定分配虚拟内存,但只根据需要分配物理内存.

您可以通过Sysinternals使用Process Explorer而不是Windows上的任务管理器来查看此信息.

因此,使用-Xms64M和-Xms512M之间存在真正的区别.但我认为最重要的区别是你已经指出的那个:如果你真的需要512MB而垃圾收集器会更频繁地运行,但只开始使用64MB.

  • 我认为真正的语法是-Xms64m而不是-Xms = 64m.如果我弄错了,请回滚! (13认同)
  • 在研究 jvm 配置的一些细节时遇到了这个问题。这里接受的答案与我对这些价值观的理解大不相同。是的,大多数操作系统只会在应用程序尝试访问已分配的内存时触发次要页面错误时才使物理页面可用 - 但 Xms 指定了 jvm 分配的初始内存量 - 这在可以分配的页数*没有*应用程序分配更多内存 - 在 Java 的情况下,如果 gc 提供的内存不足,它只会分配更多内存(最多 Xmx) (2认同)
  • @symcbean问题是关于不同Xms值的不同行为以及操作系统没有显示出差异的原因.根据我的回答(并在您的评论中确认),操作系统仅分配所需的物理内存,而不是最初分配应用程序的整个内存.事实上,Java将分配更多内存,直到达到Xmx中的值,这一点都没有受到质疑. (2认同)

小智 14

除了标准的堆参数,-Xms并且-Xmx它也是很好的了解-XX:PermSize-XX:MaxPermSize,这是用来指定的烫发根空间的大小,因为即使你可能在堆在其他代空间,您可以运行的内存,如果你的烫发根空间已满.此链接还对一些重要的JVM参数进行了很好的概述.


baj*_*ife 5

JVM自适应地调整堆大小,这意味着它将尝试为您的应用程序找到最佳堆大小.-Xms和-Xmx只是指定JVM可以操作的范围并调整堆的大小.如果-Xms和-Xmx的值相同,那么JVM的堆大小将保持不变.

通常最好只设置-Xmx并让JVM找到最佳的堆大小,除非有一个特定的原因,你需要在JVM启动时给JVM一个大堆.

就JVM实际从OS请求内存而言,我认为这取决于JVM的平台和实现.我想在你的应用实际需要之前它不会请求内存.-Xmx和-Xms只保留内存.