java初始化堆内存为8g,操作系统真的会立即分配8g的内存吗

最近看了一个问题,说是 java在创建子进程的时候,由于会申请和父进程相似大小的
内存空间,导致内存使用量翻倍,所以想验证一下.

代码如下所示

public class ProcessDemo {

    public static void main(String[] args) throws Exception{
        Thread.sleep(20000);
        ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c","ifconfig");
        Process process = pb.start();
        Scanner scanner = new Scanner(process.getInputStream());
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
        Thread.sleep(20000);
        scanner.close();
    }
}

第一个sleep20秒 是为了使用ps -ef | grep ProcessDemo 查看进程号
然后使用top -p pid 来观察内存使用情况

如下所示 我设置初始化堆内存为8g,但是这个java进程并没有占用8g的内存空间
图片说明

jvm初始化内存有最大内存和最小内存的配置,不会在初始化的时候就会分配给jvm最大的内存,而是根据你的系统内存空间和你配置的jvm内存空间大小范围进行分配,在运行期间,由于程序中的对象产生,回收等等,jvm都会扩大或者减小内存占用,但是最大的内存就是你设置的jvm最大内存,如果jvm中的堆栈产生的内存超过了设置的最大内存,就会堆栈溢出