-Xms -Xmx 固定为一样即可避免堆自动扩展?为什么要固定起来呢?有什么好处,这样就可避免内存溢出

解决方案 »

  1.   

    动态扩展会造成额外的垃圾收集,
    假设现在设置了Xmx2g
    那么下面两种情况:
    1.不设置Xms,默认最大是64M,
    2.设置了Xms2g假设在你已经用了40M内存,这个时候再申请30M,
    在情况1:发现内存不够了(当前最大64)-->gc-->发现需要扩展-->可以扩展(因为Xmx2g)-->扩展
    在情况2:因为当前最大就是2g,情况1发生的情况2都不会发生
      

  2.   

    一般软件业貌似是不会设置最大使用内存限制的,如果它需要,会无限制申请,直到系统无可给予。所以-Xmx的存在我觉得作用不是很明显(可能对系统其它并行使用的软件有好处),如果设置得小了,还会导致out of memory。
    而-Xms貌似有好处,如果不设置,jvm可能会持续申请所需内存,影响性能,而-Xms存在,就一笔申请,要胜过持续申请。
      

  3.   

    -Xmx的大小是需要设置的。要不会用默认的。-Xms和-Xmx的大小设置为一样的,是一种错误的行为。内存溢出,对于写的不好的代码是无法避免的。
      

  4.   

    堆大小设置上下限会导致堆大小是变化的,当使用的内存减少时,就导致jvm需要耗费额外的资源来处理内存碎片,缩小堆大小;当需要内存加多时,jvm又要新开辟内存