java面试题网

普通会员

33

帖子

5

回复

71

积分

楼主
发表于 2019-07-08 21:35:24 | 查看: 70| 回复: 0

java面试总结

1、重写equals为什么要重写hashCode
好久没看到过这个问题了,而且好久没重写过equals了,面试官还问“这不是面试常考题么”,额,我还是太菜。
主要有两点:
(1)不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
(2)不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。
常考题还有“==”跟“equals”的区别
2、JVM中survivor区存在的意义是啥
在任何时候,总有一个survivor space是empty的,在下一次coping collection时,会将eden和另一个survivor space里的live object copy到这个里面。
live objects在两个survivor space里copy来copy去,直到对象old enough可以放到tenured generation里(copy 过去的)
因为在垃圾收集的时候需要将dead object清理掉,如果只有一个survivor区,那么这个survivor区里的dead object在清理掉之后就会产生内存碎片,为了避免内存碎片那么必须将live object移动来移动去,这样就会损失性能。
如果有两个survivor区,按照上面的说法,就不会存在内存碎片的问题。
3、 minor gc、major gc、full gc使用了哪种垃圾回收算法,为什么
先来讲一下这几个算法的特性吧
复制:1.将内存分为两块,只用一块,另一块用来讲这一块的对象复制;2.不会产生内存碎片
标记-清除:1.从引用根节点开始标记所有被引用的对象;2.遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
标记-整理:1.从根节点开始标记所有被引用对象;2.遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
新生代的Minor GC触发条件:Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。所有的Minor GC都会触发全世界的暂停(stop-the-world)
老年代的GC(Major GC/Full GC):老年代与新生代不同,老年代对象存活的时间比较长、比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减少内存碎片带来的效率损耗。
4、线程池中shutdown、shutdownNow、isShutdown、isTerminated、awaitTermination的使用场景
好久线程池这一块了,有点搞乱
shutdown在终止前允许执行以前提交的任务
shutdownNow试图停止当前正执行的task,并返回尚未执行的task的list
isShutDown当调用shutdown()方法后返回为true。
isTerminated当调用shutdown()方法后,并且所有提交的任务完成后返回为true
awaitTermination当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false
5、threadlocal有何缺陷
Java中的ThreadLocal 变量用于将变量同当前线程绑定,每个线程都有自己独立的ThreadLocal变量。这些变量通常用于保存一些变量的状态信息,譬如用户信息这种在整个应用中都使用的到并且你不想在每个方法中都重新声明。hreadLocal对Key使用到了弱引用,但是为了保证不再内存泄露,在每次set.get的时候主动对key==null的entry做遍历回收。虽然不会造成内存泄露,但是因为只有在每次set,get的时候才会对entry做key==null的判断,从而释放内存,所以可能使大对象在内存中存活很长一段时间,从而占用内存。所以,我们在使用完ThreadLocal里的对象后最好能手动remove一下,或者至少调用下ThreadLocal.set(null)。

java面试总结


您需要登录后才可以回帖 登录 | 立即注册

java面试题网无聊看看网与java建站系统提供技术支持V2.1 网站地图 © 2016-2018