初始Java堆大小意味着什么?

时间:2018-07-18 10:24:49

标签: java jvm heap-memory

所以我有一个使用Java堆的程序

-Xms5g -Xmx12g 

我将初始Java堆大小设置为5gb,将最大堆大小设置为12gb

但是当我查看任务管理器或资源监视器时,我的程序仅使用了400mb。

这是我的问题:

  1. 初始Java堆大小是什么意思?
  2. 如果我将初始Java堆大小设置为5gb,为什么我只看到程序上的RAM使用为400mb,而不是5gb?因为初始堆意味着最小大小合适?

2 个答案:

答案 0 :(得分:2)

-Xmx的最大堆大小是堆可以增长到的最大大小。

-Xms的初始堆大小是堆范围的大小。在不触发完整GC的情况下,它不会使用超过此数量的空间。

但是,此堆分为多个区域,例如说你有一个5 GiB的初始堆,

  • 伊甸园大小为200 MB
  • 两个100 MB的幸存者空间
  • 永久性的4.6 GB空间。

当您开始使用内存时,在Linux上按需分配了被触摸的页面(4个KiB区域)(除非您使用一个选项来对它们全部进行预触摸)

您的Eden空间将很快被使用,因此前200 MB的使用速度非常快(如果甚至在调用main之前就已经使用了很多)。幸存者空间在经过少量收集后将被使用,但是最初它们可能不会被全部碰到,例如。说他们永远不会填满超过50 MB(可用的100 MB),此时的总内存为200 MB + 2 * 50 MB。

一些大的对象直接进入租用空间,但是对于大多数应用程序而言,租用空间在很大程度上占用了较小的,寿命长的对象。可以说,经过多次次要收集,大约100 MB的对象已被提升到永久性空间。

此时,即使扩展区为5 GB,也仅触摸或分配了200 + 2 * 50 + 100 MB的内存。

简而言之,Linux延迟分配页面,因此您必须写入页面以使用内存。

答案 1 :(得分:-1)

以下以-Xms5g参数开头的最简单程序占用5 GB以上的内存

public static void main(String[] args) throws Exception {
  Thread.currentThread().join();
}

要么您正在查看错误的过程,要么平台有一些非常特殊的东西。可能是您在Windows上并且正在寻找at "Working Set" instead of "Private Bytes"吗?