【问题标题】:exceeding maximum memory of a server running java processes超过运行 java 进程的服务器的最大内存
【发布时间】:2013-12-26 08:50:47
【问题描述】:

我有一台 10GB 内存的机器。我正在运行 6 个 java 进程,其中 -Xmx 选项设置为 2GB。所有 6 个进程同时运行并消耗整个 2GB 内存的概率非常非常低。但我仍然想了解这种最坏的情况。

当所有 6 个进程同时消耗的内存少于 2GB 时会发生什么情况,这样 JVM 不会启动垃圾收集,但这些进程持有那么多内存并且这 6 个进程消耗的内存总和超过了可用内存?

这会使服务器崩溃吗?
OR
它会减慢处理速度吗?

【问题讨论】:

    标签: java memory-management


    【解决方案1】:

    您应该期望每个 JVM 可以使用超过 2 GB 的空间。这是因为堆只是一个内存区域,你也有

    • 共享库
    • 线程堆栈
    • 直接记忆
    • 共享库使用本机内存
    • 烫发。

    这意味着将最大堆设置为 2 GB 并不意味着您的进程最大为 2 GB。

    您的进程应该运行良好,直到它们到达您交换一些堆并执行 GC 的地步。 GC 假定随机访问整个堆,此时,您的系统可能会开始疯狂交换。如果您有用于交换的 SSD,您的系统可能会停止或几乎停止很长时间。如果你有 Windows(我发现它在这方面比 Linux 更差)和一个 HDD,你可能无法重新控制机器并且必须重新启动它。

    我建议要么将堆减少到最多 1.5 GB,要么购买更多内存。您可以花大约 100 美元获得 8 GB。

    【讨论】:

    【解决方案2】:

    您的机器将开始交换。只要每个java进程只使用它分配的一小部分内存,你不会注意到效果,但如果它们都同时进行垃圾收集,访问它们所有的内存,你的硬盘将有100%利用率和机器会“感觉”非常非常慢。

    【讨论】:

    • 最重要的是,如果一个进程达到峰值并占用 2GB 内存,JVM 不会将任何内存返回给操作系统,即使该进程返回使用 200MB 的 ram比瞬间开始。这意味着长期存在的应用程序在使用 2GB 时可能会有相当大的变化。
    • @Augusto 并不是说​​ JVM 不能将内存返回给操作系统,但根据我的经验,它很少会在您期望的时候返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2013-12-03
    • 2017-10-20
    相关资源
    最近更新 更多