1、GC是什么?为什么要有GC?
GC垃圾收集,Java提供的GC可以自动监测对象是否超过作用域从而达到自动回收内存的目的。
垃圾回收可有效使用内存和防止内存泄露。垃圾回收器通常是作为一个单独的低优先级线程运行,不可预知的情况下对内存堆中已死亡或长久无使用的对象进行清除和回收。
回收机制:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。
2、什么时候会导致垃圾回收?
1)当Eden区和Survivor区满时、老年代空间不足、方法区空间不足;
2)调用System.gc时,系统建议执行Full GC,但不是必然执行
3)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
4)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小;
3、GC是怎么样运行的?
1)自动性。Java提供了一个系统级的线程,即垃圾收集器线程,来跟踪分配的每一块内存空间,当JVM处于空闲循环时,垃圾收集器线程会自动检查内存空间,自动回收每一块可以回收的内存块。
2)不可预期性。一个对象成为了垃圾,不能断言该对象立刻被清除。就算调用System.gc(),只是给JVM起建议作用,是否立即执行回收并不可控。
4、新老以及永久区是什么?
分代收集法,根据对象存活的生命周期分为:新生代、老年代和永久代;
1)新生代:每次都回收大量对象—>Copying复制法
2)老年代:每次都回收少量对象—>Mark-Compact法
3)永久代:存储class类、常量、方法描述,回收废弃常量和无用类
5、GC有几种方式?怎么配置?
1)串行GC:client模式下默认GC方式,使用-XX:+UseSerialGC指定
2)并行GC:server模式下默认GC方式,可用-XX:+UseParallelGC指定
3)并发GC:CMS GC时默认采用,可用-XX:+UseParNewGC,-XX:+UseConcMarkSweepGC指定;
6、什么时候一个对象会被GC? 如何判断一个对象是否存活?
当一个对象到GC Roots不可达时,在下一个垃圾回收周期中尝试回收该对象,如果对象重写了finalize(),并在这个方法中成功自救(将自身赋予某个引用),那么这个对象不会被回收。但如果这个对象没有重写finalize()方法或已执行过这个方法,该对象将会被回收。
判断存活有两种算法:
1)引用计数算法
给对象添加一个引用计数器,当有地方引用它时,计数器值就加1;当引用失效时,