深圳科瑞技术社招Java开发工程师一面
面试前的准备:(根据招聘简章获取的)
技术要求:
- Java数据结构、集合、IONIO等
- 多线程编程、熟悉分布式缓存消息队列等机制
- 熟悉JVM、内存模型、类以及性能优化
- 开源框架:Spring、SpringMVC、MyBatis、Hibernate等
公司要求项目经验:MES、WMS、OA、ERP、PLM等系统之间的数据交互
- 说说JVM的主要组成部分以及作用?-----最好画个草图,各个阐述计数器、堆、栈、方法区、类加载子系统、执行引擎等作用……这个如果细究起来很复杂的,远不是所谓的背诵几个属于概念,就看面试官是怎么认定了,光是一个栈的细究就一大堆,线程栈,一个方法对应栈帧内存(局部变量表、动态链接、方法出口……)……
- 什么是双亲委派模型?------一个类加载器受到类加载的命令时,首先会将请求委派给父类加载器去加载,因此根据层层传递,最终会被传入到顶层的启动类加载器(Bootstrap ClassLoader)只有到父类加载器无法完成这个类的加载请求时,子类加载器才会加载。
- 类加载执行原理,以及类加载器?-----也就是类加载机制,虚拟机将class文件加载到内存,并对数据校验、解析、初始化,最终形成可以被虚拟机直接使用的Java类型。(加载会有一个顺序,最好画个草图分别阐述各个分段过程……)类加载器有启动类加载器加载的是JDK类库lib下的,扩展类加载器……,应用程序加载器……,线程上下文类加载器……,自定义类加载器……
- 简单阐述下垃圾回收机制------分代回收,内存区域被划分不同的时代,对象根据存活的时间被保存在对应时代的区域中,一般分为年轻代、年老代、永久代。从年轻代分配内存,当对象存活时间足够长就会被复制到老年代,对于不同的时代使用不同的垃圾回收算法。
- 如果判断对象是否可以被回收?-----实际就是判断对象的存活,引用计数法 对象可达性
- JVM有哪些垃圾回收算法?------垃圾-标记 垃圾-复制 垃圾-整理 分代回收……
- 新生代垃圾回收器和老年代垃圾回收器有哪些?以及它们异同。
- JVM调优工具?以及调优参数?
- 分代垃圾回收器的工作原理?
- Java中有哪些锁?以及锁的状态?---------自旋锁……,偏向锁……,轻量锁……。状态:无锁,偏向锁,轻量级锁,重量级锁,只可升不可降……
- 死锁和产生死锁的原因和解决方法?--------所谓死锁就是多线程对一个资源的僵持,通俗来讲每个线程,我没拿到资源我也不会放弃手中的资源,每个都这样想,没有一个先放手打破这种僵持。至于理论上那些文绉绉的几个条件,我也没兴趣记忆……。
- BIO/NIO/AIO有什么区别?----BIO阻塞服务端循环监听客户端的连接,每接受到一个请求就创建一个线程,未接收到连接就会一直阻塞,所以会导致线程数膨胀JVM服务压力过大导致宕机。NIO引入了缓冲区线程无需阻塞地等待IO事件,但又出现了不断轮询客户端。AIO异步非阻塞的引入……具体的自己具体说。
- Collection和Collections有什么区别?
- List、Set、Map之间的区别?
- HashMap和Hashtable区别?
- HashMap和TreeMap的区别?
- ArrayList和Vector区别?
- sleep和wait的区别?---------------------以上对于Java封装的方法类……是常见的面试聊天,所以要进场对易混淆的方法类做对比地理解。
- 创建线程池以及线程池的状态?
- ThreadLocal的原理和使用场景?
- Synchronized底层实现原理以及和volatile的区别?
- Synchronized和ReentrantLock的理解--------最明显的就是一个是关键字、另一个是类,类的扩展和灵活更胜一筹,类中的方法可以设置等待时间,锁信息……
总结:一面主要还是以JVM底层一些东西聊……主要难点也是JVM展开的……
特别是画个草图来阐述,而且如何分析GC日志、如何查看一个程序的内部运行时的状态……模拟一个程序中线程不断循环创建对象,但对象又一直存活无法回收,通过一个JDK的工具jvisualvm清晰直观的查看底层动态的Old/Eden/S0/S1等,各个变化状态……直到内存溢出。
对class文件的理解,通过javap对字节码文件进行反汇编(参数-c)结合jvm手册阐述数据在jvm不同区的变化……
#社招##Java工程师##面经#