论坛首页 Java企业应用论坛

【求讨论】java内存cache实现的疑惑

浏览 8060 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (10)
作者 正文
   发表时间:2011-05-25   最后修改:2011-05-25

cache的实现无非是通过使用容器类型的数据结构(如map)把经常需要使用的数据存储到内存中,进行管理;包括数据的查看,同步,删除(过期机制)等。

 

有个疑惑:

1、JVM会去扫描cache所在区域并根据一定的GC策略去回收内存,如果cache中的数据还没到设定的过期时间(假设cache根据设定的过期时间进行淘汰)就被GC掉了,岂不是白cache这些数据了又被干掉了?

 

2、jvm是否存在不会被GC扫描的区域(编程可用的),如果有,在哪里?  如果没有,那oracle是否有计划未来增加这样的特性:设置一个区域,专门用来存储程序启动时需要加载的一些数据,GC不会光顾;这样的话,实现cache效率会更高,也更可控。

   发表时间:2011-05-25  
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。
0 请登录后投票
   发表时间:2011-05-25  
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义
0 请登录后投票
   发表时间:2011-05-26  
首先楼主对于JVM的垃圾回收理解不太透彻;
首先JVM内存里面分好几个带每个带的回收周期也不一样;
再次JVM不会回收有引用的数据;试想如果你有个缓存机制,并且有实现这种缓存机制的数据结构,把这些需要缓存的数据的应用都保存在这个数据结构里面;对于这种有引用的数据JVM是不会回收的。
0 请登录后投票
   发表时间:2011-05-26  
shaomeng95 写道
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义



装数据的容器,譬如map,必然在某个地方被强引用了(多为static),否则,你在代码中也没法找到这个map了,既然被强引用了,怎么会被垃圾回收呢!
LZ你想多了,如果这都能被回收,java也没人用了
0 请登录后投票
   发表时间:2011-05-26  
freish 写道
shaomeng95 写道
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义



装数据的容器,譬如map,必然在某个地方被强引用了(多为static),否则,你在代码中也没法找到这个map了,既然被强引用了,怎么会被垃圾回收呢!
LZ你想多了,如果这都能被回收,java也没人用了

老兄,你说的比较有道理
0 请登录后投票
   发表时间:2011-05-26  
容器强引用、数据强(弱)引用(根据特性确定);不会被回收。。加个static你就更放心了。
0 请登录后投票
   发表时间:2011-05-26   最后修改: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收购了,业界的发展都不断的在整合。
0 请登录后投票
   发表时间: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,正准备去学习,多谢你的回复,看来真有这样的圣地存在啊(DirectMemory),请问兄台,有没有 不同虚拟机(hotspot,jrockit等)的GC策略对比的资料?
0 请登录后投票
   发表时间:2011-05-26  
static
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics