首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM不会像我说的那样使用更多的内存

JVM不会像我说的那样使用更多的内存
EN

Stack Overflow用户
提问于 2014-06-29 07:28:44
回答 2查看 109关注 0票数 2

我正在运行一个内存密集型应用程序。关于环境的一些信息:

  • 64位debian
  • 13 GB RAM
  • 64位JVM (我在程序运行时输出System.getProperty("sun.arch.data.model"),它写着"64")

以下是我发出的确切命令:

java -Xmx9000m -jar "ale.jar“testconfig

我在其他几个系统上运行了相同的精确数据、配置等程序,并且我知道JVM在这些系统上使用了6GB的内存。但是,我得到了一个OutOfMemory错误。此外,在程序执行过程中,系统从不会掉落到8.5GB以下的空闲内存。

当我在执行过程中输出Runtime.getRuntime().maxMemory()时,我得到了值3044540416,即~3GB。

我不知道它是否相关,但这是一个Google引擎实例。

我唯一能想到的解释是,对于单个进程可能使用的最大内存量,可能存在某种系统限制。

EN

回答 2

Stack Overflow用户

发布于 2014-06-29 07:48:07

-Xmx将只设置指定的最大内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用保持静态。

票数 1
EN

Stack Overflow用户

发布于 2014-06-29 07:48:16

我唯一能想到的解释是,对于单个进程可能使用的最大内存量,可能存在某种系统限制。

这是一个可能的解释。

另一个原因是,您正在尝试分配一个非常大的数组。最大可能的数组是2^31 - 1元素,但实际大小取决于元素大小:

  • byte[]boolean[] . 2G字节
  • char[]short[] . 4G字节
  • int[] .8 Gbytes
  • long[]Object[] . 16 or

如果您分配了一个非常大的数组,GC需要找到一个具有所需大小的空闲内存的连续区域。取决于数组大小,以及堆空间如何划分为空格,它可能会发现比您想象的少得多的连续空间。

第三种可能是,您正在获得OOME,因为GC达到了运行GC所花费的时间的GC开销限制。

如果你给我们看堆栈痕迹,这些理论可能会被证实或驳回.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24474008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档