4

以下问题:

  1. 我开始我开发的程序(-Xmx550M)
  2. 我加载了一个 90 MB 的文件

这个加载是下图中已用堆的峰值。此后,堆大小从 130 MB 增加到 500 MB,尽管只需要 110 MB。

好吧,没问题,烦人,但是还可以。但是,如果我现在启动一个保存过程(大约需要 100 MB),Java VM 会因 java.lang.OutOfMemoryError: Java heap space 异常而崩溃。

堆大小和已用堆 (-Xmx550M)

如果我以 750 MB 的堆大小启动应用程序,它可以正常工作。您会看到短暂的峰值,并且工作正常: 堆大小和已用堆 (-Xmx750M)

现在我的问题是:为什么我会得到一个 550 MB 堆大小的 OutOfMemoryError?该应用程序只需要 400 MB(在最高峰)!

我不知道如何解决这个问题:(

请帮我!

4

2 回答 2

1

数据被采样。就在它失败之前它正在使用 400 MB,然后一段时间后它尝试使用更多内存,例如 600 MB,但这没有显示,因为在下一个样本被采集时,OOME 已经发生,你的使用率现在要低得多.

简而言之,您的程序可以比您在图中看到的更快地使用内存。

于 2012-12-13T23:00:57.033 回答
1

如果你加载 100Mb 的文件,并不意味着这个文件在内存中使用的结构占用了 100M。例如,如果您有 String,那么它的长度也有 4 个字节的开销。

于 2012-12-13T22:51:21.187 回答