`
shaomeng95
  • 浏览: 222142 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多

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

 

有个疑惑:

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

 

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

分享到:
评论
18 楼 nowaytj 2011-05-30  
没看懂LZ是不懂回收的基本策略,还是咱没看懂LZ的意思,这话真纠结
17 楼 ssmegold 2011-05-28  
为什么我没有权限投帖子呢?
16 楼 shaomeng95 2011-05-27  
advantech 写道
很明显LZ问这个问题的时候没google过。

google最近被party搞的打不开啊
15 楼 advantech 2011-05-27  
很明显LZ问这个问题的时候没google过。
14 楼 qjtttt 2011-05-27  
被引用的情况下GC不会去回收,只有没有任何引用的情况下才可能执行回收,问题是没有引用的情况下你程序去调用缓存难道不会NullPointException?
13 楼 i2534 2011-05-26  
public class SoftReference<T>extends Reference<T>
软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。
我想这个说明可以对LZ有一点帮助
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,正准备去学习,多谢你的回复,看来真有这样的圣地存在啊(DirectMemory),请问兄台,有没有 不同虚拟机(hotspot,jrockit等)的GC策略对比的资料?


网络上很多hotspot的GC策略。

Jrockit没怎么用,回答不了你。
11 楼 suhuanzheng7784877 2011-05-26  
http://suhuanzheng7784877.iteye.com/blog/1000646
希望对LZ有帮助,强static、引用都不会被回收,这也是为什么如果强引用没及时释放、静态变量使用超多,会发生内存溢出的error。
10 楼 ssmegold 2011-05-26  
坛子里,讨论JVM的风气溅起啊
9 楼 ironsabre 2011-05-26  
static
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,正准备去学习,多谢你的回复,看来真有这样的圣地存在啊(DirectMemory),请问兄台,有没有 不同虚拟机(hotspot,jrockit等)的GC策略对比的资料?
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收购了,业界的发展都不断的在整合。
6 楼 liuyupy 2011-05-26  
容器强引用、数据强(弱)引用(根据特性确定);不会被回收。。加个static你就更放心了。
5 楼 shaomeng95 2011-05-26  
freish 写道
shaomeng95 写道
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

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



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

老兄,你说的比较有道理
4 楼 freish 2011-05-26  
shaomeng95 写道
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

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



装数据的容器,譬如map,必然在某个地方被强引用了(多为static),否则,你在代码中也没法找到这个map了,既然被强引用了,怎么会被垃圾回收呢!
LZ你想多了,如果这都能被回收,java也没人用了
3 楼 haoxun 2011-05-26  
首先楼主对于JVM的垃圾回收理解不太透彻;
首先JVM内存里面分好几个带每个带的回收周期也不一样;
再次JVM不会回收有引用的数据;试想如果你有个缓存机制,并且有实现这种缓存机制的数据结构,把这些需要缓存的数据的应用都保存在这个数据结构里面;对于这种有引用的数据JVM是不会回收的。
2 楼 shaomeng95 2011-05-25  
zhxing 写道
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

那如何保证装数据对象的容器(如hashmap)不会被GC回收呢。我的意思不是装在容器内的(有引用的)对象被回收,可能是我的文字表达有歧义
1 楼 zhxing 2011-05-25  
如果gc把有引用的对象都回收掉,那JVM就恐怖了。。。lz看下gc的回收策略吧。。或许你能明白。

相关推荐

    java连接cache数据库说明,数据库驱动,cache可视化工具

    在Java环境中,我们通常通过JDBC(Java Database Connectivity)驱动来实现与Cache数据库的连接。以下是一些关键知识点: 1. **JDBC驱动**:为了在Java中连接Cache数据库,首先需要安装并配置Cache的JDBC驱动。...

    如何基于LoadingCache实现Java本地缓存

    Java 本地缓存基于 LoadingCache 实现详解 在 Java 中,缓存是一种提高应用程序性能的重要手段。 LoadingCache 是 Guava 库提供的一种缓存实现方式,本文将详细介绍如何基于 LoadingCache 实现 Java 本地缓存。 一...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    "java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码" 在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过...

    Java cache 实现

    Java Cache 实现的知识点总结 Java cache 实现是指在 Java 项目中使用缓存机制来存储数据,以提高应用程序的性能和效率。在这里,我们使用 Java 实现了一个简单的缓存系统,使用 HashMap 来存储缓存数据,并提供了...

    基于memcached client for java的cache封装

    Memcached是一种广泛使用的分布式内存对象缓存系统,它能够减轻数据库的负担,通过将常用数据存储在内存中来加速应用程序的响应速度。本主题将深入探讨如何基于Java客户端对Memcached进行封装,以便更高效地在Java...

    java 缓存 cache lru 实例

    java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例

    java Map实现的cache manager,定时清除缓存里面的值

    java Map实现的cache manager,定时清除缓存里面的值,使数据一致保持最新

    Cache的简单实现(java版)

    Java作为广泛应用的编程语言,有许多方式可以实现缓存机制。本文将详细介绍如何使用Java实现三种常见的缓存策略:随机缓存(Random)、先进先出缓存(FIFO)以及最近最不常用缓存(LRU)。 首先,我们来理解缓存的...

    J2Cache 基于内存和 Redis 的两级 Java 缓存框架

    J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2...

    cache2k, 轻量级,高性能的Java缓存.zip

    cache2k, 轻量级,高性能的Java缓存 cache2k缓存cache2k是内存高性能的Java缓存库。 Cache,String&gt; cache = new Cache2kBuilder, String&gt;

    Java中各类Cache机制实现解决方案

    ### Java中各类Cache机制实现解决方案 #### 一、概述 在现代软件开发中,缓存技术是提升系统性能的关键手段之一。通过缓存频繁访问的数据,可以显著减少对后端数据库的压力,从而提高应用程序的响应速度和用户体验...

    java实现cache小实例

    在Java编程中,缓存(Cache)是一种常用的技术,用于提高数据访问的速度。它通过存储最近或频繁访问的数据,使得再次请求时能快速获取,从而减少了对底层数据源的访问次数,提升了系统的性能。本实例将展示如何使用...

    java cache 简单应用

    在本文中,我们将深入探讨Java缓存的简单应用,并结合给出的资源——“JAVA的缓存应用.ppt”来进行讨论。 首先,让我们了解什么是缓存。缓存是计算机系统中用于临时存储数据的快速访问区域,目的是减少从主存储器或...

    Java LocalCache 本地缓存的实现实例

    Java LocalCache 本地缓存的实现实例 Java LocalCache 本地缓存的实现实例主要介绍了两种LocalCache的实现方法,一种是基于ConcurrentHashMap实现基本本地缓存,另外一种是基于LinkedHashMap实现LRU策略的本地缓存...

    Java 中常用缓存Cache机制的实现

    Java 中常用缓存Cache机制的实现 缓存机制是指将程序或系统经常要调用的对象存在内存中,以便快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。缓存主要可分为二大类:一、通过文件...

    CacheSim-master_java_cache仿真_cache仿真程序_cache_

    CacheSim-master是一个使用Java语言实现的Cache仿真项目,它主要用于模拟和分析缓存的工作原理及效率,特别是LRU(Least Recently Used)替换算法。LRU算法是一种常见的缓存管理策略,当缓存空间满时,最近最少使用...

    JAVA缓存入门文档..Cache

    EHCache 是一个纯 Java 缓存实现,主要用于提高应用程序性能。它通过在内存中缓存数据来减少对数据库或其他外部系统的调用次数,从而加快应用响应速度。EHCache 可以作为一个本地缓存解决方案,也可以作为分布式缓存...

    计算机网络编程实现WebCaching

    用计算机网络知识,Java实现** 编程实现Web Caching (Java)。 1.Web Cache可同时为多个客户提供服务; 2.Web Cache接收用户的请求,并将请求的对象返回客户(浏览器); 2.1 Web Cache监听客户请求;

Global site tag (gtag.js) - Google Analytics