(因为论坛帖子长度的限制,故拆分成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>
运行结果:
参考:
Java:对象的强、软、弱和虚引用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |