Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么内存使用率低于Xms?_Java_Memory Management - Fatal编程技术网

Java 为什么内存使用率低于Xms?

Java 为什么内存使用率低于Xms?,java,memory-management,Java,Memory Management,我有一个简单的java程序,我用-Xms=512mb和-Xmx=512mb参数运行。因此,初始堆是512mb,这意味着当我启动程序时,JVM必须请求操作系统为程序分配至少512mb。如果我打开jconsole,那么我会看到524Mb表示最大堆大小(JVM本身需要一些额外内存),524表示提交内存(保证Java VM可以使用的内存量)。但是如果我执行tasklist | find{my_pid} 那我明白了 java.exe 7700控制台1 145 272Б 我很困惑。它怎么可能小于512Mb?

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

那我明白了

java.exe 7700控制台1 145 272Б


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

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

java.exe                      7700 Console                    1   145 272 КБ
在JVM中执行一些内存密集型程序,在执行
tasklist | find{my_pid}
时会得到不同的结果


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

这是否回答了您的问题?你问过你的应用程序的堆怎么能小于512MB。这个线程回答了为什么Xms不总是应用程序的最小堆大小。@javadev它不是。这个回答了你的问题吗?“当前状态”是什么意思?@Tony-它显示了进程
java.exe
当前消耗的内存量。以及为什么使用率低于Xms?JVM不是从一开始就消耗内存以备将来使用吗?@Tony-操作系统可能会根据使用情况优化内存分配,例如,如果
java.exe
空闲,操作系统可能会为其分配一个内存
Xms
。也许我错了,但我认为JVM从一开始就占用了一些内存(这使得它不可用于其他进程),然后将该内存用于我的应用程序堆。即使我的应用程序(不是JVM)没有真正使用它(例如,如果它是hello world程序),在启动时占用的内存也必须被视为“已消耗”。我错了吗?