java -Xmx2m-Xms2m Test // 修改jvm中Test类内存大小(待验证)
Java语言对对象的引用有四种类型:
1.强引用类型:直接把引用变量指向对象即为强引用,jvm的垃圾回收机制无法强制回收强引用的java对象。强引用是造成java内存泄漏的主要原因之一。
2.软引用类型:软引用通过SoftReference类来实现,当系统内存空间充足时,软引用的对象不会被系统回收,但当内存空间不足时,就会被系统回收。
注意:person[1].get()默认会运行Person的toString方法。person[1].get().getName();会得到name的值
class Person{ String name; int age; public Person(String name,int age){ this.name = name; this.age = age; } public void setName(String name){ this.name = name; } public String toString(){ return "Person[name="+name+",age="+age+"]"; } } class Test { public static void main(String[] args) { SoftReference<Person>[] person = new SoftReference[100]; for(int i= 0;i<person.length;i++){ person[i] = new SoftReference<Person>(new Person("name"+i,i+10)); } // person[1].get()默认会运行Person的toString方法。 //person[1].get().getName();会得到name的值 System.out.println(person[1].get()); // 通知系统进行垃圾回收 System.gc(); System.runFinalization(); // 垃圾回收机制运行之后,softReference数组里的元素保持不变 System.out.println(person[1].get()); } }
3.弱引用类型:通过WeakReference类来实现。不管系统内存空间是否充足,当系统垃圾回收机制运行时,总会回收该对象所占用的内存。(系统垃圾回收机制的运行时间是不能确定的)注意:不能使用String str = "abc";这样会存到字符串缓存中,GC不会回收缓存的字符串常量
1 class Test { 2 public static void main(String[] args) throws Exception{ 3 // 创建一个字符串对象(不能使用String str = "abc";这样会存到字符串缓存中,GC不会回收缓存的字符串常量) 4 String str = new String("abc"); 5 // 创建一个弱引用,让弱引用指向该对象 6 WeakReference<String> wr = new WeakReference<String>(str); 7 // 将str这个强引用清除 8 str = null; 9 System.out.println(wr.get()); 10 // 人为通知系统进行垃圾回收 11 System.gc(); 12 System.runFinalization(); 13 // 垃圾回收机制运行之后,WeakReference里的元素变为null 14 System.out.println(wr.get()); 15 } 16 }
4.虚引用类型: