学习笔记-java内存回收

//java修养  笔记-java的内存回收
//沉默有时候不是金子是孙子
		
//强引用:new                                  new出来的直接引用 		
//软引用 :SoftReference                        当系统内存不足时,回收对象,释放内存
//弱引用 :WeakReference  WeakHashMap           当系统调用调集回收机制时,回收内存
//虚引用:PhantomReference配合ReferenceQueue使用	虚引用和没有引用基本类似所以调用get()方法获取不到
/**
* SoftReference的实验需要修改内存变小才能看到现象
*/
SoftReference<String> sf=new SoftReference<String>(new String("aa"));
System.out.println(sf.get());
/**
* WeakReference演示在下面
*/
WeakReference<String> sf2=new WeakReference<String>(new String("bb"));
		
System.out.println(sf2.get());
System.gc();
System.runFinalization();
System.out.println(sf2.get());//java.lang.NullPointerException
/**
* PhantomReference虚引用需要配合ReferenceQueue队列来使用
*/
ReferenceQueue<String> rq=new ReferenceQueue<String>();
PhantomReference<String> sf3=new PhantomReference<String>(new String("cc"), rq);
System.out.println(sf3.get());
System.gc();
System.runFinalization();
System.out.println(rq.poll()==sf3);//将虚引用放入到了队列中
		
/**输出:
aa
bb
null
null
true
*/
		
//内存泄漏:例子 就像arraylist中的pop方法一样,每次取出一个值,将--size,然后把最后一个元素x[size]=null;这样可以防止内存泄漏
/**
* 内存压缩处理的三种方式:
* 1.复制 :将内存分为2块,然后遍历对象,将有引用的对象放到另一块内存,将原内存全部回收     当需要回收的对象少的时候比较方便  这样复制需要的内存就小
* 2.标记清除:遍历所有的对象,将有引用的对象标记,然后再次遍历所有的对象,释放所有没有标记的对象,会造成内存碎片较多
* 3.标记压缩 :采用前面2中方式来操作,将有引用的标记,复制到一块内存,对原内存回收
*/
		
/**
* java的堆内存分为:young,old,permanent三种
* yong:该区域可达对象少,采用复制
* old:经过多次遍历还存在的放到old,采用标记压缩
* permanent:永久保存,默认加载class,方法等信息 大小64M
 */
		
/**
* 内存使用小技巧:
* 1.当使用基本数据类型,尽量使用直接量   String str="a";少使用 String str=new String("a");
* 2.使用StringBuilder,少用StringBuffer
* 3.尽早释放无用对象,用完直接 xxx=null;
* 4.尽量少用static 变量,属于类对象,加载class的时候就加载了,释放对象不会释放到它,永久存在。
* 5.尽量少在常调用的方法、循环里面new对象
* 6.缓存经常使用的对象,比如HashMap 或者其他第三方开源缓存(要用好!)
* 7.不要随便调用finalize()方法,这样做你不仅仅是在针对你想释放的对象操作,它是需要复制或者遍历一大部分比如young内存。
* 8.适当的时候考虑使用SortReference 软引用
*/
		
		
		
//																zzg 	2014-10-17


你可能感兴趣的:(java,内存,内存泄漏)