我一直在阅读程序如何与 SO 交互。
我了解到,每当程序想要在内存中创建对象/变量时,都应该将控制权传递给内核来执行此操作,使用系统调用、SO 内存管理,例如 jemalloc。
我还读到,当使用 new 在堆上创建变量或对象时,Java 不使用 mallac,甚至不进行系统调用。由于对象一直在创建,成本应该很高,所以 JVM 负责处理它。
我的问题是:
程序可以在不进行系统调用的情况下在堆上创建数据吗?直接创建对象到它的内存空间?
注意:我知道操作系统将虚拟内存映射到实际内存以保护数据等。
一旦应用程序从操作系统获取内存,即使不再使用它,它也会将其保留在空闲内存池中。如果出现新的内存分配请求,如果可能的话,该请求将从未使用的内存池中得到满足。
这就是 JVM 如何在内存中分配已经从操作系统获取但当前尚未使用的新对象。
非常笼统地说(忽略共享内存、内存压缩、虚拟内存...)对象使用的内存<= memory allocated to program <= memory available to OS