为什么JVM突然没有分配到最大堆设置,即使内存不足并且有足够的可用操作系统内存?

时间:2017-02-02 17:51:43

标签: memory-management java-8 jvm

我的JVM设置为最大堆大小为2GB。由于内存不足,它目前运行缓慢,但它不会分配超过1841MB(即使它在此次运行之前已经这样做了)。我有超过16GB的无内存。

为什么这会突然发生在正在运行的JVM上?可能是因为它被围绕在" - 它无法获得更大的连续范围的物理内存?

这适用于Windows 10上的java 1.8.0_73(64位)。但我偶尔也会看到其他java版本以及Windows 7和XP版本。

3 个答案:

答案 0 :(得分:0)

32位JVM通常难以使​​用超过1800Mb。它们可以分配多少取决于您的操作系统以及它如何布局32位地址空间(可以在运行之间变化)。

使用64位JVM获取更多信息。

答案 1 :(得分:0)

使用

启动JVM
java -Xmx2048m -Xms2048m

这将在JVM启动时预分配2GB(即使不需要)。

答案 2 :(得分:0)

只需增加堆内存,就无法使程序运行得更快。由于各种原因,程序可能很慢。 在您的情况下,可能不是因为内存使用,因为堆内存的增加不会导致程序充分利用该内存,或者运行得更快。如果你创建了大量正在使用的对象而不是垃圾回收,那么堆就会用完。

缓慢的另一个原因可能是程序的某些部分耗尽了处理能力(执行效果不佳的算法?)。 这也可能是由于I / O操作缓慢(文件读/写?)。

这些只是几个原因。我们可以通过了解您的计划的更多信息来确定缓慢程度。 您可以通过查看日志(如果有的话)或使用各种分析工具(如jconk(jdk附带),VisualVM等)来查找代码运行缓慢的部分。 您还可以通过传递各种参数来调整JVM,以自定义垃圾收集,堆的各个部分,线程堆栈大小等。