Java中垃圾回收的目的是什么?为什么要进行垃圾回收?
Java中垃圾回收指的是回收释放不再引用的实例对象,目的是为了减少内存泄漏和内存溢出现象的发生。
Minor GC和Full GC有什么不同?Minor GC和Full GC触发的场景分别是什么?
Minor GC:指发生在新生代中的垃圾回收动作,Java对象大多存活时间不长,发生的次数很频繁。
Minor GC出现的场景:Eden区满了之后会触发Minor GC。
Full GC/Major GC:指发生在老年代中的垃圾回收动作,出现了Full GC通常会伴随着一次Minor GC,Major GC一般比Minor GC慢十倍以上。
Full GC出现场景:
1.System GC方法的调用,此方法的调用会建议Java虚拟机调用Full GC,但是Java虚拟机可能不会采用这个建议。
2.老年代空间不足,创建的对象所需的空间大于老年代剩余空间,会触发Full GC。
3.空间分配担保失败,通过Minor GC后,进入老年代的平均大小大于老年代的可用空间,会导致Full GC。
为什么要减少Full GC的发生?
因为Full GC会严重影响Java运行速度,每次触发Full GC都会导致STW。
不论是Minor GC还是Full GC都会导致STW,只不过Minor GC导致的STW所停顿的时间比较短。
JVM内存分配与回收
Java对象的内存分配一般是分在堆上,Java堆大体上可以分为新生代和老年代,一般新生代占1份,老年代占两份。
新生代包含Eden区,From Survivor 和 To Survivor,内存大小分配比例:8:1:1.
给对象分配内存空间时,首先会看Eden区,当Eden区没有足够的内存大小时,会触发一次Minor GC。
如果仍然存放不下,就会放在老年代,如果老年代空间不足,会触发一次Full GC。
Java中有哪些引用类型?
Java中存在强引用,软引用,弱引用,虚引用。
强引用:垃圾收集器永远不会回收掉引用的对象。
软引用:用来描述一些有用但非必需的对象,在内存发生溢出之前会被回收。
弱引用:用来描述一些有用但非必需的对象,在下一次垃圾回收前被回收。
虚引用:最弱的一种引用关系,无法通过虚引用来获取一个对象,虚引用的唯一目的就是在这个对象被回收之前能收到一个系统消息。
如何判断对象是否可回收?
判断对象是否可回收有引用计数法和可达性分析法。
但是引用计数法没有被Java虚拟机采用,因为可能存在循环引用的问题。
可达性分析法:是通过一系列被称为“GC Roots”的对象作为起点,向下搜索,搜索所走过的路径被称为引用链,当一个对象到"GC Roots"之间没有任何引用链相连时,表明这个对象是不可达的,也就是需要回收的。
可以作为GC Roots的对象主要有:
1.虚拟机栈中引用的对象。
2.方法区中类静态属性引用的对象。
3.方法区中常量引用的对象。
4.本地方法栈中Native引用的对象。
有什么办法主动通知Java虚拟机进行垃圾回收?
通过调用system.gc(),但是Java虚拟机可能不会运行这个方法。