JVM是创建自己的交换内存还是占用OS交换内存?如果操作系统没有任何交换内存该怎么办,JVM仅会坚持使用RAM?
答案 0 :(得分:2)
JVM的行为与内核上运行的任何其他进程一样。当JVM需要堆空间时,它将通过malloc库调用来请求内存,而malloc库调用又使用系统调用(brk,sbrk或mmap)来使用OS虚拟内存系统分配空间。是否涉及分页交换与JVM无关,它只是在请求空间并将详细信息留给OS VM子系统。
从性能的角度来看,在配置JVM时务必牢记这一点。尽管您可以使堆大于计算机的物理内存,但与堆小于物理内存相比,它将提供较差的性能。这是由于堆超出物理内存后必须进行的分页活动的结果。
顺便说一句,Azul(我为之工作)有一个名为Zing的JVM,其功能有所不同。我们没有使用Linux VM子系统,而是拥有自己的内核级软件(称为Zing系统工具或ZST)。这使我们能够以特定于JVM的方式处理虚拟内存,而不是像Linux那样以通用方式处理虚拟内存。不使用内存时,可以将其从JVM返回到ZST,可以进一步优化缓存行,并且我们还具有允许JVM超过配置的堆大小以防止OOM错误的功能。
答案 1 :(得分:1)
虚拟内存是许多操作系统用于所有实际用途的一种技巧,就像它们具有比实际拥有的更多物理RAM一样。这通常对于普通程序是不可见的,并且操作系统可以处理所有内容。
基于HotSpot的Java实现是常规程序,但可能会变得很大。因此,重要的是正确配置JVM,这样它就不会占用过多的内存并引起交换。默认值通常是合理的。
简而言之。 jvm本身并不关心交换-这纯粹是一个操作系统任务。
答案 2 :(得分:0)
JVM不会在磁盘上创建自己的交换内存,它像其他任何应用程序一样使用OS交换。如果操作系统未配置SWAP,则会粘贴到RAM。