Java-关于用静态变量缓存数据的问题

Java-关于用静态变量缓存数据的问题

浮生未歇 发布于 2017-10-21 字数 477 浏览 1424 回复 5

假如定义一个静态list, 保存当前活跃的用户:
public static List<String> cache = new ArrayList<String>();
然后当有用户访问时,记录某个数据cache.add(*);

然后定时去将cache更新到数据库,更新数据库后,调用cache.clear()清除缓存,定时更新数据库为:每2分钟检查并更新一次

不知道这个静态的cache在没有被引用时,会不会被垃圾回收了,这样导致里面存储的数据不就丢失了么?大家各抒己见,我觉得将存到application不会丢失,直接利用static的特性,会不会不妥

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

浮生未歇 2017-10-29 5 楼

其实上面大家说的都已经很具体,
也很范范了。。。
关键我想说你要实现这种需求的程序,
为什么不直接采用缓存机制,
这样那些问题都不用考虑了,
再说数据量大的话更新和添加的操作都会很吃力吧应该

晚风撩人 2017-10-25 4 楼

静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放
所以只要程序不结束,静态变量占着内存不放,整个程序动行都在。整个应用的生命周期内一直占用资源,例如web应用每一次登录在static map cache中记录一个数据,而不(定期)清除。那么时间一长,这个东西非常大

灵芸 2017-10-23 3 楼

static的变量是在栈中的,而栈是JVM用来存放类的信息的,运行期内GC释放的是堆中的空间,所以这个不会被垃圾回收,JVM停止的时候static变量会被释放。不过定义为静态的,容易导致其常驻内存。

晚风撩人 2017-10-23 2 楼

用static的话很容易内存溢出的。因为static的变量是放在方法区里,方法区里的内容一般不会被回收(这个不绝对),当GC不去回收static的时候,就会一直占用内存,别说并发量大的时候,就是自己刷几下也会出现“outMemory”。而且用static,重启jvm之后也是会丢失的,真要做到缓存,就把内容放到内存里,而且是和应用解耦,比较好的方法就是memcached。
按照你的需求,完全可以把内容放到memcached上,通过一个后台程序定时将内容写入数据库,如果担心memcached丢掉数据,可以用第三方的消息队列,比如apache activemq

虐人心 2017-10-21 1 楼

放在静态变量不会丢失。
因为之后在JVM被释放的时候,才会被释放,但是有可能会造成常驻内存