Java - GC 垃圾回收机制

引用类型

强引用:创建一个对象并把这个对象直接赋给一个变量,不管系统资源多么紧张,强引用的对象都不会被回收,即使他以后不会再用到。

虚引用:不能单独使用,通过 PhantomReference 修饰和引用队列 ReferenceQueue 类联合使用。主要是用于追踪对象被垃圾回收的状态。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

软引用 & 弱引用的区别

软引用:通过 SoftReference 修饰的类,内存非常紧张的时候会被回收。这一点可以很好地用来解决 OOM 的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。在使用之前要判断是否为null从而判断他是否已经被回收了。

弱引用:通过 WeakReference 修饰的类,系统 GC 扫描到其只存在弱引用时便会回收。WeakReference 一般用来防止内存泄漏,但因为 GC 优先级低,不会很快回收。
弱引用对于构造弱集合最有用,WeakHashMap 也被添加到 JDK 1.2 的类库中,它对键(而不是对值)使用弱引用。如果在一个普通 HashMap 中用一个对象作为键,那么这个对象在映射从 Map 中删除之前不能被回收,WeakHashMap 使您可以用一个对象作为Map 键,同时不会阻止这个对象被垃圾收集。WeakHashMap 用弱引用承载映射键,这使得应用程序不再使用键对象时它们可以被垃圾收集,get() 实现可以根据 WeakReference.get() 是否返回 null 来区分死的映射和活的映射。

弱/软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中,进行其他与该对象相关内存的回收,如HashMap中的Key被回收,则Entry应该被回收。这就是JVM的工作了。

   软引用解决图片缓存的问题

   https://www.cnblogs.com/dolphin0520/p/3784171.html

   弱应用解决HashMap中的oom问题

   https://www.ibm.com/developerworks/cn/java/j-jtp11225/

软引用和弱引用的使用场景

使用:

有一个 Product 对象 pA:

Product pA = new Product(...);

使用一个指向 Product 对象的弱引用对象来作为 HashMap 的 key,只需这样定义这个弱引用对象:

WeakReference<Product> weakPA = new WeakReference<>(pA);

现在,若引用对象weakProductA就指向了Product对象productA。那么我们怎么通过weakProduct获取它所指向的Product对象productA呢?很简单,只需要下面这句代码:

Product product = weakPA.get();

垃圾回收的方法

1.对象被赋值null,或者手动释放

User user = new User();user = null;

或者

System.gc();和Runtime.getRuntime().gc();等价

2、弱引用

如果一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存,使用弱引用 构建非敏感数据的缓存。

弱引用申明:

WeakReference weakReference=new WeakReference(new User());

3、虚引用

如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象 被垃圾回收的活动。

虚引用申明:

PhantomReference phantomReference=new PhantomReference(new User(), new ReferenceQueue());

在这里插入图片描述

java中垃圾回收的方法

实际开发中常用的小技巧:

1、尽量使用直接变量,例如:String javaStr = “XXX”;

2、使用 StringBuilder 和 StringBuffer 进行字符串连接等操作;

3、尽早释放无用对象;

4、尽量少使用静态变量;

5、缓存常用的对象:可以使用开源的开源缓存实现,例如:OSCache,Ehcache;

6、尽量不使用 finalize() 方法;

7、在必要的时候可以考虑使用软引用 SoftReference。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值