1

我有一个格式 Map 存储在文件中的地图。该文件有超过 100,000 条记录。

每个条目的价值接近10k。

我将 1000 条记录加载到内存中的地图中,处理它们,然后清除地图并加载接下来的 1000 条记录。

我的问题是:

  1. 由于字符串存储在 permgen 内存区域中的字符串池中,当我清除地图时,字符串会被垃圾收集吗?

  2. 如果他们没有被垃圾收集,有没有办法强制他们被垃圾收集?

  3. 是否可以保证如果程序内存不足,JVM 会在抛出 OutOfMemory 异常之前清理 permGen 内存?

4

1 回答 1

4

好的..让我们开始....

由于字符串存储在 permgen 内存区域中的字符串池中,当我清除地图时,字符串会被垃圾收集吗?

所有字符串都不存储在字符串常量池中。只有 interned Strings 和 String literals 进入 String 常量池。java-8 中没有permgen的概念。Metaspace 已经(几乎优雅地)取代了 Permgen

如果您从文件中读取了字符串(没有被实习),那么是的,您的字符串将被 GCed。如果您有字符串文字(如果您这样做,上帝会拯救您.. :P),当加载定义这些字符串文字的类的类加载器被 GC 时,它们将被 GC。

如果他们没有被垃圾收集,有没有办法强制他们被垃圾收集?

好吧,您总是可以System.gc()显式调用(在生产环境中不是一个好主意)。如果您使用的是 java-8,请使用G1Gc并启用String deduplication.

是否可以保证如果程序内存不足,JVM 会在抛出 OutOfMemory 异常之前清理 permGen 内存

GC 将尽最大努力进行清理。不,不能保证会发生这种情况。

于 2015-08-27T10:39:32.367 回答