1、在JDK1.6(HotSpot虚拟机)及之前,运行时常量池(属于方法区的一部分)是永久代的,而在JDK1.7之后运行时常量池(里面用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池当中存放)已经从永久代(Permanent Generation)移出。(问:那么方法区其他部分有没有移出永久代?)
2、关于String.intern()方法,在1.6及以前会把首次遇到的字符串实例复制到永久代当中去,返回的也是永久代中这个字符串实例的引用;在1.7之后intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用,返回的就是那个实例引用。
3、Java的JVM并不是通过引用计数来进行GC,因为它很难解决对象之间相互循环引用的问题,譬如:
public class Test{ public Object instance = null; public static void testGC(){ Test objA = new Test(); Test objB = new Test(); objA.instance = objB; objB.instance = objA; objA=null; objB=null; //假设在这行发生了GC,objA 和 objB能否被回收? System.gc(); } }
虽然这两个对象都已经不可能再被访问了,但是由于他们相互引用这对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
4、Java采用可达性分析来判断对象是否存活,一般通过”GC ROOTS“的对象来作为起始点,一般可作为“GC roots”的对象包括下面4种:
1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)方法区中类静态属性引用的对象。
3)方法区中常量引用的对象。
4)本地方法栈中JNI(即一般说的Native方法)引用的对象。
5、JDK1.2之后Java对引用的概念进行了扩充,分为四种,引用强度依次从强到弱为强引用>软引用>弱引用>虚引用
强引用是普通的类似 Object obj = new Object()的对象引用
软引用(通过SoftReference类来实现)用来描述一些还有用但不是必须的对象,当发生内存溢出异常之前,将会把这一类对象列入回收范围之中进行第二次回收,如果这次回收之后还是不够,就报内存溢出异常。
弱引用(WeakReference类来实现)也是用来描述非必须对象,但它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前
虚引用(PhantomReference)最弱的一种引用关系,无法通过虚引用来取得一个对象实例,一般为对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收的时候收到一个系统通知。
6、