架构筑基
Java 程序性能优化
JVM 性能调优
Linux 基础与进阶
MySQL
Tomcat
并发编程进阶
高性能 Netty 框架
JVM
内存模型以及分区, 需要详细到每个区放什么
堆里面的分区: Eden,survival (from+ to), 老年代, 各自的特点
对象创建方法, 对象的内存分配, 对象的访问定位
GC 的两种判定方法
SafePoint 是什么?
GC 的三种收集方法: 标记清除, 标记整理, 复制算法的原理与特点, 分别用在什么地方, 如果让你优化收集方法, 有什么思路?
GC 收集器有哪些? CMS 收集器与 G1 收集器的特点
Minor GC 与 Full GC 分别在什么时候发生?
几种常用的内存调试工具: jmap,jstack,jconsole,jhat
类加载的几个过程
JVM 内存分哪几个区, 每个区的作用是什么?
如和判断一个对象是否存活?(或者 GC 对象的判定方法)
简述 java 垃圾回收机制?
java 中垃圾收集的方法有哪些?
java 内存模型
java 类加载过程?
简述 java 类加载机制?
类加载器双亲委派模型机制?
什么是类加载器, 类加载器有哪些?
简述 java 内存分配与回收策率以及 Minor GC 和 Major GC
Netty
BIO,NIO 和 AIO 的区别?
NIO 的组成?
Netty 的特点?
Netty 的线程模型?
TCP 粘包 / 拆包的原因及解决方法?
了解哪几种序列化协议?
如何选择序列化协议?
Netty 的零拷贝实现?
Netty 的高性能表现在哪些方面?
NIOEventLoopGroup 源码?
并发编程
现在有 T1,T2,T3 三个线程, 你怎样保证 T2 在 T1 执行完后执行, T3 在 T2 执行完后执行?
在 Java 中 Lock 接口比 synchronized 块的优势是什么? 你需要实现一个高效的缓存, 它允许多个用户读, 但只允许一个用户写, 以此来保持它的完整性, 你会怎样去实现它?
在 java 中 wait 和 sleep 方法的不同?
用 Java 实现阻塞队列
用 Java 写代码来解决生产者 -- 消费者问题
用 Java 编程一个会导致死锁的程序, 你将怎么解决?
什么是原子操作, Java 中的原子操作是什么?
Java 中的 volatile 关键是什么作用? 怎样使用它? 在 Java 中它跟 synchronized 方法有什么不同?
什么是竞争条件? 你怎样发现和解决竞争?
你将如何使用 threaddump? 你将如何分析 Thread dump?
为什么我们调用 start()方法时会执行 run()方法, 为什么我们不能直接调用 run()方法?
Java 中你怎样唤醒一个阻塞的线程?
在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?
什么是不可变对象, 它对写并发应用有什么帮助?
你在多线程环境中遇到的常见的问题是什么? 你是怎么解决它的?
面试题解答
java 内存模型
java 内存模型 (JMM) 是线程间通信的控制机制. JMM 定义了主内存和线程之间抽象关系. 线程之间的共享变量存储在主内存 (main memory) 中, 每个线程都有一个私有的本地内存(local memory), 本地内存中存储了该线程以读 / 写共享变量的副本. 本地内存是 JMM 的一个抽象概念, 并不真实存在. 它涵盖了缓存, 写缓冲区, 寄存器以及其他的硬件和编译器优化. Java 内存模型的抽象示意图如下:
从上图来看, 线程 A 与线程 B 之间如要通信的话, 必须要经历下面 2 个步骤:
1. 首先, 线程 A 把本地内存 A 中更新过的共享变量刷新到主内存中去.
2. 然后, 线程 B 到主内存中去读取线程 A 之前已更新过的共享变量.
Netty 的高性能表现在哪些方面?
心跳, 对服务端: 会定时清除闲置会话 inactive(netty5), 对客户端: 用来检测会话是否断开, 是否重来, 检测网络延迟, 其中 idleStateHandler 类 用来检测会话状态
串行无锁化设计, 即消息的处理尽可能在同一个线程内完成, 期间不进行线程切换, 这样就避免了多线程竞争和同步锁. 表面上看, 串行化设计似乎 CPU 利用率不高, 并发程度不够. 但是, 通过调整 NIO 线程池的线程参数, 可以同时启动多个串行化的线程并行运行, 这种局部无锁化的串行线程设计相比一个队列 - 多个工作线程模型性能更优.
可靠性, 链路有效性检测: 链路空闲检测机制, 读 / 写空闲超时机制; 内存保护机制: 通过内存池重用 ByteBuf;ByteBuf 的解码保护; 优雅停机: 不再接收新消息, 退出前的预处理操作, 资源的释放操作.
Netty 安全性: 支持的安全协议: SSL V2 和 V3,TLS,SSL 单向认证, 双向认证和第三方 CA 认证.
高效并发编程的体现: volatile 的大量, 正确使用; CAS 和原子类的广泛使用; 线程安全容器的使用; 通过读写锁提升并发性能. IO 通信性能三原则: 传输(AIO), 协议(Http), 线程(主从多线程)
流量整型的作用(变压器): 防止由于上下游网元性能不均衡导致下游网元被压垮, 业务流中断; 防止由于通信模块接受消息过快, 后端业务线程处理不及时导致撑死问题.
TCP 参数配置: SO_RCVBUF 和 SO_SNDBUF: 通常建议值为 128K 或者 256K;SO_TCPNODELAY:NAGLE 算法通过将缓冲区内的小封包自动相连, 组成较大的封包, 阻止大量小封包的发送阻塞网络, 从而提高网络应用效率. 但是对于时延敏感的应用场景需要关闭该优化算法.
用 Java 实现阻塞队列
这是一个相对艰难的多线程面试问题, 它能达到很多的目的. 第一, 它可以检测侯选者是否能实际的用 Java 线程写程序; 第二, 可以检测侯选者对并发场景的理解, 并且你可以根据这个问很多问题. 如果他用 wait()和 notify()方法来实现阻塞队列, 你可以要求他用最新的 Java 5 中的并发类来再写一次.
最后
面试题及答案的获取方式, 也为大家提供一个交流学习的平台: 805685193. 有免费分享的视频, 还有 Java 架构思维导图, 主要分享分布式架构, 高可扩展, 高性能, 高并发, 性能优化, Spring boot,Redis,ActiveMQ,Nginx,Mycat,Netty,Jvm 大型分布式项目实战学习架构师视频.
来源: http://www.jianshu.com/p/95d6abdc8904