赞美此处的任何专家都可以建议以下JVM和交换空间相关的查询。提前致谢
1)在JVM Java Heap,Perm Generation或Native Heap中出现OutOfMemory时,操作系统是否会使用交换空间?或者交换空间用于Native Heap中的OutOfMemory?
2)我认为本地堆大小在JVM上是不可配置的,因为OS会在运行时为JVM分配可用的RAM吗?
3)我们如何为JVM启用交换空间,或者默认情况下为Unix和Window级别的所有进程启用交换空间?
4)了解交换空间是否会影响应用程序性能,是禁用JVM交换空间的最佳做法?如果没有,原因是什么?
5)我们如何在Unix和Window OS中禁用交换空间并更改特定JVM的交换空间大小,或者只能在操作系统中的所有进程的操作系统级别进行配置?
答案 0 :(得分:4)
这里有很多问题......操作系统确实使用swap
空间来创建所谓的virtual memory
(这显然比你可能拥有的RAM大)。默认情况下通常启用,但您需要检查。
您无法指示JVM仅使用物理RAM AFAIK,但这将限制操作系统本身而非JVM(这应该回答5)。
您可以禁用交换(再次用于操作系统,而不是JVM ),但这是一个坏主意。在操作系统内部运行多个进程,并且每个进程都需要空间(在某个时间点可能超过实际RAM)。它确实会影响性能,但更糟糕的是 - 一些性能损失(我认为操作系统有很多东西可以让你更好)或应用程序的死亡? (这应该回答4)。
关于(2),有两个参数可以控制您将拥有多少堆:Xmx
- JVM进程将使用的最大堆。和Xms
- 初始堆。实际上就在最近,有一个非常好的讨论:here。
答案 1 :(得分:1)
我认为-Xmx和-Xms配置在虚拟机内运行的java进程可用的堆数。虚拟机本身是一个本机进程,需要额外的堆来运行虚拟机本身。因此,JVM进程可以消耗比-Xmx选项指示的内存更多的内存。