【问题标题】:Java Virtual Machine and Swap SpaceJava 虚拟机和交换空间
【发布时间】:2017-04-10 10:04:03
【问题描述】:

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

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

2) 我认为本机堆大小在 JVM 上是不可配置的,因为操作系统会在运行时将可用 RAM 分配给 JVM 吗?

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

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

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

【问题讨论】:

  • 这些问题中的大多数不是特定于 jvm 的,可能应该向超级用户询问。您可能应该针对一个操作系统提出这些问题,因为这些东西的配置在操作系统之间非常不同。

标签: jvm


【解决方案1】:

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

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

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

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

【讨论】:

  • 尤金,感谢您的解释。
  • 我已经通过点击向上箭头符号接受了您的解释,但论坛没有显示它,因为我的声誉低于 15。谢谢
  • 完成。感谢以上链接
  • 为服务器级 JVM 应用程序提供交换空间实际上是个坏主意。请参阅 Java 性能:权威指南,p. 44:“由于 Java 堆,它对于任何类型的 Java 应用程序(包括在桌面上运行的基于 Swing 的 GUI 应用程序)都特别糟糕”(对性能不利,尤其是在 Full GC 的情况下)
  • @JurajMartinka 它不像你可以控制它。 Java 只是一个向操作系统请求内存的普通进程,它始终是虚拟的,包括交换
【解决方案2】:

我认为 -Xmx 和 -Xms 配置了可用于虚拟机内运行的 java 进程的堆大小。虚拟机本身是一个本地进程,需要额外的堆来运行虚拟机本身。因此,JVM 进程可以消耗比 -Xmx 选项所指示的更多的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-05-21
    • 2013-03-18
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多