GC

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.虚引用类型:

猜你喜欢

转载自www.cnblogs.com/zhlblogs/p/9139443.html
GC