【问题标题】:Python vs Java's -xms and -xmxPython 与 Java -xms 和 -xmx
【发布时间】:2019-01-27 05:55:43
【问题描述】:

相关问题:What are the Xms and Xmx parameters when starting JVMs?

为什么 Java 程序允许您指定 -xms 和 -xmx?作为开发人员,为什么我需要知道/关心我的程序会预先使用多少 cpu/mem?

或者不同角度的同一个问题,为什么不让 Python 指定这些类型的选项? (在 Python 中工作了 5 年,从来没有这样做过)

这是否与 Python 是解释语言和 Java 是某种字节码到 JVM 到机器语言有关?
或者可能与垃圾收集的不同方式有关,Java 需要更加警惕内存消耗?

【问题讨论】:

    标签: java python


    【解决方案1】:

    并非所有操作系统都以相同的方式将内存“压力”传达给正在运行的进程,这意味着几乎从不。 Java 允许您明确限制其内存使用。 Python、Go 和其他语言有一种比较激进的方法来收集内存。

    这被 cgroups 复杂化了,用于在 Docker 和 Kubernetes 下实现容器,这可能会导致 malloc() 返回 NULL,但会导致向您的进程发送信号以杀死它。

    FWIW,JVM 为您提供了一种方法(通过-Xmx)来控制虚拟机的内存使用情况,而其他系统只是希望它们适合。 Docker 容器中的 Java 是非常易于管理的,而 Python 或 Go 则比较容易出错。这些都是“好”的技术,但对容器的限制应该(我希望)推动改进垃圾收集“努力”的表达方式。 :\

    这感觉像是没有答案,对此我很不满意。您可以阅读此内容,直到有人发布人们更喜欢的内容并进行投票为止。一旦出现一些不可避免的不满投票,我将删除它。 ;)

    【讨论】:

    • 这是一个很好的答案。它只是表明这两个系统旨在以不同的方式处理垃圾收集。 Python 在运行过程中进行清理。如果内存不足,您真的无能为力。 Java 通常有一些空间可以清理并在达到极限时继续运行。限制标志有助于 Java 生存,而它根本不会帮助 Python。
    【解决方案2】:

    我认为这是一个关于java设计模式的问题。真的很奇怪,因为 java 几乎是唯一严格限制其内存使用的。它也是唯一一个检查异常的。

    我相信这些都是因为java的设计者想要设计一种真正为企业服务的语言。他们正在尽最大努力确保安全。

    这里是关于内存使用限制的回答:https://stackoverflow.com/a/3358383/5588279

    对于已检查的异常,也是如此。设计者想强迫开发者处理 每个可预期的异常。

    好吧,很难说这是否好。虽然我不喜欢这种设计,因为看起来设计师把我当作菜鸟,但我不得不承认它确实让 java 更安全......也许?

    【讨论】:

      【解决方案3】:
      1. 我看到 Python 有 3 代,即第 0 代、第 1 代和第 2 代,非常类似于(不等同,但有些相似)Java 的年轻一代、老一代和烫发一代。
      2. 我们知道,这些开关限制了 Java 应用程序的内存使用量。
      3. 在 Python 中也是如此,虽然我没有看到等效项(或者可能有..),但我看到 gc.set_threshold 设置阈值 (https://docs.python.org/3/library/gc.html)。
      4. 可能是阈值可以通过导致可接受的 GC 来进行微调(同样频繁的 GC 并不好,但这一切都归结为通过在 Dev env 中进行微调并获得适合一次的阈值自己的应用程序)。

      只是一个想法!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-14
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 2012-08-01
        • 2011-05-17
        相关资源
        最近更新 更多