Java、JVM、OS和交换

Java、JVM、OS和交换,java,jvm,solaris,Java,Jvm,Solaris,我想知道我是否启动了一个java虚拟机: -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:LargePageSizeInBytes=4m -XX:-BindGCTaskThreadsToCPUs 所以我用-Xms等于-Xmx I启动服务器,java OS进程将永远“保留”OS中的内存

我想知道我是否启动了一个java虚拟机:

-Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256m 
-XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC 
-XX:LargePageSizeInBytes=4m -XX:-BindGCTaskThreadsToCPUs 
所以我用-Xms等于-Xmx I启动服务器,java OS进程将永远“保留”OS中的内存?因此,这个JVM将有2GB的内存,如果操作系统有内存,那么它将允许进程启动,否则不会

JVM启动2GB后是否有可能使用操作系统的交换内存


(因此,如果最初启动时不使用交换内存)

这将在启动时使用大约2400 MB的虚拟内存。它永远不会返回虚拟内存。它可以返回主内存,但很少返回

JVM启动2GB后是否有可能使用操作系统的交换内存

技术上是的,但实际上这是一个非常糟糕的主意。执行GC时,它假定它可以随机访问所有内存。如果JVM开始交换,它可能会停止很长一段时间(许多分钟),甚至挂起机器


考虑到您可以花200美元左右购买32 GB的内存,通常购买足够的内存来满足您的需要会更简单。

这就是实际发生的情况“开始交换时,它可能会停止很长一段时间”,但我不明白为什么会导致操作系统,表明有足够的内存…因此,如果JVM将使用2GB,并且可能使用交换时它是“他的”?@Cris虚拟内存对于进程来说是虚拟的,因为操作系统可以(几乎总是)用它做它认为必要的事情。如果另一个进程启动并要求足够的内存超过计算机的物理内存,操作系统将不得不交换一些内存页,对于运行时间较长的进程,通常会这样做。但是使用xms=xmx不会“告诉”操作系统:我至少需要这个xms内存和最大xmx,所以我要通知您。操作系统至少为java进程分配xms?所以…你说,因为我在同一台机器上启动了其他进程,它可能会从jvm获得内存,jvm将使用交换?@Cris是的,这对任何进程都是一样的,jvm不是操作系统的特例。如果不允许操作系统从现有进程交换某些页面以满足另一进程的请求,则虚拟内存将不存在。唯一可以交换的页面是那些已分配的页面。@Cris我不熟悉Solaris区域(我只是浏览了维基百科的文章),显然它们与现在的VM不完全一样,因为它们运行在单个内核上,但我不明白为什么它们不运行cron,例如,有时可能需要一些内存。正如Peter指出的那样,试图精确地适应假定可用的内存必然会陷入困境,而对于JVM来说,这可能是致命的(从用户的vue角度来看)。