黑马程序员技术交流社区

标题: 交流贴:Java软引用(SoftReference)应用 [打印本页]

作者: 李国荧    时间: 2014-8-17 18:26
标题: 交流贴:Java软引用(SoftReference)应用
本帖最后由 李国荧 于 2014-8-17 18:31 编辑

使用软引用构建敏感数据的缓存二

(因为论坛帖子长度的限制,故拆分成2个帖子)
使用软引用构建敏感数据的缓存一

下面简单介绍一下java命令的2个参数,用来控制JVM启动时占用内存的大小。
-Xmx  用来指定JVM可以使用的最大内存(也就是说JVM只能使用这么多内存,不能再多了)
-Xms  用来指定JVM启动时初始的内存(JVM启动时申请的内存,以后如果不够了,再向OS申请,但不能超过上面的参数指定的大小)
示例:
java -Xmx2m -Xms2m org.lgy.study.reference.EmpolyeeCache
2m表示2兆,如果不加单位,默认是字节

上面我们指定了JVM可用的最大内存为2M,初始内存为2M,但实际情况却不是这样,看如下代码
  1. public class Test{
  2.     public static void main(String[] args){
  3.         System.out.println("max = " + (Runtime.getRuntime().maxMemory() / 1024 / 1024));
  4.         System.out.println("free = " + (Runtime.getRuntime().freeMemory() / 1024 / 1024));
  5.         System.out.println("total = " + (Runtime.getRuntime().totalMemory() / 1024 / 1024));
  6.     }
  7. }
复制代码
使用如下命令运行以上程序:
java -Xmx2m -Xmx2m Test

结果如下:
max = 7
free = 2
total = 3

从以上结果可以看出,即使我们指定JVM可用的最大内存为2M,但是实际JVM最大的可用内存却是7M,可能这是系统规定的(具体原因还没弄明白)。
所以我们必须在程序中通过编程的方式消耗一部分内存。

先定义一个Empolyee类,来表示雇员。
  1. package org.lgy.study.reference;

  2. public class Empolyee{
  3.     private String id;
  4.     private String name;
  5.     private String department;
  6.     private String phone;
  7.     private int salary;
  8.     //下面的a变量只为消耗一部分内存空间,占用了1M
  9.     //因为对于软可及对象,只有在系统内存不足时才会被回收,所以必须占用掉大部分内存
  10.     private byte[] a = new byte[1024*512*2];
  11.         
  12.     public Empolyee(String id){
  13.         this.id = id;
  14.         this.getDataFromInfoCenter();
  15.     }
  16.         
  17.     private void getDataFromInfoCenter(){
  18.         //下面的代码仅为测试,实际员工的信息应从数据库中查询
  19.         this.name = "***";
  20.         this.department = "xiaoshou";
  21.         this.phone = "13562558952";
  22.         this.salary = 5000;
  23.     }
  24.         
  25.     public String getId(){
  26.         return this.id;
  27.     }
  28. }
复制代码

下面定义Empolyee的缓存类:
  1. package org.lgy.study.reference;

  2. import java.util.Hashtable;
  3. import java.util.Set;
  4. import java.lang.ref.SoftReference;
  5. import java.lang.ref.ReferenceQueue;

  6. public class EmpolyeeCache{
  7.     private static EmpolyeeCache cache = null;
  8.     private Hashtable<String, EmpolyeeRef> empolyeeRefs = null;
  9.     private ReferenceQueue<Empolyee> refQue = null;
  10.         
  11.     private EmpolyeeCache(){
  12.     <span style="line-height: 2.2em;">   </span><span style="line-height: 2.2em;"> </span><span style="line-height: 2.2em;">this.empolyeeRefs = new Hashtable<String, EmpolyeeRef>();</span>
复制代码

运行结果:


参考:

Java:对象的强、软、弱和虚引用


作者: chengzhx76    时间: 2014-8-17 23:22
先mark下。。。好帖子
作者: 李国荧    时间: 2014-9-4 20:15
呵呵……
作者: 李国荧    时间: 2014-9-4 20:17
呵呵……
作者: 李国荧    时间: 2014-9-4 20:18
呵呵……
作者: 李国荧    时间: 2014-9-4 20:32
呵呵……
作者: 李国荧    时间: 2014-9-4 20:34
呵呵……
作者: 李国荧    时间: 2014-9-5 20:27
哈哈……
作者: 李国荧    时间: 2014-9-5 20:28
哈哈……
作者: 李国荧    时间: 2014-9-5 20:29
哈哈……
作者: 天邃任我桓    时间: 2014-9-5 20:59
好帖子不应该沉下去了!
作者: 李国荧    时间: 2014-9-6 07:14
喂喂……
作者: 李国荧    时间: 2014-9-6 07:16
喂喂……
作者: 李国荧    时间: 2014-9-6 07:18
喂喂……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2