1.引用的基本概念强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了 。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象 。
软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象 。
弱引用: 如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收 。弱引用的生命周期要比软引用短很多 。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存 。
虚引用:如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC 。
上面的四种引用对应的是new关键字以及JAVA.lang.ref包中的SoftReference,WeakReference, PhantomReference 。我们注意到在java.lang.ref包中,还存在一个类叫做ReferenceQueue 。
一、概述在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用 。在这四个引用类型中,只有强引用FinalReference类是包内可见,其他三种引用类型均为public,可以在应用程序中直接使用 。引用类型的类结构如图所示 。
文章插图
二、强引用平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了 。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它 。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题 。
Java中的引用,类似C语言中最难的指针 。(我是C语言入门编程,指针的概念还是很深入我心 。)通过引用,可以对堆中的对象进行操作 。如:
StringBuffer stringBuffer = new StringBuffer("Helloword");
变量str指向StringBuffer实例所在的堆空间,通过str可以操作该对象 。
文章插图
强引用的特点:
- 强引用可以直接访问目标对象 。
- 强引用所指向的对象在任何时候都不会被系统回收 。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象 。
- 强引用可能导致内存泄漏 。
软引用是除了强引用外,最强的引用类型 。可以通过java.lang.ref.SoftReference使用软引用 。一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收 。当堆使用率临近阈值时,才会去回收软引用的对象 。因此,软引用可以用于实现对内存敏感的高速缓存 。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收 。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用 。一旦垃圾线程回收该Java对象之后,get()方法将返回null 。
下面举一个例子说明软引用的使用方法 。
在你的IDE设置参数-Xmx2m -Xms2m规定堆内存大小为2m 。
文章插图
运行结果:
文章插图
打开被注释掉的new byte[1024*100]语句,这条语句请求一块大的堆空间,使堆内存使用紧张 。并显式的再调用一次GC,结果如下:
文章插图
说明在系统内存紧张的情况下,软引用被回收 。
四、弱引用(WeakReference):如果一个对象只具有弱引用,那就类似于可有可物的生活用品 。弱引用与软引用的区别在于:只具有弱引用的对象拥有更 短暂的生命周期 。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存 。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象 。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联 的引用队列中 。
推荐阅读
- python中全部关于字符串常用操作的总结
- Java命名规范
- 内存条的时序是什么?
- 蟑螂咬柜子声音大吗 蟑螂会发出吱吱的声音吗
- ping 多台服务器并在类似 top 的界面中显示
- 请问飞机上什么东西不能带 上飞机不能带的东西有哪些
- 集成显卡和独立显卡的区别
- 关于垃圾处理的方法有哪些 油漆桶属于什么垃圾分类
- js实现继承的方法以及优缺点
- CPU的一二三级缓存有什么用处?