我一直在努力让记忆越来越集中, 并对垃圾收集有疑问。
在这种情况下,Profile将是我们程序中的一个类,但只有在用户实际登录时才需要配置文件。
Map<UUID, Profile> profiles;
public ProfileManager() {
profiles = new HashMap<UUID, Profile>();
}
public void login(UUID uuid) {
profiles.put(uuid, new Profile(uuid));
}
public void logout(UUID uuid) {
if(profiles.containsKey(uuid))
profiles.remove(uuid);
}
我的问题是,它会垃圾收集删除的个人资料吗? 它不会设置为null,而是不再引用。我不确定这是如何处理的。我想,因为它不再被引用,它会被垃圾收集,但是再次,配置文件不是空的。
谢谢。
答案 0 :(得分:2)
当您从地图中删除它时,Profile对象将有资格进行垃圾收集,如果没有其他任何引用它。之后,垃圾收集器可能会或可能不会立即进行垃圾收集,具体取决于对象的引用时间。
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
然而,出于您的目的,我建议您只需将其从地图中删除,确保它没有在其他任何地方引用,然后不要担心垃圾收集器如何工作的更精细细节。
答案 1 :(得分:0)
Profile对象应该是垃圾收集的,但是我们不知道GC何时运行,因此您可能仍然可以访问已删除的Profile对象。但是一旦GC运行并且它找到任何未引用的对象,它就会从堆中删除。
答案 2 :(得分:0)
使用java.lang.System.gc(),此方法运行垃圾收集器。调用此方法建议JVM(Java虚拟机)启动垃圾收集,此方法可能会清除对象可能不会,该决定仍然存在到JVM。根据操作系统平台,JVM操作可能会有所不同。所以你唯一能做的就是建议JVM进行垃圾收集。