【问题标题】:Manipulating memory limit for JVM using Xmx使用 Xmx 操作 JVM 的内存限制
【发布时间】:2018-11-02 15:59:14
【问题描述】:

有这么简单的应用程序

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a number: ");
        int n = reader.nextInt();
        reader.close();
    }
}

我使用不同的 Xmx 参数运行它(请记住 JConsole 已被注入到进程中)

  • -Xmx1M 不会运行
  • -Xmx2M 错误
  • -Xmx4M 不打印任何内容
  • -Xmx6M 及更大 - 将运行

JConsole 向我显示了应用程序的奇怪内存使用情况

如果使用 -Xmx8M 运行

  • 已使用 3.0MB
  • 已提交 8.4MB
  • 最大 8.4MB

如果使用 -Xmx16M 运行

  • 已用 4.0MB
  • 已提交 16.8MB
  • 最大 16.8MB

和 -Xmx32M

  • 已使用 11.0MB
  • 已提交 33.6MB
  • 最大 33.6MB

虽然使用外部软件测量内存消耗可能会对这些值产生一些影响,但 Java 似乎仍然会吃掉你让它吃掉的所有东西,即使它不是必需的。这是我最讨厌的 Java 的一部分,但试图理解。

我的程序不需要的内存会发生什么,但由于我通过更改 Xmx 参数允许它这样做而被 JVM 吃掉了? 我可以使用不同于 Xmx 参数的方式来影响“丢失”内存的数量吗?

【问题讨论】:

  • "这是我最讨厌的 Java 的一部分,..." 我猜,当运行非 Java 软件时,比如您选择的网络浏览器,您只需提供所需的千兆字节数,而无需询问它实际需要多少...
  • 不一样的;当我编写一个 hello world 应用程序时,我编写了一个 hello world 应用程序。它不同于处理网络协议、流、缓存等的应用程序。预计大型软件会消耗大量内存,反之则不然
  • 说真的。我敢打赌,99% 的开发人员无法预测他们的应用程序,尤其是一个普通的 hello world 应用程序需要多少内存。如果被问到,他们会四舍五入。 慷慨地。例如,即使是“hello world”应用程序也依赖于操作系统的抽象。它写入一个“文件”,结果是一个控制台(终端仿真)。不同的环境可能会将不同的库加载到您的应用程序中。您正在关注堆内存,对于如此小的应用程序来说,这是内存中最小的部分。例如,您知道分配了多少堆栈空间吗?

标签: java memory-management jvm


【解决方案1】:

Java 会吃掉你让它吃的所有东西,即使它不是必需的。

Java 不会主动清理内存。如果你给它内存,它希望用它来减少 CPU 消耗。

我能否使用不同于 Xmx 参数的方式来影响“丢失”的内存量?

您可以减小最小尺寸,您可以控制它的增长速度。事实上,有超过 500 个参数来控制 GC,但一般来说,建议设置尽可能少,除非你真的知道自己在做什么,以避免遇到如果你不理会它们就不会发生的问题。

要记住的关键一点是,您的时间就是金钱,而记忆需要金钱。在某些时候,尝试节省一点内存是不值得的。

基于开发人员的平均工资和 PC 内存的平均价格(贵组织的成本会有所不同)

1 day - 16 GB
1 hour - 2 GB
5 minutes - 160 MB
1 minute - 32 MB

如果您花费超过一分钟的时间节省不到 32 MB,那可能不值得。

这是我最讨厌的Java部分,

我讨厌滥用单位,但我真的应该学会克服它

m - milli
M - Mega
b - bits
B - Bytes
1 MB = 8 Mb = 1000000000 mB = 8000000000 mb

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2021-10-05
    • 2012-08-30
    • 2011-10-03
    • 2014-01-11
    相关资源
    最近更新 更多