jvm - Java 虚拟机和交换空间

标签 jvm

感谢这里的任何专家可以为以下 JVM 和交换空间相关查询提供建议。提前致谢

1) 当 OutOfMemory 出现在 JVM Java Heap、Perm Generation 或 Native Heap 中时,操作系统将使用交换空间是否正确?或者交换空间用于 native 堆中的 OutOfMemory ?

2)我对 JVM 不可配置 native 堆大小是否正确,因为操作系统会在运行时为 JVM 分配可用 RAM?

3)我们如何为JVM启用交换空间,或者默认情况下为Unix和Window级别的所有进程启用交换空间?

4) 了解交换空间会影响应用程序性能,这是禁用 JVM 交换空间的最佳实践吗?如果不是,原因是什么?

5) 我们如何在 Unix 和 Window 操作系统中禁用交换空间并更改特定 JVM 的交换空间大小,或者它只能在适用于操作系统中所有进程的操作系统级别配置?

最佳答案

这里有很多问题...操作系统确实使用swap空间创造所谓的virtual memory (这显然比您可能拥有的 RAM 大)。它通常默认启用,但您需要检查。

您不能指示 JVM 仅使用物理 RAM AFAIK,但这将是操作系统本身而非 JVM 的限制(这应该回答 5)。

您可以禁用交换(同样适用于操作系统,而不是 JVM),但这是一个坏主意。操作系统内部运行着多个进程,每个进程都需要运行空间(在某个时间点可能会超过您的实际 RAM)。它确实会影响性能,但更糟糕的是 - 一些性能损失(我认为操作系统有很多事情可以使这对你更好)还是应用程序的死亡? (这应该回答4)。

关于 (2) 有两个参数控制您将拥有多少堆:Xmx - JVM 进程将使用的最大堆。和 Xms - 初始堆。其实就在最近有一个很好的讨论:here .

关于jvm - Java 虚拟机和交换空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43320272/

相关文章:

java - 可以增加引用旧对象的 gc 时间短命对象吗?

java - 我怎么知道java中当前的classLoader

java - Full GC 期间的线程转储

java - JVM 是生成字节码还是运行字节码?

java - 64 位 JVM 无法为对象堆保留足够的空间

java-me - 现在在哪里使用 jme/j2me?

Java Flight Recorder——缺少文件写入/读取事件

java - 在这种情况下,JVM 如何处理动态调度?

Java 使用比堆大小多得多的内存(或正确大小的 Docker 内存限制)

java - 如何使用top linux计算java的实际内存使用情况?