本帖最后由 李国荧 于 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,但实际情况却不是这样,看如下代码 - public class Test{
- public static void main(String[] args){
- System.out.println("max = " + (Runtime.getRuntime().maxMemory() / 1024 / 1024));
- System.out.println("free = " + (Runtime.getRuntime().freeMemory() / 1024 / 1024));
- System.out.println("total = " + (Runtime.getRuntime().totalMemory() / 1024 / 1024));
- }
- }
复制代码 使用如下命令运行以上程序:
java -Xmx2m -Xmx2m Test
结果如下: max = 7 free = 2 total = 3
从以上结果可以看出,即使我们指定JVM可用的最大内存为2M,但是实际JVM最大的可用内存却是7M,可能这是系统规定的(具体原因还没弄明白)。 所以我们必须在程序中通过编程的方式消耗一部分内存。
先定义一个Empolyee类,来表示雇员。 - package org.lgy.study.reference;
- public class Empolyee{
- private String id;
- private String name;
- private String department;
- private String phone;
- private int salary;
- //下面的a变量只为消耗一部分内存空间,占用了1M
- //因为对于软可及对象,只有在系统内存不足时才会被回收,所以必须占用掉大部分内存
- private byte[] a = new byte[1024*512*2];
-
- public Empolyee(String id){
- this.id = id;
- this.getDataFromInfoCenter();
- }
-
- private void getDataFromInfoCenter(){
- //下面的代码仅为测试,实际员工的信息应从数据库中查询
- this.name = "***";
- this.department = "xiaoshou";
- this.phone = "13562558952";
- this.salary = 5000;
- }
-
- public String getId(){
- return this.id;
- }
- }
复制代码
下面定义Empolyee的缓存类:
- package org.lgy.study.reference;
- import java.util.Hashtable;
- import java.util.Set;
- import java.lang.ref.SoftReference;
- import java.lang.ref.ReferenceQueue;
- public class EmpolyeeCache{
- private static EmpolyeeCache cache = null;
- private Hashtable<String, EmpolyeeRef> empolyeeRefs = null;
- private ReferenceQueue<Empolyee> refQue = null;
-
- private EmpolyeeCache(){
- <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>
复制代码
运行结果:
参考: |
|