java缓存回收_java缓存应用 - 阿亮ing的个人空间 - OSCHINA - 中文开源技术交流社区...

缓存回收策略

1.基于空间

设置缓存的存储空间,超过容量限制按照一定的规则去移除。

2.基于容量

当缓存条数超过规定容量按照一定的规则去移除旧数据。

3.基于时间(存活时间空闲时间)

TTl(Time To Live):存活期,缓存数据最后更新时间到指定时间如果没有更新或创建则进行过期清除。 TTI(Time To Idle):空闲期,当缓存数据多久没有访问就从缓存中移除。 4.基于对象的引用 软引用:当JVM内存不足时,垃圾回收会回收掉这些软引用,腾出空间避免OOM。 弱引用:当进行垃圾回收的时候会被回收掉。(注意:只有在没有强应用去引用它的时候才会被回收)

public static void testReference() {

School so = new School();

WeakReference s = new WeakReference(new Student("z"));

//通过强引用去引用它,通过注释这行可以观察出有没有强引用去引用它时候的变化

so.students.add(s.get());

//手动触发gc

System.gc();

System.out.println(s.get());

}

class Student {

private String name;

public Student(String name) {

this.name = name;

}

}

class School {

public List students = new ArrayList();

}

缓存回收算法

使用基于空间和基于容量的会使用一定的策略移除旧数据,常见的如下。

FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除。

LRU(Least Recently Used):最近最少使用算法,使用时间距离现在最久的那个被移除。

LFU(Least Frequently Used):最不常用算法,一定时间段内使用次数(频率)最少的那个被移除。

实际应用中基于LRU的缓存居多,如Guava Cache、Ehcache支持LRU。 ##缓存类型

堆缓存:使用Java堆内存来存储缓存对象。使用堆缓存的好处是没有序列化/反序列化,是最快的缓存。缺点也很明显,当缓存的数据量很大时, GC暂停时间会变长,存储容量受限于堆空间大小。一般通过软引用/弱引用来存储缓存对象,即当堆内存不足时,可以强制回收这部分内存释放堆内存空间。一般使用堆缓存存储较热的数据。可以使用Guava Cache、Ehcache 3.x、MapDB实现。

堆外缓存:即缓存数据存储在堆外内存,可以减少GC暂停时间(堆对象转移到堆外,GC扫描和移动的对象变少了),可以支持更大的缓存空间(只受机器内存大小限制,不受堆空间的影响)。但是,读取数据时需要序列化/反序列化,因此,会比堆缓存慢很多。可以使用Ehcache 3.x、MapDB实现。

磁盘缓存:即缓存数据的存储在磁盘上,当JVM重启时数据还是在的。而堆缓存/堆外缓存重启时数据会丢失,需要重新加载。可以使用Ehcache 3.x、MapDB实现。

分布式缓存:上文提到的缓存是进程内缓存和磁盘缓存,在多JVM实例的情况时,会存在两个问题:1.单机容量问题;2.数据一致性问题(多台JVM实例的缓存数据不一致怎么办),不过,这个问题不用太纠结,既然数据允许缓存,则表示允许一定时间内的不一致,因此,可以设置缓存数据的过期时间来定期更新数据;3.缓存不命中时,需要回源到DB/服务查询变多:每个实例在缓存不命中情况下都会回源到DB加载数据,因此,多实例后DB整体的访问量就变多了,解决办法可以使用如一致性哈希分片算法来解决。因此,这些情况可以考虑使用分布式缓存来解决。可以使用ehcache-clustered(配合Terracotta server)实现Java进程间分布式缓存。当然也可以使用如Redis实现分布式缓存。

b7UXPW8.png

我们根据各自缓存的特点可以设置为多级缓存。比如可以将堆缓存设置为1级缓存,存储一些热数据。将堆外或者磁盘设置为二级缓存,将分布式缓存集群设置为三级缓存。后面文章再写各自缓存的具体示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 生成打印送货单,PHP输出PDF打印HTML5+CSS3打印格式控制

ERP系统进入尾声,各种送货单、退货单、合同、对账单等等一系列的东东排着队调打印格式。HTML5CSS3已经这样流行,然则眼下,基于CSS3的打印控制,居然还处于原始部落阶段,Chrome、Firefox、Edge等连简单的page都支持得不完…

备案php代码,备案查询API PHP代码

在线演示http://tool.ayangw.com/beian/?urlqq.com使用方法1.创建一个php文件&#xff0c;比如beian.php&#xff0c;将下方代码复制2.访问接口域名/beian.php?urlqq.comPHP代码<?php /*** 0en.cn*/error_reporting(0);$u $_GET[url];var_dump();if(!isset($u)){echo ?…

帝国cms php替换,帝国CMS内容关键字替换图片标签解决方法

1、在 e/class/userfun.php 里面增加//替换正文IMG里的ALT内容functionuser_imgalt($mid,$f,$isadd,$isq,$value,$cs){$title$_POST[title];$htmls$value;$pattern "/]>/";preg_match_all($pattern, $htmls, $matches);for($i0; $i<count($matches[0]); $i) {p…

php类的举例,用类来代替递归方法,用php举例_php _ 搞代码

问题&#xff1a;一个楼梯有n个台阶&#xff0c;每次上一个或两个台阶&#xff0c;共有多少种上法, 每种走法的步骤是什么样的&#xff1f;这个简单问题&#xff0c;我们通常的方法是写一个递归调用&#xff0c;简单明了。但是&#xff0c;这里通过类的叠加来实现&#xff0c;虽…

easyexcel安全扫描报php,easyExcel使用以及踩过的坑

easyExcel介绍:Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是…

用python做人脸识别的程序怎么做,10分钟学会使用python实现人脸识别(附源码)

前言今天&#xff0c;我们用Python实现简单的人脸识别技术&#xff01;Python里&#xff0c;简单的人脸识别有很多种方法可以实现&#xff0c;依赖于python胶水语言的特性&#xff0c;我们通过调用包可以快速准确的达成这一目的。这里介绍的是准确性比较高的一种。一、首先梳理…

matlab是那个国家,这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色,拍摄的时候反光比较少...

这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色&#xff0c;拍摄的时候反光比较少2016-08-22 0 0 0 暂无评分其他1积分下载如何获取积分&#xff1f;这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色&#xff0c;拍摄的…

oracle中12523,【Oracle】静态监听导致的ORA-12523错误

今天配置完共享服务器模式之后发现登录过程中报错ORA-12523&#xff0c;排查错误之后发现是静态监听惹的祸。本机之上有两个监听&#xff0c;一个静态监今天配置完共享服务器模式之后发现登录过程中报错ORA-12523&#xff0c;排查错误之后发现是静态监听惹的祸。本机之上有两个…

线性回归中oracle性质,66.Oracle数据库SQL开发之 高级查询——使用线性回归函数...

66.Oracle数据库SQL开发之 高级查询——使用线性回归函数线性回归函数可以用普通最小平方回归曲线拟合一组数值对。线性回归函数可用于聚合、串口或报表函数。如下图1&#xff1a;例如&#xff1a;storePDB1> selectprd_type_id,regr_avgx(amount,month) as avgx,regr_avgy(…

linux 源码目录结构,分析Android 源代码编译前后的目录结构

我们看没有编译前的项目目录大致的情况如下 &#xff1a;在树结构中我们可以了解的有如下一些信息分析&#xff1a;1. getSplashy 项目名称&#xff1b;2. src 项目程式&#xff1b;3. com 早…

linux vps 运行exe文件夹,在centos环境下运行.exe文件

首先要了解一下Wine&#xff1a;Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux&#xff0c;Mac OSX 及 BSD 等)上运行 Windows 应用的兼容层。Wine (Wine Is Not an Emulator)[即Wine不是一个模拟器]是一个在Linux和U…

linux服务器u盘启动项检测不到,将U盘设置为第一启动项之后却检测不到U盘怎么办?...

对于如何使用U盘装系统&#xff0c;想必看过小编之前介绍的朋友应该大致都清楚了吧?虽然说咱们使用U盘装系统的操作步骤还是比较简单的&#xff0c;但是却必须要满足一个条件&#xff0c;那便是将咱们的U盘设置为第一启动项&#xff0c;那么如何进行设置呢?这便需要在咱们win…

linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞

发布日期&#xff1a;2010-09-21更新日期&#xff1a;2010-09-27受影响系统&#xff1a;Linux kernel 2.6.x不受影响系统&#xff1a;Linux kernel 2.6.36-rc4描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: …

linux6无法启动iscsi服务,RHEL6下安装配置ISCSI服务器

1.安装所需软件:yum –y install scsi-target-utils iscsi-initiator-utils功能说明:scsi-target-utils&#xff1a;用来将 Linux 系统仿真成为 iSCSI target 的功能&#xff1b;iscsi-initiator-utils&#xff1a;挂载来自 target 的磁盘到 Linux 本机上。2.target的设定:----…

linux socat rpm,RabbitMQ系列(三)RabbitMQ Server的安装(基于Linux RPM)

提示&#xff1a;在Fedora和RHEL仓库中包含了RabbitMQ&#xff0c;但这些版本往往是滞后的且不再被支持&#xff0c;我们建议你使用PackageCloud或者Bintray的Yum仓库进行安装&#xff1b;RabbitMQ RPM包将需要sudo特权来安装和管理。在没有sudo的环境中&#xff0c;可以考虑使…

每天一个linux命令博客nano,11 个鲜为人知的 Linux 命令(1)

英文&#xff1a;Tecmint&#xff0c;编译&#xff1a;Linux中国linux.cn/article-2258-1.html如有好文章Linux命令行吸引了大多数Linux爱好者。一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务。Linux命令和它们的转换对于Linux用户、Shell脚本程序员和管理员来说…

android 标题样式,Android定义各种样式的标题栏:requestWindowFeature()

最近在网上看到一篇介绍Android window的requestWindowFeature()的使用方法&#xff0c;共享出来大家学习学习requestWindowFeature(Window.FEATURE_LEFT_ICON);setContentView(R.layout.dialog_activity);getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, a…

m1笔记本android开发,Apple M1设备开发Android小tips

虽然m1来开发android是挺有优势的&#xff0c;苦于google目前还没有支持m1芯片的android studio版本(包括测试版) 截稿日期2021-5-14&#xff0c;所以我们当下可以选择idea2021&#xff0c;原生支持m1&#xff0c;而且编译速度运行效率更快(同时也会让你失去摸鱼时间)&#xff…

harmonyOS智慧屏,在鸿蒙HarmonyOS智慧屏上实现一款粗糙的计算器

在学习的路上我们不能只是停留在对理论知识的理解&#xff0c;还应该将理论和实战进行结合&#xff0c;这样才有利于我们能够更有深度的掌握知识&#xff0c;最终形成自己的知识体系结构。我们在实战的时候&#xff0c;不仅可以巩固我们的理论知识&#xff0c;还能够在实战中发…

imx6 android快速启动,android启动不起来(已解决)

我使用imx6dl,使用JB4.3.3-1.1.0版本&#xff0c;但在启动的时候最后停在了Freeing init memory: 232K&#xff0c;就没了动静&#xff0c;各位大侠帮忙分析一下吧&#xff1a;以下是log:U-Boot 2009.08 ( 1&#xfffd;&#xfffd;月 08 2014 - 15:47:46)CPU: Freescale i.MX…