我即将将应用程序部署到实时服务器,现在我正处于为jvm设置堆和permgen大小的部分。我看过很多文章,所有人都说“将最小堆大小设置为(某个数字)”,并“将最大堆大小设置为(某个数字)”,但这些文章都没有说明为什么需要设置最小堆大小。我理解设置最大堆大小的原因,但不是最小堆大小。如果你对此有所了解,我将感激不尽。
答案 0 :(得分:6)
Java中的堆是一般的内存分配区域。我们假设我们将最小堆大小设置为1000字节(这是一个荒谬的低数字)。现在让我说我在我的程序中实例化一个包含一些长度为两千个字符的文本的对象。如果不先扩展堆大小,我无法保存此对象。现在,大概我的最大堆参数足够大以允许这个 - 但这是设置最大堆大小的原因。
但是,假设我的服务器有4G ram,我将最小堆大小设置为。 (一个荒谬的大数字。)如果没有其他程序占用任何内存,这将工作。但是,如果我使用我的java程序启动第二个进程,它将无法分配足够的内存并退出。
最小尺寸为你做两件事;首先,它使内存快速可用,以便快速启动。其次,它可以让你调整你的jvm,以便你有一些不变量,允许你预测你可以运行多少个进程。如果您的最小堆大小太大,您可能会在一个从不需要那么多的进程上浪费内存,从而限制了系统的容量。如果将其设置得太小,程序将需要很长时间才能启动,从而对流程的性能产生负面影响。
答案 1 :(得分:1)
设置最小堆大小允许Java预先分配一些内存,这可以缩短启动时间。
答案 2 :(得分:1)
显式设置最小大小(高于默认值)有助于在操作系统级别分配碎片并启动时间性能。
Java堆由操作系统分配的内存支持,初始块越大,重新分配和碎片就越少。
将最小值设置为等于或几乎等于最大值,将完全消除这些情况。