java面试准备10

Posted 清和与九

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试准备10相关的知识,希望对你有一定的参考价值。

如何判断一个对象是否存活?(或者GC对象的判定方法)

(1)引用计数法
所谓引用计数法就是给每一个对象一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是死对象,将会被垃圾回收。引用计数法无法解决循环引用问题,也就是对象A引用对象B,对象B又引用对象A,那么此时A,B对象的引用都不为零,也就造成了无法完成垃圾回收,所以主流的虚拟机都没有使用这种算法。
(2)可达性算法(引用链法)
该算法从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连接时,就说明此对象不可用。
在Java中可以作为GC Roots的对象有以下几种:
虚拟机栈中引用的对象
方法区类静态属性引用的对象
方法区常量池引用的对象
本地方法栈引用的对象

虽然这个算法可以判定一个对象是否可以被回收,当满足上述条件时,一个对象不一定会被回收,此时出于死缓状态,若要被真正的回收需要经历两次标记。

简述Java垃圾回收机制?

在java中,程序员是并不需要显示地去挨个释放对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下不会执行,只有在虚拟机空闲或者当前堆内存不足时,才会 触发执行,扫描那些没有被任何引用的对象,并将它们添加到回收的集合中,进行回收。

java类加载过程?

加载:
(1)通过类的全限定类名获取该类的二进制流
(2)将该类中的静态存储结构转化为方法区的运行时结构
(3)在内存中生成该类的Class对象,作为该类的访问入口。

验证:
验证的目的是为了确保Class文件的字节流中的信息不会危害到虚拟机。
准备:
准备阶段是为类的静态变量分配内存,并初始化为默认值,这些内存都在方法区内进行分配。准备阶段不分配类中的实例变量的内存,实例变量的内存会随着对象的初始化一起分配在堆中。
public static int value = 123;在准备阶段value的初试值为0.在初始化阶段才会变为123。

解析:
该阶段主要完成从符号引用到直接引用的转换动作。

初始化:初始化是类加载的最后一步,前面的类加载过程,除了在加载阶段用于应用程序可以通过自定义类加载器参与之外,其余动作都由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中的java程序代码。

Java8与元数据

在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间的本质和永久代类似,区别为:元空间不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小受本地内存限制。类的元数据放入本地内存,字符串池和类的静态变量放入java堆中,这样加载多少类的元数据都不再由MaxPermSize控制,而由系统的实际内存来控制。

阻塞IO模型

最传统的IO模型,即在读写数据时会发生阻塞现象。当用户线程发出IO请求之后,内核会先去查看数据是否就绪,如果没有就会等待就绪,此时用户线程被阻塞,用户线程交出CPU。当数据就绪后,内核会将数据拷贝到用户线程,并将结果返回用户线程,此时线程解除阻塞状态。

非阻塞IO模型

当用户线程发起IO请求之后,无需等待,而是马上得到结果,如果结果是error,它就知道数据还未准备好,此时再次发送read操作。一旦数据准备好了,并且再次收到用户线程的请求,那么内核马上将数据拷贝到用户线程,然后返回。

所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否准备就绪,也就是说非阻塞IO不会交出CPU,而会一直占用CPU。

多路复用IO

多路复用IO模型实际上就是Java使用的NIO。Java NIO实际上就是多路复用IO。在多路复用IO模型中,会有一个线程不断去轮询socket的状态,只有当真正有读写事件时,才会真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要一个线程就可以管理多个socket,系统不需要建立新的线程或者进程,也不需要维护他们,并且只有真的有socket读写操作时,才会使用IO资源,大大减小了IO占用。在java NIO中,通过selector.select()去查询每个通道是否有到达事件,如果没有,则阻塞,因此这种方式会导致用户线程的阻塞。多路复用IO模式,通过一个线程管理多个socket。
多路复用IO比NIO好的原因是,NIO不断地询问socket状态是通过用户线程执行的,而多路复用轮询每个socket状态是在内核执行的,效率比用户线程高。

信号驱动IO模型

在信号驱动IO模型时,用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时就会发送一个信号给用户线程,收到信号后,用户线程在信号函数中调用IO读写操作进行真正的读写操作。

异步IO模型

当用户线程发起读写操作后,立刻去做其他事情。从内核角度,收到一个异步读写请求后,立刻返回读写请求建立成功的标识,因此用户线程不会有任何阻塞。然后内核在数据准备完成后,将数据拷贝到用户线程,完成以后,内核给用户线程发送信号,告诉它读操作已经完成。
在异步IO中,IO操作的两个阶段都不会阻塞用户进程,全都由内核完成。

JAVA NIO

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区),Selector。传统IO基于字节流和字符流进行操作,而NIO基于通道和缓冲区进行操作。数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selectot(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个通道数据。

NIO的缓冲区

java IO面向流意味着每次都从流中读一个或者多个字节,直至读取所有字节,他们没有被缓存在任何地方。此外,它不能前后移动流中的数据,如果需要前后移动从流中读取的数据,需要先将它们缓存到缓冲区中。NIO的缓冲区导向方法不同。数据读取到一个它稍后处理的缓冲区中,需要时可在缓冲区前后移动。

NIO的非阻塞

IO的各种流是阻塞的。这意味着,当一个线程调用read()或者write()时,该线程被阻塞,直到有一些数据被读取,或者完全写入,该线程在此期间不能再坐任何事情了。NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果没有可用数据,则获取为空,而不是保持线程阻塞,直至数据变为可读时,该线程可以做其他事情。线程通常将非阻塞IO的空闲时间用到其他通道上进行IO操作,所以一个单独的线程可以管理多个输入和输出通道。

Selector

Selector类也是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果发生,则获取时间然后针对每个事件进行相应的处理,这样一来,用一个单线程就可以管理多个通道。这样使得连接真正有读写事件发生时,才会调用函数读写,减少系统开销。

BAT Java面试完整汇总:面试准备(心态+简历)+面试题目+6条面试经验

技术图片

今天分享的BAT面试完整内容主要包含:

  1. 面试前的心态准备(3点建议)
  2. 技术硬实力包含的范围(50题目)
  3. 个人简历突出和优化(3点优化步骤)
  4. 个人软实力的提升(6点提升维度)
  5. BAT面试经验总结(1点总结)

1. 面试前的心态准备

心态可以影响你面试的准备,笔试的状态,实力的发挥,可以影响一个面试过程的方方面面。心态崩了,就只剩运气了,offer估计也就走远了。

那怎么调整自己的心态呢?

  • 首先是要正视自己的能力,不轻视,不高估。

不高估就是要清楚自己的能力范围,不是说期望过高不好,但过高的期望会让你的心理变得脆弱,稍有不顺心态就有崩掉的趋势。因为面试毕竟有太大的偶然性,就算你达到了一定的水平,相应水平的岗位也不是百发百中的,更不要说身边有那么多大神和收割机,天天拿offer拒offer,对心理都是不小的冲击。

  • 不要总给自己消极的暗示,心态差了积极调整。

大多数的人,总暗示自己说什么时间不多了,怎么每天过这么快效率怎么这么低。到笔试了,跟自己说这个算法太难了,肯定做不出来;临到面试了,跟自己说千万别问我linux内核,别问我分布式,问我肯定完;面试过之后,没有结果,就天天想肯定又挂了,唉我怎么这么菜。

如果这一系列的表现形成习惯,那心态这个系数最多0.5,能发挥出来的东西也都打了一半的折扣。凡事都不要太悲观,一个offer没拿到,正常情况是这个失败的经历产生的经验和总结是会让下一次的成功率提高的,千万别因为这些消极的暗示,反而让该有的提高都没有了。

心态差的时候反而要停下你重复而没有效率的工作,去调整一下。

  • 对于身边的同学,多交流,不比较。

有一些一起准备的好伙伴是件非常好的事情,不仅可以互相督促,而且可以在交流和分享的过程中取长补短。

对自己的水平有个很清楚的认识,并选择自己合适的公司,好好准备自己的笔试、面试,不怕失败,但保证每次面试都有收获和提高,那满意的offer早晚会来。

2.技术硬实力

实力我主要分为硬实力和软实力。硬实力,也就是技术上的真实积累(当然产品岗的就是对于产品相关知识的积累)。

什么是硬实力?我举几个例子,可以比对自己的技术优势,这些知识不管是校招还是社招,建议都提前把算法、数据库、编程语言等掌握牢固:

基础知识:

  1. 算法和数据结构
  2. 数组、链表、二叉树、队列、栈的各种操作(性能,场景)
  3. 二分查找和各种变种的二分查找
  4. 各类排序算法以及复杂度分析(快排、归并、堆
  5. 各类算法题(手写)
  6. 理解并可以分析时间和空间复杂度。
  7. 动态规划(笔试回回有。。)、贪心。
  8. 红黑树、AVL树、Hash树、Tire树、B树、B+树。
  9. 图算法(比较少,也就两个最短路径算法理解吧)
  10. 计算机网络
  11. OSI7层模型(TCP4层)等

数据库

  1. 数据库(最多的还是mysql,Nosql有redis)
  2. 索引(包括分类及优化方式,失效条件,底层结构)
  3. sql语法(join,union,子查询,having,group by)
  4. 引擎对比(InnoDB,MyISAM)
  5. 数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)
  6. 隔离级别,依次解决的问题(脏读、不可重复读、幻读)
  7. 事务的ACID
  8. B树、B+树
  9. 优化(explain,慢查询,show profile)
  10. 数据库的范式。
  11. 分库分表,主从复制,读写分离。
  12. Nosql相关(redis和memcached区别之类的,如果你熟悉redis,redis还有一堆要问的)

操作系统:

  1. 进程通信IPC(几种方式),与线程区别
  2. OS的几种策略(页面置换,进程调度等,每个里面有几种算法)
  3. 互斥与死锁相关的
  4. linux常用命令(问的时候都会给具体某一个场景)
  5. Linux内核相关(select、poll、epoll)

编程语言

  1. 编程语言(这里只说Java):
  2. Java基础(面向对象、四个特性、重载重写、static和final等等很多东西)
  3. 集合(HashMap、ConcurrentHashMap、各种List,最好结合源码看)
  4. 并发和多线程(线程池、SYNC和Lock锁机制、线程通信、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理等等)
  5. JVM(内存模型、GC垃圾回收,包括分代,GC算法,收集器、类加载和双亲委派、JVM调优,内存泄漏和内存溢出)
  6. IO/NIO相关
  7. 反射和代理、异常、Java8相关、序列化
  8. 设计模式(常用的,jdk中有的)
  9. Web相关(servlet、cookie/session、Spring 、Mybatis、Tomcat、Hibernate等)
  10. 看jdk源码。

这些都是技术硬实力的体现,当然,如果你是面试BAT架构师,这里还会涉及到:

分布式技术架构的知识体系:

  1. CAP原理和BASE理论。
  2. Nosql与KV存储(redis,hbase,mongodb,memcached等)
  3. 服务化理论(包括服务发现、治理等,zookeeper、etcd、springcloud微服务、)
  4. 负载均衡(原理、cdn、一致性hash)
  5. RPC框架(包括整体的一些框架理论,通信的netty,序列化协议thrift,protobuff等)
  6. 消息队列(原理、kafka,activeMQ,rocketMQ)
  7. 分布式存储系统(GFS、HDFS、fastDFS)、存储模型(skipList、LSM等)
  8. 分布式事务、分布式锁等

个人软实力

软实力主要就是指平时在语言沟通、逻辑思维、面试的积极性和主动性、简历的优化技巧等方便。

通过软实力来突出自己的优势,与硬实力的结合,才是你自己真正的实力体现。

  • 沟通和逻辑思维能力:

对一个问题的表达方式,逻辑思维(像有些人的发言就让人听上去很有层次感,很舒服),沟通的层次感,善于短时间突出重点。

  • 面试的积极性和主动性:

尤其是BAT,特别喜欢主动性和积极性的人才,主动性的人更加擅长于克服当前的困难,并把事情做好,在遇到挫折后,更容易调整好心态,且积极去推进项目。这一点,在面试的沟通过程中,有经验的BAT面试官可以通过与你的交流细节,可以捕获到部分你的性格优势和劣势。总之,主动性和乐观性的人,更有利于今后的发展,这一点不仅仅适用于面试,更适用于今后的工作发展。

  • 简历的准备
  1. 简历重点是突出自我介绍、擅长技能、项目经验。自我介绍要做到一句话就能表述清楚自己的优势,比如:学习能力(短时间熟练掌握技能)、个人履历(BAT背景优势)、积极努力(个人推动什么项目等)。
  2. 擅长技能:专业技能的描述词无非就那么几种:精通、熟练、熟悉、了解。精通感觉一般还是不要写,除非你在某个技术点上真的有足够的把握,真正能做到精通一门语言、一个分布式框架这才是精通。熟悉、熟练居多、精通是典型的金字塔顶部。总之,简历不要过于突出精通项数,而是突出精通的领域。
  3. 项目经验:突出自己的王牌项目,最有技术含量、挑战和帮助最大一个项目讲就足够了,面试的过程中面试官也会重点让你描述这个擅长的项目,提前模拟这个项目的讲解顺序和重点,而不是临场讲解
  • 做一个靠谱且有责任心的人:

很多公司在内部的面试细则上面都会注明这一点,如果价值观或是人品问题会直接否决。没有一个面试官不想找一个技术出众又有责任心的人,请相信我,责任心非常重要,更有利于今后的晋升。

最后,在你通过了硬实力和软实力的考核后,剩下的就是缘分了,你的面试气场与BAT面试官的匹配度,每一个面试官都希望找到与自己类似的求职人才,这也许就是闻味吧。

BAT面试总结:

offer = 心态 * (硬实力 + 软实力) + 缘分运气,每一个人都是经历不断面试失败再总结,再优化面试经验,再提升技术深度,从而找到一份自己心仪的工作,以上就是我的分享,希望对你的BAT面试之旅有所帮助!


没钱没人脉也能轻松入门,让你每年多赚10万!

技术图片





以上是关于java面试准备10的主要内容,如果未能解决你的问题,请参考以下文章

Java面试--JVM类加载

如何准备JAVA面试

BAT大厂java程序员面试必问:JVM+Spring+分布式+tomcat+MyBatis

Java架构之路-(面试篇)JVM虚拟机面试大全

Java架构之路-(面试篇)JVM虚拟机面试大全

java架构之路-(面试篇)JVM虚拟机面试大全