对象引用 | 学习笔记

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

开发者学堂课程【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() 又占着其它的强引用的对象不放,那么我们就会出现一个逻辑上的死锁,所以这个时候就可以用引用来解决。

 

相关文章
|
5月前
|
缓存 Java
【JAVA】强引用、软引用、弱引用、幻象引用有什么区别?
幻象引用:幻象引用是最弱的引用类型,几乎不影响对象的生命周期。它们主要用于在对象被回收前进行某些预处理操作,例如在对象被销毁时执行特定的清理任务。
45 0
|
5月前
对象引用与值引用
对象引用与值引用的区别
|
缓存 Java 关系型数据库
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
199 1
|
缓存 Java
强引用,软引用,弱引用,幻象引用有什么区别?
强引用,软引用,弱引用,幻象引用有什么区别?
135 0
强引用,软引用,弱引用,幻象引用有什么区别?
|
关系型数据库 C语言 C++
C++ 对象的内存布局
来源:http://blog.csdn.net/haoel/article/details/3081328 前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主
1083 0
|
编译器 BI
对象内存布局 (2)
内容概要: 满足下面2个条件时, 1. 父类有虚函数,子类也有虚函数,但子类并没有重写或覆盖父类的虚函数 2. 非虚继承 类对象之内存布局 如果在Derived类中增加一个下面的虚函数,会怎么样呢?Base类和Derived类之间的关系如下:    新加入的虚函数定义如下: #i...
609 0
对象内存布局 (12)
下面来看看虚基类对对象内存布局的影响。虚基类的主要作用就是在所有的派生类中,保留且仅保留一份虚基类的suboject。   a. 一个虚基类的情况 #include using namespace std; class Base { public: int base...
837 0
对象内存布局 (7)
在对象内存布局 (5)的代码中,在Derived类中覆盖Base1中声明的vfBase1_1(),其他代码不变。修改后的代码如下: #include using namespace std; class Base1 { public: int m_base1; ...
574 0
对象内存布局 (8)
在内存对象布局 (5)的代码中,在Derived类中将三个基类中的虚函数分别覆盖一个,即分别覆盖Base1中声明的vfBase1_1(),Base2中声明的vfBase2_1()以及Base3中声明的vfBase3_1()。
633 0