在可用内存中 , 申请内存块 , 这部分内存块就是堆内存 ;
应用程序 , 通过 " 系统调用 " 向系统申请内存块 , 系统分配内存块 , 将分配的地址返回给申请内存的应用程序 ; 这里的 " 系统调用 " 就是调用 malloc 等函数 , 申请内存 ;
堆内存是由系统分配的 , malloc 是 stdlib 标准库中的函数 , 其真正的实现是调用了系统中断 ( int3 软中断 ) , 将申请内存的字节大小 size 放到寄存器中 , 中断发生后 , 切换到系统层面 , 在系统管理的内存块中 , 分配 size 大小的内存 , 将这块内存的首地址返回 ;
对于 Java 语言的 new 关键字在堆内存中创建对象 , Java 运行环境氛围两层 , 上层是 Java 虚拟机 ( JVM ) , 下层是 Windows / Linux / Mac 操作系统 ;
Java 虚拟机启动时 , 首先要根据启动时的 内存设置参数 , 维护一个指定大小的内存空间 ; JVM 申请的内存 , 可以一次性分配完毕 , 也可以选择使用多少分配多少的策略 ;
new 创建对象 , 由 JVM 向 操作系统 申请一块内存 , 然后返回内存的首地址给客户端 ;
" 栈 " 是内存中的一块连续的地址 , 栈内存是一块连续的有顺序的内存 ;
上述两种情况 , 都有可能出现 ;
调用函数时 , 首先将参数入栈 , 每传入一个参数 , 栈指针都要向上移动 ;
执行 func(arg0, arg1, arg2)
函数 , 将函数参数放入栈时 , 从右到左依次入栈 ;