java中垃圾回收的方法
1、第一点:java垃圾回收机制。在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。垃圾收集能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象, 而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。
2、第二点:检测垃圾算法。1、引用计数算法(Reference Counting)原理:给每个对象添加一引用计数器,每当有一个地方引用它,计数器+1 ,引用失效时就-1 。分析:引用计数算法很简单高效。但是,现在主流的虚拟机没有选用引用计数算法来管理内存,原因是它很难解决对象之间相互引用的问题。public class ReferenceCountingGC{ public Object instance = null; public static void testGC(){ ReferenceCountingGC objA = new ReferenceCountingGC (); ReferenceCountingGC objB = new ReferenceCountingGC (); objB.instance = objA; objA.instance = objB; objA = null; objB = null; System.gc(); }}此处objA,objB 不会回收,因为其还有其它引用2、可达性分析算法(Rearchability Analysis)原理:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。这里的根集一般包括java栈中引用的对象、方法区常良池中引用的对象、本地方法中引用的对象等。

3、第三点:对象的四种引用。强引用 :创建一个对象并把这个对象直接赋给一个变量,不管系统资源多么紧张,强引用的对象都不会被回收,即使他以后不会再用到。软引用 :通过SoftReference修饰的类,内存非常紧张的时候会被回收,其他时候不会被回收,在使用之前要判断是否为null从而判断他是否已经被回收了。弱引用 :通过WeakReference修饰的类,不管内存是否足够,系统垃圾回收时必定会回收。虚引用 :不能单独使用,主要是用于追踪对象被垃圾回收的状态。通过PhantomReference修饰和引用队列ReferenceQueue类联合使用实现。如下所示:分别是强,软,弱的测试,虚使用较少暂不介绍。


6、第六点:垃圾回收的方法1.对象被赋值null,或者手动释放User user = new User();user = null;或者System.gc();和Runtime.getRuntime().gc();等价2、弱引用如果一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存,使用弱引用 构建非敏感数据的缓存。弱引用申明:WeakReferenceweakReference=new WeakReference(new User());3、虚引用如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象 被垃圾回收的活动。虚引用申明:PhantomReference phantomReference=new PhantomReference(new User(),new ReferenceQueue());

7、小结实际开发中常用的小技巧:1、尽量使用直接变量,例如:String javaStr = “XXX”;2、使用 StringBuilder 和 StringBuffer 进行字符串连接等操作;3、尽早释放无用对象;4、尽量少使用静态变量;5、缓存常用的对象:可以使用开源的开源缓存实现,例如:OSCache,Ehcache;6、尽量不使用 finalize() 方法;7、在必要的时候可以考虑使用软引用 SoftReference。