引用类型笔记

java在运行程序的时候涉及到了——>

寄存器:JVM内部的虚拟寄存器,存取速度非常快,程序不可控。(所以,大概是不用掌握的)

栈区:用来存放局部变量

堆区:保存动态创建的一些数据

静态区:保存一些静态数据

Person p = new Person();这条代码发生了什么?

首先在栈内存中为p分配一块空间,然后将Person对象在堆内存中的地址赋值给栈中的p,通过p就看找到堆中的对象。

所以如果System.out.println(p);打印出来会是Person在堆中的地址。

强引用:平常接触最多的就是强引用,绝对不会被回收。

软引用:可用来制作缓存,对用常用的数据,敏感的数据,不需要经常获取,如图片缓存。只有在内存不够的时候才会回收。

弱引用:常用于map数据结构中引用占用内存空间较大的对象。gc立刻回收。

虚引用:主要用来跟踪对象被垃圾回收器回收的状态。和软、弱的区别是必须和引用队列联合使用。当一个虚引用指向的对象被回收之后,自己就会被加入到引用队列中,用作记录该引用指向的对象已被销毁。

//        String str = "Steve_nash learn java"; //常量池中的属于强引用,不能回收
        String str = new String("Steve_nash learn java"); //堆中的可以
        WeakReference<String> wr = new WeakReference<String>(str);
        System.out.println("before gc , str = " + wr.get());
        str = null;
        System.gc();
        
        System.out.println("after gc , str = " + wr.get());

因为常量池中的属于强引用,不会被回收,所以结果是:

before gc , str = Steve_nash learn java
after gc , str = Steve_nash learn java

而堆中的可以,所以输出是:

before gc , str = Steve_nash learn java
after gc , str = null

原文地址:https://www.cnblogs.com/i-love-kobe/p/5904916.html