StringBuffer str = new StringBuffer(“hello world”);
str分配在栈内 对象StringBuffer分配在堆上,str指向Stringbuffer实例所在的堆空间,通过str可操作该实例,此时如若 StringBuffer str1 = str,那么str所指向的对象也会被str1指向,此时stringbuffer就有两个引用,而对引用使用“==”来判断的是两个操作数所指向的堆空间地址是否相同,不表示两个操作数所指向的对象是否相等。
强引用:
在一个线程内无需银用直接可以使用的对象,除非银用不存在了,否则强引用不会被GC清理,我们平时用的99%都是强引用,如:String s= “helloworld”
软引用:
JVM在抛出OOM之前,GC会清理所有的软引用对象,垃圾回收器在某个时刻决定回收软可达的对象的时候,会清理软引用并可选地把引用存放到一个引用队列。类似弱引用,只不过java虚拟机会尽量让软引用存活的时间长一些,迫不得已才清理。
弱引用:
弱引用对象与软引用对象的最大不同在于,当GC在进行回收时,需要通过算法检查是否回收软引用对象,而对于弱引用对象,GC总是进行回收。弱引用对象更容易、更快被GC回收,虽然GC在运行时一定回收弱引用对象,但是复杂关系的若对象群常常需要好几次GC运行才能完成,弱引用对象常常用于Map结构中
虚引用:
又称为幽灵引用,主要目的是在一个对象所占的内存被实际回收之前得到通知从而可以进行一些相关的清理工作。幽灵引用在使用方式上与之前介绍的三种引用类型有很大的不同。首先幽灵引用在创建时必须提供一个引用队列作为参数,其次幽灵引用对象的get方法总是返回null,因此无法通过幽灵引用来获取被引用的对象