A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李国荧 中级黑马   /  2014-8-17 18:26  /  1671 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李国荧 于 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:对象的强、软、弱和虚引用

13 个回复

倒序浏览
先mark下。。。好帖子
回复 使用道具 举报
呵呵……
回复 使用道具 举报
呵呵……
回复 使用道具 举报
呵呵……
回复 使用道具 举报
呵呵……
回复 使用道具 举报
呵呵……
回复 使用道具 举报
哈哈……
回复 使用道具 举报
哈哈……
回复 使用道具 举报
哈哈……
回复 使用道具 举报
好帖子不应该沉下去了!
回复 使用道具 举报
喂喂……
回复 使用道具 举报
喂喂……
回复 使用道具 举报
喂喂……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马