面试总结

周五去了一趟深圳某互联网金融面试,很遗憾吧,没过,听到没过的时候心都碎了,毕竟仍是很想去这家公司的,以后还不要脸的问了“能不能再聊聊”,下楼以后,被二面的经理叫回来讲跟架构师聊聊,依旧没过。。。面试官很好,还给了不少建议,还说要是有合适的会给你联系的。回想一下,只能怪本身真的太不争气了,没有借口!!!基础!基础!基础!html

1. 重写equals为何要重写hashCode

这个,,,真是个意外,很久没看到过这个问题了,并且很久没重写过equals了,面试官还问“这不是面试常考题么”,额,我仍是太菜。
主要有两点:node

(1)不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
(2)不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。

常考题还有“==”跟“equals”的区别git

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区,按照上面的说法,就不会存在内存碎片的问题。
参考:
为何新生代内存须要有两个Survivor区github

3. minor gc、major gc、full gc使用了哪一种垃圾回收算法,为何

先来说一下这几个算法的特性吧
复制:1.将内存分为两块,只用一块,另外一块用来说这一块的对象复制;2.不会产生内存碎片
标记-清除:1.从引用根节点开始标记全部被引用的对象;2.遍历整个堆,把未标记的对象清除。此算法须要暂停整个应用,同时,会产生内存碎片。
标记-整理:1.从根节点开始标记全部被引用对象;2.遍历整个堆,把清除未标记对象而且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
说的有点不够形象,仍是用对比的表格来展现吧。面试

~ Mark-Sweep Mark-Compact Copying
速度 中等 最慢 最快
空间开销 少(但会堆积碎片) 少(不堆积碎片) 一般须要活对象的2倍大小(不堆积碎片)
移动对象

新生代的Minor GC触发条件:Copying算法就是扫描出存活的对象,并复制到一块新的彻底未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。全部的Minor GC都会触发全世界的暂停(stop-the-world)
老年代的GC(Major GC/Full GC):老年代与新生代不一样,老年代对象存活的时间比较长、比较稳定,所以采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,而后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减小内存碎片带来的效率损耗。redis

4. mq中的queue和topic有什么区别

有点懵逼,mq只是简单的了解一下,没想到会到这点。。。留张图先,后续写篇大文
算法

参考:ActiveMQ——activemq的详细说明,queue、topic的区别(精选)spring

5. 线程池中shutdown、shutdownNow、isShutdown、isTerminated、awaitTermination的使用场景

很久线程池这一块了,有点搞乱
shutdown在终止前容许执行之前提交的任务
shutdownNow试图中止当前正执行的task,并返回还没有执行的task的list
isShutDown当调用shutdown()方法后返回为true。
isTerminated当调用shutdown()方法后,而且全部提交的任务完成后返回为true
awaitTermination当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,不然返回false数据库

6. 使用new ThreadPoolExecutor()中里面的几个参数含义以及使用场景(maximumPoolSize超了会怎样)

这题。。。细,太细了编程

int corePoolSize  核心线程数,核心线程会一直存活,即便没有任务须要执行
int maximumPoolSize  最大线程数
long keepAliveTime   线程空闲时间
TimeUnit unit   指定keepAliveTime的单位,如TimeUnit.SECONDS。当将allowCoreThreadTimeOut设置为true时对corePoolSize生效。
BlockingQueue<Runnable> workQueue  线程池中的任务队列
ThreadFactory threadFactory    线程工厂,提供建立新线程的功能。
RejectedExecutionHandler handler 当线程池中的资源已经所有使用,添加新线程被拒绝时,会调用

corePoolSize、maximumPoolSize之间的关系

1.若是线程数量<=核心线程数量,那么直接启动一个核心线程来执行任务,不会放入队列中。
2.若是线程数量>核心线程数,但<=最大线程数,而且任务队列是LinkedBlockingDeque的时候,超过核心线程数量的任务会放在任务队列中排队。
3.若是线程数量>核心线程数,但<=最大线程数,而且任务队列是SynchronousQueue的时候,线程池会建立新线程执行任务,这些任务也不会被放在任务队列中。这些线程属于非核心线程,在任务完成后,闲置时间达到了超时时间就会被清除。
4.若是线程数量>核心线程数,而且>最大线程数,当任务队列是LinkedBlockingDeque,会将超过核心线程的任务放在任务队列中排队。也就是当任务队列是LinkedBlockingDeque而且没有大小限制时,线程池的最大线程数设置是无效的,他的线程数最多不会超过核心线程数。
5.若是线程数量>核心线程数,而且>最大线程数,当任务队列是SynchronousQueue的时候,会由于线程池拒绝添加任务而抛出异常。

参考:
ThreadPoolExecutor线程池参数设置技巧
Java多线程-线程池ThreadPoolExecutor构造方法和规则

7. ConcurrentHashMap中Segment的做用,还有用了什么锁

此问题保留,改天看源码写文章。。。。

8. tail -f中f的含义

-c, --bytes=N                     输出最后N个字节
-F                                等同于--follow=name  --retry,**根据文件名进行追踪,并保持重试,即该文件被删除或更名后,若是再次建立相同的文件名,会继续追踪**
-f, --follow[={name|descriptor}]  根据文件描述符进行追踪,当文件更名或被删除,追踪中止; -f, --follow以及 --follow=descriptor 都是相同的意思
-n, --lines=N                     输出最后N行,而非默认的最后10行
    --max-unchanged-stats=N       参看texinfo文档(默认为5)
    --max-consecutive-size-changes=N    参看texinfo文档(默认为200)
    --pid=PID                     与-f合用,表示在进程ID,PID死掉以后结束.
-q, --quiet, --silent             从不输出给出文件名的首部
-s, --sleep-interval=S            与-f合用,表示在每次反复的间隔休眠S秒
-v, --verbose                     老是输出给出文件名的首部
--help                            显示帮助信息后退出
--version                         输出版本信息后退出

9. df -h中h的含义

我有点慌,df --help看了下我仍是记不住那么多。。。

-a, --all             所有文件系统列表
  -B, --block-size=SIZE 使用SIZE大小的Blocks
  -h, --human-readable  以可读性较高的方式来显示信息
  -H, --si              与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
  -i, --inodes          显示inode的信息;
  -k                    指定区块大小为1024字节;跟--block-size=1K同样
  -l, --local           仅显示本地端的文件系统;
      --no-sync         在取得磁盘使用信息前,不要执行sync指令,此为预设值;
  -P, --portability     使用POSIX的输出格式;
      --sync            在取得磁盘使用信息前,先执行sync指令;
  -t, --type=TYPE       仅显示指定文件系统类型的磁盘信息;
  -T, --print-type      显示文件系统的类型;
  -x, --exclude-type=TYPE   不要显示指定文件系统类型的磁盘信息;
  -v                    (ignored)
      --help     display this help and exit
      --version  output version information and exit

10. fastdfs原理

这个真的没有深刻研究的,写在简历上是但愿经过引入新技术(以前一直用的JDK1.6写的FTP文件服务器),给团队带来贡献的,结果没有说出来,至关于挖了个坑把本身埋了,好尴尬,先在这放张图,有空再深刻研究下了。

11. 分布式锁原理与实现方式,若是保持一致性,秒杀架构中会加1000把锁?

分布式锁是最近刚开始看的问题,知道目前一般实现方式有三种:1.数据库的共享锁;2.Redis;3.ZooKeeper,其中Redis的实现方式核心是setnx(set if not exist),只看过一点点Redisson的源码。面试的时候被问到了,有点慌的其实,毕竟公司没有项目用到分布式锁这种东西,面试官还不一直不信,问我“那大家提工单的时候若是处理点击屡次的状况”。
此问题保留,后续会写一篇RedissonLock源码的文章。

参考:
Redisson
基于Redis实现分布式锁,Redisson使用及源码分析

12. threadlocal有何缺陷

Java中的ThreadLocal 变量用于将变量同当前线程绑定,每一个线程都有本身独立的ThreadLocal变量。这些变量一般用于保存一些变量的状态信息,譬如用户信息这种在整个应用中都使用的到而且你不想在每一个方法中都从新声明。hreadLocal对Key使用到了弱引用,可是为了保证再也不内存泄露,在每次set.get的时候主动对key==null的entry作遍历回收。虽然不会形成内存泄露,可是由于只有在每次set,get的时候才会对entry作key==null的判断,从而释放内存,因此可能使大对象在内存中存活很长一段时间,从而占用内存。因此,咱们在使用完ThreadLocal里的对象后最好能手动remove一下,或者至少调用下ThreadLocal.set(null)。
参考:
Java并发编程:深刻剖析ThreadLocal
ThreadLocal内存泄露
ThreadLocal内存泄露分析

13. cookie和session的原理,分布式场景下如何保持惟一。

这个问题,一开始我以为本身理解仍是足够的,毕竟本身作过网站,爬虫还作了很多,可是说出来的时候,跟本身想象中的很不同,这里再次总结一下吧。因为HTTP是无状态的协议,一旦数据交换完毕,客户端和服务器的链接就会关闭,若是须要从新链接,那么久必须发起新的会话。因此,在客户端和服务器中保存相关的信息是经过cookie和session来实现的。简单的来讲,session存储于服务端,cookie存在于客户端,每次会话时服务器会在内存中开辟一小块内存空间记录会话,session的运行依赖于session id(tomcat中叫jsessionid),而session id是存储在cookie中的,若是浏览器禁用了cookie,那么session也会失效,以大部分登陆网站为例,能够试试登陆以后禁用cookie,刷新页面,登陆信息没了,以后是再怎么登陆也登陆不进去。因此,须要记录的点是:

1.session存储在服务端,cookie存储在客户端(浏览器);
2.服务端中记录惟一会话标示用的是session id,tomcat中叫作jsessionid,cookie中保存session id,发送请求的时候携带sessionid
3.session存放的位置通常放在服务器的内存中,分布式环境下通常都是用spring-session和redis构建。
4.cookie安全性差,通常采用加密。并且不能跨域。

分布式环境下如何保存,公司采用的仍是memcache,新项目都换成了redis集群。公司的不是我负责的,可是,我本身的项目用到了spring-session和redis,但是面试的时候,不知道怎么了,没有发挥出来,我也是醉了。

参考:
Cookie和session详解
COOKIE和SESSION有什么区别?
spring-session简介、使用及实现原理

14. 你对大家公司项目有什么深刻的理解么?

这个问题。。。本质上挺好,可是,咱们公司的项目真的没有技术含量,面试官不信,我都不知道该怎么回答了,说咱们公司项目很牛逼?可是牛逼在哪里?全都是增删改查的项目,缓存还用的ehcache,并且用缓存的地方及其少,JDK还用的1.6。。。把咱们部门的项目给公司其余部门看,别人说,我觉得我这边的项目已经够烂了,没想到还有更烂的,不想看大家的。离职前还问了咱们组技术最好的项目有没有技术深度高一点的东西,想了半会,跟我说没有,我又问了,提工单的时候如何保持一致性的,下面是聊天记录,能够看下。其实我也超想挖掘项目中比较高深的东西,可是,咱们作的就是业务系统,我有啥办法啊。。。

公司的防止重复提交方法,点击一次后让它不可点击。若是浏览器坏了发送了两次请求,须要人工干预。
list[i].disabled = false;

下面是聊天记录:


总结:
都是基础,真恨本身平时没总结,一心只想看架构,结果地基都没打好,致使面试的时候,楼全面崩塌了。。。。好好反思吧。。。

BTY:
本人目前已离职,若是以为我还行,,,,,但愿各位大佬内推,B轮融资以上的就更好了。。。哦对,坐标深圳
我的网站:http://www.wenzhihuai.com/
个人简历:http://www.wenzhihuai.com/myresume.html
GitHub:https://github.com/Zephery

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息