面试题:Java中的引用类型有哪几种?特点是什么?

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

Java中引用类型及特点


  • 强 引用: 最普通的引用 Object o = new Object()
  • 软 引用: 垃圾回收器, 内存不够的时候回收 (缓存)
  • 弱 引用: 垃圾回收器看见就会回收 (防止内存泄漏)
  • 虚 引用: 垃圾回收器看见二话不说就回收,跟没有一样 (管理堆外内存) DirectByteBuffer -> 应用到NIO Netty
finalize(): 当对象被回收时, finalize()方法会被调用, 但是不推荐使用去回收一些资源,因为不知道他什么时候会被调用, 有时候不一定会调用
  1. public class C {
  2.     @Override
  3.     protected void finalize() throws Throwable {
  4.         System.out.println("finalize");
  5.     }
  6. }
复制代码
强引用

正常引用,但没有人指向的时候就会被回收
  1. import java.io.IOException;
  2. /**
  3. * 强引用
  4. */
  5. public class R1_NormalReference {
  6.     public static void main(String[] args) throws IOException {
  7.         //正常引用
  8.         C c = new C();
  9.         c = null;//没人指向
  10.         System.gc();//DisableExplicitGC
  11.         //阻塞一下,方便看结果
  12.         System.in.read();
  13.     }
  14. }
复制代码
软引用

垃圾回收器, 内存不够的时候回收 (缓存)
  1. import java.io.IOException;
  2. import java.lang.ref.SoftReference;
  3. /**
  4. * 软引用
  5. */
  6. public class R2_SoftReference {
  7.     public static void main(String[] args) {
  8.         SoftReference<byte[]> soft = new SoftReference<>(new byte[1024 * 1024 * 10]);//10M
  9.         System.out.println(soft.get());
  10.         //gc回收
  11.         System.gc();
  12.         try {
  13.             Thread.sleep(500);
  14.         } catch (InterruptedException e) {
  15.             e.printStackTrace();
  16.         }
  17.         System.out.println(soft.get());
  18.         //再分配一个数组,好heap(堆)放不下, 这个时候系统会回收一次, 如果不够,会把软引用回收
  19.         byte[] bytes = new byte[1024 * 1024 * 15];
  20.         System.out.println(soft.get());
  21.     }
  22. }
  23. 结果:
  24. [B@1540e19d
  25. [B@1540e19d
  26. null
复制代码
前提设置 -Xmx30M 堆内存最大30M 用于测试
idea里这样设置

弱引用

遇到GC就会被回收
  1. import java.lang.ref.WeakReference;
  2. /**
  3. * 弱引用
  4. */
  5. public class R3_WeakReference {
  6.     public static void main(String[] args) {
  7.         WeakReference<C> weak = new WeakReference<>(new C());
  8.         System.out.println(weak.get());
  9.         //gc回收
  10.         System.gc();
  11.         //遇到GC就会被回收
  12.         System.out.println(weak.get());
  13.     }
  14. }
  15. 结果:
  16. com.cz.reference.C@3c679bde
  17. null
  18. finalize
复制代码
虚引用

不管三七二十一 遇到直接回收
[code]/** * 虚引用 */public class R4_PhantomReference {    private static final List LIST = new LinkedList();    private static final ReferenceQueue QUEUE = new ReferenceQueue();    public static void main(String[] args) {        PhantomReference phantomReference = new PhantomReference(new C(),QUEUE);        new Thread(() -> {            while (true){                LIST.add(new byte[1024*1024]);                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                    Thread.currentThread().interrupt();                }                System.out.println(phantomReference.get());            }        }).start();        new Thread(() -> {            while (true){                Reference

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表