每天三道面试题2019-09-17

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/HardToFindName/article/details/100942085

1、throw和throws的区别

throw:

  1. throw用在方法体内,表示抛出异常,由方法体内的语句进行处理

  2. throw是具体向外抛出异常的动作,所以它抛出的是一个异常的实例,执行了throw语句一定向外抛出了某种异常。

throws:

  1. throws用在方法声明后面,表示如果抛出异常,由方法的调用者进行处理

  2. throws表现会出现某些异常的可能性,它主要用于声明抛出异常的类型,方便使用该方法者知道需要捕捉何种异常,但是它只表示可能会出现这些异常,这些异常并不一定会产生。

throws是对异常的一种消极处理,通常建议捕获(使用try…catch)并针对异常进行处理。

2、final、finally和finalize的区别

  1. final:用于声明类、方法、变量,被其修饰后分别表示类不可被继承,方法不可被覆盖,变量不可被改变。

  2. finally:是异常处理语句结构的一部份,表示总是执行

  3. finalize:是Object类中的一个方法,在垃圾回收器执行时会调用被回收对象的该方法,在覆盖该对象的finalize方法后,提供垃圾收集时的其他资源回收,如关闭文件流,该方法更像一个对象生命周期的临终方法,当该方法执行的时候(非主动)代表着对象即将死亡,但是如果我们主动去执行该方法是不会导致对象死亡的,它是一个被动的方法(其实是种回调方法),无需我们主动调用。

3、既然说到了垃圾收集,说说jvm中用到了哪些垃圾收集算法?

  1. 在新生区中使用的是复制算法,因为GC(好像叫MinerGC)频繁发生在该区域中,每一次进行GC都会“杀死“绝大部分的实例对象,在新生区中有两个幸存区,from区和to区,from区用于保存每次存活下来的对象,而to区用作移动空间,当Eden区内存不足时将执行gc,在gc执行前,存活下来的实例会移动到to区,由于存活的实例较少执行频繁,使用复制算法效率较高,所以会将存活实例复制到to区,然后对Eden区和from区进行gc,这时from区和to区角色交换(from用于移动,to保存存活实例),等到下次执行gc前重复复制移动操作,如果一个实例对象经过15次这样的操作(在from和to间来回移动)还没有被回收,则将该实例对象放入老年代。该算法的有点的简单高效,带来的缺点是会浪费一分部内存空间。

  2. 由于对象在老年区存活的时间较长,使用复制算法移动大量对象的效率很低,所以在老年代使用的是标记清楚法和标记整理法,当老年代内存空间不足时将执行GC(好像叫MajorGC),在GC前,使用标记清除法或标记整理法都会对先老年区中的被对象进行标记,然后对标记对象进行回收,由于回收对象在内存中并不是顺序排列的,所以回收后将会产生很多零碎的内存无法使用。标记清除法到此将会结束,但是标记整理法会进行后续的处理,它会对内存空间进行整理,使得对象在内存空间中能够整齐排列。

  3. 经过上面对比可知:
    在效率上:复制>标记清除>标记整理
    在内存利用率上:标记整理>标记清除

猜你喜欢

转载自blog.csdn.net/HardToFindName/article/details/100942085