【求讨论】java内存cache实现的疑惑
cache的实现无非是通过使用容器类型的数据结构(如map)把经常需要使用的数据存储到内存中,进行管理;包括数据的查看,同步,删除(过期机制)等。
?
有个疑惑:
1、JVM会去扫描cache所在区域并根据一定的GC策略去回收内存,如果cache中的数据还没到设定的过期时间(假设cache根据设定的过期时间进行淘汰)就被GC掉了,岂不是白cache这些数据了又被干掉了?
?
2、jvm是否存在不会被GC扫描的区域(编程可用的),如果有,在哪里?? 如果没有,那oracle是否有计划未来增加这样的特性:设置一个区域,专门用来存储程序启动时需要加载的一些数据,GC不会光顾;这样的话,实现cache效率会更高,也更可控。
1 楼 zhxing 2011-05-25 如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。 2 楼 shaomeng95 2011-05-25 zhxing 写道如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义 3 楼 haoxun 2011-05-26 首先楼主对于JVM的垃圾回收理解不太透彻;
首先JVM内存里面分好几个带每个带的回收周期也不一样;
再次JVM不会回收有引用的数据;试想如果你有个缓存机制,并且有实现这种缓存机制的数据结构,把这些需要缓存的数据的应用都保存在这个数据结构里面;对于这种有引用的数据JVM是不会回收的。 4 楼 freish 2011-05-26 shaomeng95 写道zhxing 写道如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。
那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义
装数据的容器,譬如map,必然在某个地方被强引用了(多为static),否则,你在代码中也没法找到这个map了,既然被强引用了,怎么会被垃圾回收呢!
LZ你想多了,如果这都能被回收,java也没人用了 5 楼 shaomeng95 2011-05-26 freish 写道shaomeng95 写道zhxing 写道如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。
那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义
装数据的容器,譬如map,必然在某个地方被强引用了(多为static),否则,你在代码中也没法找到这个map了,既然被强引用了,怎么会被垃圾回收呢!
LZ你想多了,如果这都能被回收,java也没人用了
老兄,你说的比较有道理 6 楼 liuyupy 2011-05-26 容器强引用、数据强(弱)引用(根据特性确定);不会被回收。。加个static你就更放心了。 7 楼 kingkan 2011-05-26 引用
1、JVM会去扫描cache所在区域并根据一定的GC策略去回收内存,如果cache中的数据还没到设定的过期时间(假设cache根据设定的过期时间进行淘汰)就被GC掉了,岂不是白cache这些数据了又被干掉了?
cache中的数据还没到设定的过期时间是不会被回收的,JVM不会回收有强引用的对象。
引用
2、jvm是否存在不会被GC扫描的区域(编程可用的),如果有,在哪里? 如果没有,那oracle是否有计划未来增加这样的特性:设置一个区域,专门用来存储程序启动时需要加载的一些数据,GC不会光顾;这样的话,实现cache效率会更高,也更可控。
JVM中有一块地方叫DirectMemory的位置,这块是不受GC光顾的。深入来说,这块是用于IO的临时缓冲使用区,在sun的Hotspot中有个unsafe的类可以对它进行操作管理。关于这块区域的发展,同样也有公司在扩展这一块,terracotta公司收购了ehcache缓存后,就推出了BigMemory的产品,就是对这一区域的扩展实现,你可以去了解一下。
顺便提一下,terracotta公司最近也被欧洲的软件集成商Software AG收购了,业界的发展都不断的在整合。 8 楼 shaomeng95 2011-05-26 kingkan 写道引用
1、JVM会去扫描cache所在区域并根据一定的GC策略去回收内存,如果cache中的数据还没到设定的过期时间(假设cache根据设定的过期时间进行淘汰)就被GC掉了,岂不是白cache这些数据了又被干掉了?
cache中的数据还没到设定的过期时间是不会被回收的,JVM不会回收有强引用的对象。
引用
2、jvm是否存在不会被GC扫描的区域(编程可用的),如果有,在哪里? 如果没有,那oracle是否有计划未来增加这样的特性:设置一个区域,专门用来存储程序启动时需要加载的一些数据,GC不会光顾;这样的话,实现cache效率会更高,也更可控。
JVM中有一块地方叫DirectMemory的位置,这块是不受GC光顾的。深入来说,这块是用于IO的临时缓冲使用区,在sun的Hotspot中有个unsafe的类可以对它进行操作管理。关于这块区域的发展,同样也有公司在扩展这一块,terracotta公司收购了ehcache缓存后,就推出了BigMemory的产品,就是对这一区域的扩展实现,你可以去了解一下。
顺便提一下,terracotta公司最近也被欧洲的软件集成商Software AG收购了,业界的发展都不断的在整合。
ehcache,正准备去学习,多谢你的回复,看来真有这样的圣地存在啊—irectMemory),请问兄台,有没有 不同虚拟机(hotspot,jrockit等)的GC策略对比的资料? 9 楼 ironsabre 2011-05-26 static 10 楼 ssmegold 2011-05-26 坛子里,讨论JVM的风气溅起啊 11 楼 suhuanzheng7784877 2011-05-26 http://suhuanzheng7784877.iteye.com/blog/1000646
希望对LZ有帮助,强static、引用都不会被回收,这也是为什么如果强引用没及时释放、静态变量使用超多,会发生内存溢出的error。 12 楼 kingkan 2011-05-26 shaomeng95 写道kingkan 写道引用
1、JVM会去扫描cache所在区域并根据一定的GC策略去回收内存,如果cache中的数据还没到设定的过期时间(假设cache根据设定的过期时间进行淘汰)就被GC掉了,岂不是白cache这些数据了又被干掉了?
cache中的数据还没到设定的过期时间是不会被回收的,JVM不会回收有强引用的对象。
引用
2、jvm是否存在不会被GC扫描的区域(编程可用的),如果有,在哪里? 如果没有,那oracle是否有计划未来增加这样的特性:设置一个区域,专门用来存储程序启动时需要加载的一些数据,GC不会光顾;这样的话,实现cache效率会更高,也更可控。
JVM中有一块地方叫DirectMemory的位置,这块是不受GC光顾的。深入来说,这块是用于IO的临时缓冲使用区,在sun的Hotspot中有个unsafe的类可以对它进行操作管理。关于这块区域的发展,同样也有公司在扩展这一块,terracotta公司收购了ehcache缓存后,就推出了BigMemory的产品,就是对这一区域的扩展实现,你可以去了解一下。
顺便提一下,terracotta公司最近也被欧洲的软件集成商Software AG收购了,业界的发展都不断的在整合。
ehcache,正准备去学习,多谢你的回复,看来真有这样的圣地存在啊—irectMemory),请问兄台,有没有 不同虚拟机(hotspot,jrockit等)的GC策略对比的资料?
网络上很多hotspot的GC策略。
Jrockit没怎么用,回答不了你。
13 楼 i2534 2011-05-26 public class SoftReference<T>extends Reference<T>
软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。
我想这个说明可以对LZ有一点帮助
14 楼 qjtttt 2011-05-27 被引用的情况下GC不会去回收,只有没有任何引用的情况下才可能执行回收,问题是没有引用的情况下你程序去调用缓存难道不会NullPointException? 15 楼 advantech 2011-05-27 很明显LZ问这个问题的时候没google过。 16 楼 shaomeng95 2011-05-27 advantech 写道很明显LZ问这个问题的时候没google过。
google最近被party搞的打不开啊 17 楼 ssmegold 2011-05-28 为什么我没有权限投帖子呢? 18 楼 nowaytj 2011-05-30 没看懂LZ是不懂回收的基本策略,还是咱没看懂LZ的意思,这话真纠结