对象引用 | 学习笔记

简介: 快速学习对象引用。

开发者学堂课程【Java 面试疑难点串讲1:面试技巧及语言基础:对象引用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/24/detail/501


对象引用

 

内容介绍

一、内存分配

二、垃圾回收


一、内存分配

JDK 1.2 开始实际上就提出有四种引用关系:强引用、软引用、弱引用、虚引用。

很多的时候你可能并不需要你再去编写这样的代码,但是对于这些概念你必须清楚。

1、强引用:对象将一直被进行引用,即使出现了“OutOfMemeryError”错误信息。

package cn.mldn.demo;
public class TestRefDemo (
public static void main(String[] args) {
Object obj = new Object(); //
实例化对象Object ref = obj;//强引用,默认的状态就属于强引用状态obj = null; //原始的对象断开引用,但是ref依然引用着System.gc();//垃圾收集

System.out.println(ref);

二、垃圾回收

1、软引用:

对象将被尽可能长时间的保存,一直到出现内存不足的情况下才会被回收,所以这样的操作很多时候将其用于缓存的开发上,

例如,在 MyBatis.里面就提供有对于软引用模式的缓存模式。

package cn.mldn.demo;
import java.lang.ref.SoftReference;
public class TestRefDemo {
public static void main(String[] args) {
Object obj = new Object(); //
实例化对象//发生了一个软引用SoftReference<object> ref = new SoftReference<object>(obj);

obj = null ; // 断开连接System.gc();//进行垃圾收集System.out.println(ref.get());

注:如果说这个时候出现了内存不足的问题,那么才会进行回收,也就是说对象会尽可能的保存时间长一些。

 

2.  弱引用:

一旦有了垃圾收集操作之后就会进行回收

package cn.mldn.demo;
import java.util.Map;
import java.util.WeakHashMap;
public class TestRefDemo {
public static void main(String[] args) {
String str = newString("
极限IT") ;
0bject obj= new 0bject();//
实例化对象Map<String,0bject> map= new WeakHashMap<String ,0bject>() ;

map.put(str, obj) ; //追加了弱引用System.out.println("GC执行之前"+map.get(str));

str =
System.gc();
System.out.println("GC
执行之后" + map.get(str));

3.虚引用(幽灵引用),这种操作返回的内容永远都是 null ,就是不引用;

package cn.mldn.demo;
import java.lang.ref.PhantomReference;

import java.lang.ref.ReferenceQueue;
public class TestRefDemo {
public static void main(String[] args) {
Object obj = new0bject();
ReferenceQueue<0bject> queue = new ReferenceQueue<0bject>();

PhantomReference<0bject> pr = new PhantomReference<0bject>(object)

System.gc();
System.out.println(pr·get());

注:在对象垃圾收集前一定会调用 finalize() 方法,但是如果说 finalize() 又占着其它的强引用的对象不放,那么我们就会出现一个逻辑上的死锁,所以这个时候就可以用引用来解决。

 

相关文章
|
6月前
对象引用与值引用
对象引用与值引用的区别
|
存储 程序员 编译器
对象引用和对象指针
对象引用和对象指针
|
缓存 Java 关系型数据库
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
212 1
|
关系型数据库 C语言 C++
C++ 对象的内存布局
来源:http://blog.csdn.net/haoel/article/details/3081328 前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主
1087 0
对象内存布局 (10)
在对象内存布局 (9)基础上做些修改:派生类override基类的虚函数,即Base2 override Base1中声明的虚函数vfBase1(),Base3 override Base1中声明的虚函数vfBase1()和Base2中声明的虚函数vfBase2(), Derived override Base1中声明的虚函数vfBase1()、Base2中声明的虚函数vfBase2()和Base3中声明的虚函数vfBase3()。
685 0
对象内存布局 (9)
假定多层继承的各类之间的关系如下图。假定派生类不override基类的虚函数,即Base2不override Base1中声明的虚函数vfBase1(),Base3不override Base2中声明的虚函数vfBase2(),Derived不override Base3中声明的虚函数vfBase3()。
614 0
|
编译器
对象内存布局 (11)
注意:关于内存对齐(memory alignment),请看关于内存对齐问题,后面将会用到。   下面我们进行在普通继承(即非虚继承)时,派生类的指针转换到基类指针的情形研究。假定各类之间的关系如下图:   代码如下: #include using namespace std;...
685 0
对象内存布局 (5)
内容概要: 满足下面3个条件时, 1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数 2. 非虚继承 3. 多重继承 类对象之内存布局 多重继承,派生类不重写基类中的虚函数。
679 0