我有一个格式 Map 存储在文件中的地图。该文件有超过 100,000 条记录。
每个条目的价值接近10k。
我将 1000 条记录加载到内存中的地图中,处理它们,然后清除地图并加载接下来的 1000 条记录。
我的问题是:
由于字符串存储在 permgen 内存区域中的字符串池中,当我清除地图时,字符串会被垃圾收集吗?
如果他们没有被垃圾收集,有没有办法强制他们被垃圾收集?
是否可以保证如果程序内存不足,JVM 会在抛出 OutOfMemory 异常之前清理 permGen 内存?
我有一个格式 Map 存储在文件中的地图。该文件有超过 100,000 条记录。
每个条目的价值接近10k。
我将 1000 条记录加载到内存中的地图中,处理它们,然后清除地图并加载接下来的 1000 条记录。
我的问题是:
由于字符串存储在 permgen 内存区域中的字符串池中,当我清除地图时,字符串会被垃圾收集吗?
如果他们没有被垃圾收集,有没有办法强制他们被垃圾收集?
是否可以保证如果程序内存不足,JVM 会在抛出 OutOfMemory 异常之前清理 permGen 内存?
好的..让我们开始....
由于字符串存储在 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 将尽最大努力进行清理。不,不能保证会发生这种情况。