1. 强引用、软引用、弱引用、虚引用分别是什么?
- 强引用
- 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。
- 强引用是最常见的普通对象引用,只要还有前饮用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰到这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾机制回收的,即使该对象以后永远都不能被用到,JVM也不会回收。因此强引用是造成Java内存泄露的主要原因之一。
- 软引用
- 软引用是一种相对强化了一些的引用,需要用java.lang.ref.SoftReference类来实现,可以让对象豁免一些垃圾收集。
- 对于只有软引用的对象来说,当系统内存充足时,它不会被回收 当系统内存不足时,它会被回收
- 软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收。
- 弱引用
- 弱引用需要用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短。
- 对于软引用对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,都会回收该对象占用的内存。
- 虚引用
- 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和队列(ReferenceQueue)联合使用。
- 设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。
2. GC回收算法和垃圾收集器的关系?分别是什么请你谈谈
-
GC算法(引用计数/复制/标清/标整)是内存回收的方法论,垃圾收集器就是算法落地实现。
-
因为目前为止还没有完美的收集器出现,更加没有万能的收集器,知识针对具体应用最合适的收集器,进行分代收集。
-
4种主要垃圾收集器
- 串行垃圾回收器(Serial) 美 [ˈsɪriəl]
它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。 - 并行垃圾回收器(Parallel)美 [ˈpærəlel]
多个垃圾收集线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理平台处理等弱交互场景。 - 并发垃圾回收器(CMS)
用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程,使用对响应时间有要求的场景。 - GI垃圾回收器
G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。
- 串行垃圾回收器(Serial) 美 [ˈsɪriəl]
2. 怎么查看服务器默认的垃圾收集器是哪个?生产上你是如何配置垃圾收集器的?谈谈你的理解?
- 怎么查看默认的垃圾收集器是哪个?怎么查看默认的垃圾收集器是哪个?
JVM参数:java -XX:+PrintCommandLineFlags -version - 默认的垃圾收集器有哪些?
UseSerialGC / UseParallelGC / UseConcMarkSweepGC / UseParNewGC / UseParallelOldGC / UseG1GC - 垃圾收集器
- 部分参数预先说明
- DefNew Default New Generation
- Tenured Old
- ParNew Parallel New Generation
- PSYoungGen Parallel Scavenge
- ParOldGen Parallel Old Generation
- Server/Client模式分别是什么意思
- 使用范围:只需要掌握Server模式即可,Client模式基本不会用。
- 操作系统:
32位操作系统,不论硬件如何都默认使用Client的JVM模式。
64位操作系统,2G内存同时有2个CPU以上用Server模式,低于该配置还是Client模式。
64为only server模式
- 新生代
- 串行GC(Serial)/(Serial Copying) VM参数是:-XX:+UseSerialGC
- 并行GC(ParNew)
- 并行回收GC(Parallel)/(Parallel Scavenge)