Java垃圾收集理想对象

时间:2016-10-31 08:59:41

标签: java spring collections garbage

@Service
public class test(){
    public Map<String, String> map= new HashMap<>();
}

在使用spring的Web应用程序中,我使用@Service注释了一个类,并定义了一个全局变量映射并在其中插入值。

我假设

map hold inserted values,直到某人重新启动服务器或使用map.remove();

删除 但是我的大四学生告诉我 在一段理想的时间之后它会持续一段时间而垃圾收集器会在2或3天之后删除它是真的吗?

2 个答案:

答案 0 :(得分:1)

  

(1)Map是否保持插入值,直到有人重新启动服务器或   使用map.remove()删除

是的,您是对的,数据将在服务器重新启动或调用map.remove()map.clear()之前可用。

  

(2)经过一段理想的时间和垃圾之后,它只会持续一段时间   收藏家会在2或3天后删除它是真的吗?

不,这是错误的,除非您致电remove()上的clear()Map,否则垃圾收集器不会清除该对象。可以在地图中按下/保持数据,直到允许(即最大尺寸)为止,您将在服务器中获得OutOfMemory异常。

PS:但是,您需要知道的一点是,将这样的数据存储到服务中的Map中并不是一个好主意,而是必须考虑缓存框架(Ehcache, HazelCast等。)用于缓存/存储数据,提供缓存过期,在服务器之间分配数据等高级功能。

答案 1 :(得分:0)

Map保存内存中的地址列表。这些地址包含您使用

存储的值
map.put(object);

每当您想要检索存储在内存中的特定值时,您都会传入存储值的位置地址,因此您会收到存储的值。

回到你的问题,当你从地图中删除值时,真正发生的是你丢失了存储值的位置地址。并且没有其他方法可以访问该值了。虽然该值仍在内存中,但由于您删除了其位置的地址,因此无法使用它。 垃圾收集器将刷新此值,但您无法强制执行垃圾收集器。您可以做的最好的事情是调用System.gc(),这只是对垃圾收集器的一个提示,您希望它能够进行收集。它将随机运行或JVM需要更多内存。

正如你的大四学生提到它将在2-3天内被垃圾收集,我想他只是假设说话,因为你永远不知道什么时候垃圾收集器会运行并清除内存。