【问题标题】:Why memory usage is less than Xms? [duplicate]为什么内存使用量小于 Xms? [复制]
【发布时间】:2021-01-24 07:09:45
【问题描述】:

我有一个简单的 java 程序,我使用 -Xms=512mb-Xmx=512mb 参数运行。所以初始堆是 512 Mb,这意味着我的 JVM 在我启动它时必须请求我的操作系统为程序分配至少 512 MB。如果我打开 jconsole,那么我看到最大堆大小为 524Mb(JVM 本身需要一些额外的内存),已提交内存为 524(保证可供 Java VM 使用的内存量)。但是如果我执行tasklist | find {my_pid}

然后我明白了

java.exe 7700 Console 1 145 272 КБ

我很困惑。怎么可能小于512Mb?

【问题讨论】:

标签: java memory-management


【解决方案1】:

以下行显示的是当前状态,而不是最大/最小范围:

java.exe                      7700 Console                    1   145 272 КБ

在你的JVM中执行一些内存密集型程序,你会在执行tasklist | find {my_pid}时得到不同的结果。

注意Xms 保证如果操作系统没有这么多内存(加上一些额外的内存),操作系统将不会启动java.exe。但是,一旦java.exe 启动,操作系统可能会根据使用情况优化内存分配,例如如果java.exe 空闲,操作系统可能会为其分配一个内存Xms。此外,tasklist 提供的信息是针对最终用户的,可能与内部统计数据没有密切关系。请查看this discussion 了解更多信息。

【讨论】:

  • “当前状态”是什么意思?
  • @Tony - 它显示进程 java.exe 当前正在消耗多少内存。
  • 为什么使用量小于Xms? JVM 不会从一开始就消耗该内存以供将来使用吗?
  • @Tony - 操作系统可能会根据使用情况优化内存分配,例如如果java.exe 空闲,操作系统可能会为其分配内存Xms。
  • 也许我错了,但我认为 JVM 从一开始就占用了一些内存(这使得它无法用于其他进程),然后将该内存用于我的应用程序堆。即使我的应用程序(不是 JVM)并没有真正使用它(例如,如果它是一个 hello world 程序),开始时占用的内存也必须被视为“已消耗”。我错了吗?
猜你喜欢
  • 2019-06-11
  • 2018-01-16
  • 2021-07-31
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多