目录
什么场景下该使用垃圾回收策略
- 对内存要求苛刻的场景:想办法提高对象的回收效率,多回收掉一些对象,腾出更多内存
- 在Cpu使用率高的情况下:降低高并发垃圾回收的频率,让CPU更多的去执行你的业务而不是垃圾回收
垃圾回收发生在哪些区域
堆和方法区线程共享,垃圾回收的主要对象。方法区回收废弃的常量和不需要使用的类。
对象在什么时候能够被回收
引用计数法:通过对象的引用计数器来判断是否被引用。但是解决不了循环引用的问题
A → B → C → D → B 当A 不引用 B的时候,理论上BCD都要被回收,但是他们3个之间循环引用,引用计数器不为0,所以不能被回收
可达性分析:以根对象(GC Roots)作为起点向下搜索,走过的路径被称为引用链(Reference Chain),如果某个对象到根对象没有引用链相连时,就认为这个对象时不可达的,可以回收。
根对象(GC Roots)包括哪些对象
- 虚拟机栈(栈帧中的本地变量表)中的引用对象
- 方法区中类静态属性引用的对象
- 方法去中常量引用的对象
- 本地方法栈中JNI(即 Native方法)引用的对象
Java中四种引用对象
分别是 强引用、软引用、弱引用和虚引用。
强引用 (Strong Reference)
只要是强引用的类型,那么垃圾回收的时候绝对不会去回收这个对象的
例如这种就是强引用:User user = new User()
软引用 (Soft Reference)
用来描述一些有用但非必须的对象。软引用关联的对象,只有在内存不足的时候才会回收。利用这个特性软引用就适合用来做些缓存,比如网页缓存,图片缓存
把 “ User ” 实例对象用一个“SoftReference”软引用类型的对象给包裹起来了
static SoftReference<User> userSoftReference = new SoftReference<User>(new User());
弱引用 (Weak Reference)
弱引用也是用来描述非必须的对象的。当Jvm垃圾回收的时候,无论内存是否充足,都会被回收弱引用关联的对象
WeakReference 包裹的对象
WeakReference <User> user = new WeakReference <User>(new User());
虚引用 (Phantom Reference)
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> pr = new PhantomReference<>("aa",queuq)
虚引用必须和ReferenceQueue配合
可达性算法当判断一个对象即使不可达,也不一定会被回收。还会经历下面这一步骤