首页
学习
活动
专区
圈层
工具
发布

【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )

, 直接回收 , 即使内存足够 , 也要回收该对象所占用的内存 ; ④ 虚引用 : 虚引用无法获得被引用的对象 , 其唯一的作用是对象被回收时 , 可以得到相应的通知 ; 虚引用不会对对象的生存周期造成影响任何..., GC 忽略虚引用 , 即使有虚引用引用某对象 , GC 会当做该引用不存在 ; 开发时不常用 , 一般开发底层 SDK , 或监测系统运行类的软件时 , 才使用 ; 强引用 ( 不回收 ) > 软引用...(new Object()); ② 传入创建好的对象引用创建软引用 : 软引用是通过在 软引用构造函数 传入引用对象创建的 , 首先要创建引用对象 ; 下面的强引用可以在创建软引用完毕后置空解除引用...(new Object()); ② 传入创建好的对象引用创建弱引用 : 弱引用是通过在 弱引用构造函数 传入引用对象创建的 , 首先要创建引用对象 ; 下面的强引用可以在创建软引用完毕后置空解除引用..., 将弱引用对象设置为空 // 这里弱引用不管是否置空 , 只要遇到 GC , 一律回收 weakObject = null; // 申请进行垃圾回收,

5.7K10

Java并发-ThreadLocal

1.2.2 软引用(SoftReference) 软引用的生命周期比强引用的短一些,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OOM异常前,清理软引用对象。...应用场景:可用于内存敏感的缓存。 1.2.4 虚引用(PhantomReference) 无法通过虚引用来访问对象的任何属性或函数。虚引用仅仅提供了一直确保对象被finalize后,做某些事情的机制。...虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾收集器准备回收某个对象时,若发现它还有虚引用,则会在回收对象的内存之前,将这个虚引用加入到与之关联的引用队列中。...1.2.5 引用队列(ReferenceQueue) 引用队列可以和软引用、弱引用、虚引用一起配合使用,当垃圾回收器回收一个对象时,若发现它还有引用,就会在回收对象之前将这个引用加入到与之关联的引用队列中去...在get/set方法中可以看到,当发现有key==null && entry!=null的情况时,会主动释放。为了避免出现内存泄露问题,使用完毕后一定要主动调用remove释放。

60910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【面试虐菜】—— JAVA面试题(2)

    然后,这个过程实际上是这样的:首先创建一个StringBuffer对象,然后用StringBuffer类的append方法追加字符串,最后对StringBuffer对象调用toString方法合成字符串返回...而引用类的传递时引用,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同一个对象。...很多初级程序员会使用这样的代码if(s==”save”0{},结果会发现,即使当字符串s的值为save时,if条件依然不能被执行。是==在比较引用类型时,比较的是两个对象的虚地址,而不是内容。...比较基本类型时,==用来比较二进制的值,比较引用类型时,用来比较对象的虚地址。 8 && 与 & 的不同 解析:实际编程中,常常需要使用“与”或者“或”的逻辑。...参考答案:Oject类中的equals方法用来比较两个引用值,hashCode用来返回引用的内地址的十六进制数值。在Set以及Map集合中,判断两个元素是否重复时,往往需要使用这两个方法。

    90650

    ThreadLocal之美!

    ,thread持有thredLoalMap,并命名为threadLocals对象 重要方法 第一个就是initalValue了,这个方法提供初始化,但是是延迟加载的,在get的时候才会触发 现在我们看一下这个方法...起点是get方法,map为空,调用initial方法的罢了 内存泄漏 很多人都不容为什么拦截器的最后,要remove一下,Jvm垃圾回收器不是可以回收吗?...,目的是让系统知道这个对象被回收 总结 引用类型 被垃圾回收时刻 用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 对象简单,缓存,文件缓存,图片缓存 内存不足时终止...弱引用 在gc垃圾回收时 对象简单,缓存,文件缓存,图片缓存 gc运行后终止 虚引用 任何时候都可能被垃圾回收器回收 基本不写,虚拟机使用, 用来跟踪对象被垃圾回收器回收的活动 未知 我们看一下threadLocalMap...我们知道,initialValue方法,即使不调用,也是会有一个默认的null,的,顶多get到一个null,那么为什么有人会遇到get下,报空指针异常问题呢?

    37520

    哦耶!冲进小米了!

    当调用HashMap的put()方法时,会按照以下详细流程执行: 第一步:根据要添加的键的哈希码计算在数组中的位置(索引)。...不是,调用 get 方法有几点需要注意的地方: *空指针异常(NullPointerException)**:如果你尝试用 null 作为键调用 get 方法,而 HashMap 没有被初始化(即为 null...不过,在新生代中,由于每次回收都会有大量对象被清理,这种空间利用率的损失是可以接受的。 强引用,软引用,弱引用,虚引用的区别是什么?...虚引用:形同虚设 ,虚引用不会决定对象的生命周期,如果一个对象仅持有虚引用,其实就和没有任何引用一样。在任何时候都可能被垃圾回收器回收。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。 redis持久化机制有哪些?

    77410

    并发编程系列之ThreadLocal实现原理

    软引用:使用 SoftReference 修饰的对象被称为软引用,在内存溢出时,软引用指向的对象会被回收 弱引用:使用 WeakReference 修饰的对象被称为弱引用,只要发生垃圾回收,被弱引用指向的对象就会被回收...虚引用:虚引用是最弱的引用,用 PhantomReference 进行指定。同样是发生垃圾回收也会被回收,作用是跟踪对象的垃圾回收。...引用类型回收时间用途强引用JVM停止运行时对象的一般状态软引用当内存不足时对象缓存弱引用正常垃圾回收时对象缓存虚引用正常垃圾回收时跟踪对象的垃圾回收 5、Thread、ThreadLocalMap、ThreadLocal...,在ThreadLocalMap内部类里,在其静态内部类Entry是以ThreadLocal的虚引用为key Thread、ThreadLocalMap、ThreadLocal 类关系图:...InheritableThreadLocal 在实际的使用中,可能会遇到,子线程获取父线程里创建的ThreadLocal对象的数据,不过ThreadLocal是不支持这种情况,需要使用InheritableThreadLocal

    38020

    JVM 系列(5)吊打面试官:说一下 Java 的四种引用类型

    那么软引用通常是用于实现内存敏感的缓存,当有足够空闲内存时保留内存,当空闲内存不足时清理缓存,避免缓存耗尽内存; 弱引用和虚引用: 弱引用和虚引用是相对于软引用更激进的策略,弱引用指向的对象无论在内存是否充足的时候...引用队列可以为空,但虚引用必须关联引用队列,否则没有意义; 2、获取实际对象: 在实际对象被垃圾收集器回收之前,通过 Reference#get() 可以获取实际对象,在实际对象被回收之后 get()...它是非阻塞 API,在队列有数据时返回队头的数据,而在队列为空时直接返回 null。 ReferenceQueue.java public Reference对象被垃圾回收时额外执行一段清理逻辑,本质上只是将虚引用和引用队列等代码做了简单封装而已。...队列,将引用对象分别投递到关联的引用队列中; 3、守护线程 FinalizerDaemon 会轮询观察引用队列,并执行实际对象上的 finalize() 方法。

    76810

    C++面试题

    引用和指针有什么区别? 一般指的是某块内存的地址,通过这个地址,我们可以寻址到这块内存;而引用是一个变量的别名。指针可以为空,引用不能为空。 2....虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它但析构却不一定,我们往往通过基类的指针来销毁对象。...从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次...因此,这种方法不可以。 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占的空间。编译器管理了对象的整个生命周期。

    2.4K42

    每个C++开发者都应该学习和使用的C++11特性

    它的语法形式如下: static_assert (boolean_expression, "error_message"); 其中: boolean_expression 是一个在编译时可求值的布尔表达式...移动语义的背景: 在传统的C++中,对象的赋值和传递通常会进行复制操作,即调用拷贝构造函数或拷贝赋值运算符。...对于大型对象或对象包含动态分配的资源,这种复制操作可能会导致昂贵的性能开销,尤其是在函数参数传递和返回值返回时。 2....通过右值引用,可以识别出临时对象,并且在这些对象上应用移动语义。 移动语义允许将资源从一个对象转移到另一个对象,而不是复制资源。...移动语义的使用场景: 在容器中插入临时对象: 通过移动语义,可以避免在容器中插入临时对象时进行深拷贝,提高了插入的效率。

    65810

    c++类和继承面试点25连问

    ,先调用基类的构造函数,再调用派生类的构造函数; 派生类对象销毁时,先调用派生类的析构函数,再调用基类的析构函数。...运行时多态简单来讲就是:使用基类指针或者引用指向一个派生类对象,在非虚继承的情况下,派生类直接继承基类的虚表指针,然后使用派生类的虚函数去覆盖基类的虚函数,这样派生类对象通过虚表指针访问到的虚函数就是派生类的虚函数了...析构函数是否可以为虚函数?如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...什么情况下要使用虚继承? 多重继承时需要使用虚继承,一般的我们在多重继承时使用虚继承来防止二义性问题。...防止类对象被拷贝和赋值,无非是禁止类对象调用拷贝构造函数和赋值函数,在c++11以后有三种方法: 拷贝构造函数和赋值函数定义为私有的; 私有继承基类; 构造函数后面加=delete,这是c++11新增的用法

    1.3K10

    JVM规范定义运行时数据区详解-Java快速进阶教程

    ,包括编译器可知的各种 Java 虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身...在 JVM 中,将符号引用转换为调用方法的直接引用与方法的绑定机制有关,常用方式有2种: 静态链接:当一个字节码文件被装载进 JVM 内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时。...这样的方法称为非虚方法,比如静态方法、私有方法、final 方法、实例构造器、父类方法都是非虚方法 其他方法称为虚方法   虚方法表 在面向对象编程中,会频繁的使用到动态分派,如果每次动态分派都要重新在类的方法元数据中搜索合适的目标有可能会影响到执行效率...在方法执行的过程中遇到了异常,并且这个异常没有在方法内进行处理,也就是只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出。...简称异常完成出口 方法执行过程中抛出异常时的异常处理,存储在一个异常处理表,方便在发生异常的时候找到处理异常的代码。 本质上,方法的退出就是当前栈帧出栈的过程。

    26100

    MySQL 驱动中虚引用 GC 耗时优化与源码分析

    本文要点: 一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法 虚引用的作用与使用场景 MySQL 驱动源码中的虚引用分析 背景 在之前文章中写过 MySQL JDBC 驱动中的虚引用导致...虚引用主要用于在对象被回收时收到系统通知,以便在回收时执行一些必要的清理工作。...; //关联对象 Object o = new Object(); //调用构造方法生成一个虚引用 第一个参数就是关联对象 第二个参数是关联队列 PhantomReference phantomReference...如果上述代码里的phantomReference 是一个普通的对象,那么在执行 System.gc() 时 Object o 一定不会被回收掉,因为普通对象持有 Object o 的强引用,还不会被作为垃圾...run 方法里循环读取虚引用队列 referenceQueue 里的虚引用,然后调用 finalizeResource 方法来进行后置的处理,避免连接泄露: public void run() {

    39020

    MySQL 驱动中虚引用 GC 耗时优化与源码分析

    本文要点: 一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法 虚引用的作用与使用场景 MySQL 驱动源码中的虚引用分析 背景 在之前文章中写过 MySQL JDBC 驱动中的虚引用导致...虚引用主要用于在对象被回收时收到系统通知,以便在回收时执行一些必要的清理工作。...//关联对象 Object o = new Object(); //调用构造方法生成一个虚引用 第一个参数就是关联对象 第二个参数是关联队列 PhantomReference phantomReference...如果上述代码里的phantomReference 是一个普通的对象,那么在执行 System.gc() 时 Object o 一定不会被回收掉,因为普通对象持有 Object o 的强引用,还不会被作为垃圾...run 方法里循环读取虚引用队列 referenceQueue 里的虚引用,然后调用 finalizeResource 方法来进行后置的处理,避免连接泄露: public void run() {

    95130

    java 源码系列 - 带你读懂 Reference 和 ReferenceQueue

    为了描述相应的状态值,在放到队列当中后,其queue就不会再引用这个队列了。而是引用一个特殊的 ENQUEUED(内部定义的一个空队列)。因为已经放到队列当中,并且不会再次放到队列当中。...RefrenceQueue 的 enqueue 方法 boolean enqueue(Reference的内存区域进行扫描时发现了弱引用对象就进行回收。...4) PhantomReference PhantomReference,即虚引用,虚引用并不会影响对象的生命周期。虚引用的作用为:跟踪垃圾回收器收集对象这一活动的情况。...在上面的代码中,如果obj被置为null,当GC发现虚引用,GC会将把 PhantomReference 对象pr加入到队列ReferenceQueue中,注意此时pr所指向的对象并没有被回收,在我们现实的调用了

    83910

    深入AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码

    如果拿不到它实际上是调用了acquireQueued()方法,acquireQueued()方法里又调用了addWaiter(Node.EXCLUSIVE)然后后面写一个arg(数值1),方法结构是这样的...接下来我们来解读acquireQueued()这个方法,这个方法的意思是,在队列里尝试去获得锁,在队列里排队获得锁,那么它是怎么做到的呢?...主要想说明一下在垃圾回收的过程中,各种引用它不同的表现,垃圾回收的时候,它是会调用fifinalize()这个方法的,什么意思?...是给写JVM(虚拟机)的人用的 我们来看下面的小程序,在小程序里创建了一个List集合用于模拟内存溢出,还创建了一个 ReferenceQueue(引用队列),在main方法里创建一个虚引用对象PhantomReference...,就说明被回收了在第一个线程启动后我们会看到,无论我们怎么get这个phantomReference里面的值,它输出的都是空值,虚引用和弱引用的区别就在于,弱引用里边有值你get的时候还是get的到的,

    34930

    【面试题解】JavaScript数据类型相关的六个面试题

    引用类型的变量名会保存在 栈内存 中,但是变量值会存储在 堆内存 中,引用类型的变量不会自动销毁,当没有引用变量引用它时,系统的 垃圾回收机制 会回收它。...let a = 1 let b = a a = 2 console.log(a); //=> 2 console.log(b); //=> 1 } foo() 引用类型的变量直接赋值实际上是传递引用...基本的值类型有: undefined,Boolean,Number,String,Symbol。 引用类型有: Object。 特殊的引用类型:null,指针指向空地址。...简单的来说 虚值 就是 在转换为布尔值时 变为 false 的值,变为 true 的值则为 真值 。 如何检查值是否虚值?使用 Boolean 函数或者 !! 运算符。...虚值(Falsy) 长度为 0 的字符串 数字 0 false undefined null NaN 真值(Truthy) 空数组 空对象 其他 && 和 || 运算符能做什么?

    46930

    线程本地存储 ThreadLocal

    一个对象如果只剩下弱引用,则该对象在垃圾收集时就会被回收 ThreadLocalMap 使用 ThreadLocal 实例对象的弱引用作为 key 时,如果一个 ThreadLocal 实例对象没有强引用引用它...在调用 ThreadLocal 的 get()、set() 方法操作数据,从指定位置开始遍历 Entry 时,会找到 Entry 不为 null,但 key 为 null 的 Entry,并删除 key...但是,如果 ThreadLocal 实例对象的强引用被删除后,线程长时间存活,又没有再对该线程的 ThreadLocalMap 实例对象进行操作,也就是没有再调用 get()、set() 方法,那么依然会存在内存泄漏...(但这个不用担心,在实际项目中,ThreadLocal 都很少,基本上不会冲突); 通过 hashCode 计算的索引位置 i 处如果已经有值了,会从 i 开始,通过 +1 不断的往后寻找,直到找到索引位置为空的地方...// get 的关键方法,被 get() 方法调用 // 得到当前 thradLocal 对应的值,值的类型是由 thradLocal 的泛型决定的 // 首先尝试根据 hashcode 取模

    2.8K20

    Java中的Reference类使用

    我简单总结了下,软引用对象具体的回收策略如下: 如果已经没有引用指向软引用对象,那么这个对象会被JVM回收; 如果还有软引用指向这个软引用对象,就判断在某段之间之内(_max_interval),有没有调用过...SoftReference的get方法,如果在_max_interval时间内没调用过get方法,那么即使还有软引用指向这个对象,JVM也会回收这个对象,如果在_max_interval时间内调用过get...在>3.2.3中有这么一句话 为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。...要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。...另外从ReferenceQueue这个名字也可以看出,它是一个队列,当我们调用它的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象。

    1.1K10

    面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)

    修饰的对象被称为软引用,软引用指向的对象在内存要溢出的时候被回收 弱引用:使用WeakReference修饰的对象被称为弱引用,只要发生垃圾回收,若这个对象只被弱引用指向,那么就会被回收 虚引用:虚引用是最弱的引用...在set过程中,如果遇到了key过期的Entry数据,实际上是会进行一轮探测式清理操作的,具体操作方式后面会讲到。...第三种情况: 槽位数据不为空,往后遍历过程中,在找到Entry为null的槽位之前,没有遇到key过期的Entry: ?...()方法(核心方法),然后返回 for循环执行完毕,继续往下执行说明向后迭代的过程中遇到了entry为null的情况 3.1 在Entry为null的桶中创建一个新的Entry对象 3.2 执行++size...new Thread()方法来创建子线程,Thread#init方法在Thread的构造方法中被调用。

    1.6K21
    领券