垃圾回收器
5.1 垃圾回收的目的是什么?什么时候使用垃圾回收?
垃圾回收的目的是为了确定识别和丢弃掉应用不再需要的对象,为了资源能回收和再利用。
5.2 System.gc()和Runtime.gc()方法是做什么的?
这两个方法是为了垃圾回收而提示JVM。但是,立即或延迟行垃圾回收是由JVM来决定。
5.3 什么时候调用finalize()?finalization的目的是什么?
finalize()方法是只在释放对象内存前,被垃圾回收器调用。通常建议在finalize方法里释放被对象占用的资源。但是即使finalize()被保证一定会被调用,它也不是一个释放资源的好地方;当它被调用来清理所有你打开的数据库连接(DB Connections)时,系统可能已经耗尽了所有空闲的连接,然后你的app就不能继续跑了。
Finalization主要用来释放被对象占用的资源(不是指内存,而是指其他资源,比如文件(FileHandle)、端口(ports)、数据库连接(DB Connection)等)。然而,它不能真正有效地工作。
5.4 如果对象的引用设置为null,垃圾回收器会马上释放被对象占有的内存吗?
不会。这个对象会在下一个垃圾回收周期可被回收。
5.5 java堆的结构是什么样的?什么是堆中的永久代()?
jvm的堆,是为所有的类实例和分配的数组进行数据分配的地方。在jvm启动阶段创建。对象在堆中的空间是由一个自动化的内存管理系统进行回收的(即垃圾回收器)。堆区包括生存或死亡的对象。生存的对象可被应用使用,同时不会成为牢记回收器的一个对象。死亡的对象是不会被应用使用,但是还没被垃圾回收器回收。这种对象在被垃圾回收器回收之前,占用堆区的空间。
ps.虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
5.6 串行垃圾回收器(SerialGarbageCollector)和吞吐量垃圾回收器(Throughput Garbage collector)的区别
吞吐量回收器用并行的young代垃圾回收器,同时可以使用大数据集。另一方面,串行垃圾回收器对于小应用是恰当的(在线代处理器上需要大约100MB的堆空间)。
5.7 对象在什么时候对垃圾回收器来说是合符条件的?
java对象在刚运行过的程序中没有被其他对象引用,它就属于垃圾回收的范畴。
5.8 在jvm中,垃圾回收能否发生在持久代空间?
垃圾回收可以发生在持久代空间。当持久代空间已满或者超过一个阈值的时候,可以触发完整的垃圾回收。如果你仔细观察垃圾回收器的输出,你会发现持久代的空间也被垃圾回收了。这就是为什么避免频繁完整的垃圾回收的话,必须要定义正确的持久代空间大小。