title | date | tags |
---|---|---|
面试问题收藏 |
2016-09-19 16:58:35 -0700 |
[TOC]
这些是我最近想到的一些问题,比较基础。回答的不一定完全准确,一些自己还不是很明白,需要思考学习。
TCP/IP是指由TCP、UDP、IP、ICMP等协议组成的协议簇
常说的三次握手,四次挥手。还是用图来表示最清楚了。
TCP: 面向连接,提供可靠性机制 UDP: 不保证可靠性
IP层负责主机路由 TCP层负责端到端的传输,主机上的每个程序都可以是一个端。用一个端口号表示。
TCP层在IP层的基础上,增加了校验位验证数据完整性,为每个字节分配一个一个序列号,这样可以在数据包不按顺序到达目的地时可以重新组合,另外还提供了确认和重传的机制来提高数据到达可靠性,
tcpdump -i eth1 tcp port 2222 and src 122.222.22 wireshark界面和命令行
ICMP UDP
ip和网卡地址的互相解析
表示连接错误,一般发生的原因有
- 对方设置SO_LINGER为启用且到时了,对方会发送一个RST包,表示连接已经被重置,对方的端口不会表示成TIME_WAIT状态
- 中间如果有代理服务,代理服务可能会判断连接会话超时,同时向双方发送RST
- RST包: 在向一个没有监听的端口发送SYN时,也会返回
NO_DELAY是是否启用Nagle,TODO
TODO
文本传输协议
DNS解析域名到ip映射 获得ip后通过ip和端口号请求 依次通过TCP、IP层 链路层传输到下一个主机,MAC地址是下一站的MAC地址
domain naming service 解析域名到ip地址
http over SSL/TLS
反向代理、负载均衡
- cp
- mv
- ls ll
- grep
- |
- cat less head tail
- vim 操作
- scp
- awk
- sort uniq
- nc
- top
- uptime
- sar
- ps
- dstat
- vmstat
- iostat
- df
- du
- ss
- netstat
- lsof
jdk bin目录下的工具
HashMap是Map的一个实现,内部数据结构通常是数组,数组的元素通常是链表,链表的元素是key-value的键值对。通过hash函数将key映射到一个hash值,这个hash值可以用来路由到具体的数组上。JDK8后会在链表长度达到一定长度后转换成一个红黑树。当HashMap存储的元素较多时,会造成链表比较长,这样get和put等操作的时间会增加,所以HashMap需要动态扩容,规则是HashMap中有一个capacity值和loadFactor值,现版本默认分别是16和0.75,capacity就是内部数组的大小,当Map的数据也就是键值对的数量超过capacity * loadFactor时就会进行resize或叫rehash,会创建一个2*capacity的数组,并将旧数组的内容转移到新数组上。
通常意义上讲HashMap不是线程安全的,HashTable是线程安全的,原因是HashMap中的并发resize()操作可能导致Node数据引用错误,甚至出现死循环,并且Node中的value和next没有使用volatile声明也没有其他加锁等可见性保证,所以在并发使用HashMap时必须要在外层加锁。HashTable解决了这个问题是通过将其对外方法上都加上了synchronized关键字在实例对象上加锁来维护数据一致性、可见性来实现线程安全的。但是即使是这样在putIfAbsent等操作还是需要外部加锁。由于HashTable将方法都加锁,导致操作都是串行执行的,性能不佳。ConcurrentHashMap是java.util.concurrent包中的一种并发集合,用来替代HashTable成为线程安全的HashMap,替代的是HashTable的线程安全语义而不是它的synchronize同步语义。ConcurrentHashMap中读不加锁,写入时采取分段锁,将锁的粒度拆小到每个数组上,这样大大减少了锁冲突,并且有Node中使用volatile等其他可见性保证。
静态代理是指手动实现一个接口或继承一个类,并将方法转发到其他的实现上,并在其上包装一些其他功能,如打日志、认证等。这样的方式缺点是需要给每个类都写一个代理,耦合严重且繁琐易出错。 动态代理可以在运行时生成或替换对应接口的实现, 常见的动态代理技术有jdk Proxy, CGlib, ASM字节码增强等。jdk Proxy主要依靠java.lang.reflect.Proxy。 JDK Proxy 参考链接
- https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html
- http://rejoy.iteye.com/blog/1627405
- https://opencredo.com/dynamic-proxies-java-part-2/
java virtual machine Java运行bytecode的地方,通过JVM抽象,可以实现平台无关性,一次编写到处运行(write once, run everywhere or write one, debug everywhere) 字节码这一层抽象也实现了语言无关性,只要能够编译出符合JVM规范的字节码,无论是scala、groovy等语言的代码都能在JVM上运行
- u2 magiccode
- u2 minor version
- u2 major version
- u2 constant pool count
- constant pool[constant pool count -1]
- access flag
- this class
- super class
- interface count
- [count] interfaces
- field count
- [count] fields
- method count
- [count] methods
- attributes
- aload_0
- astore_0
- iconst_0
- bipush 100
- pop
- swap
- dup, dup_x1
- inc
- getfield
- putfield
- getstatic
- putstatic
- invokestatic 调用静态方法
- invokevirtual 调用虚方法,动态分派
- invokespecial 调用构造器,私有方法,父类方法
- invokeinterface 调用接口方法
- invokedynamic java7增加的动态语言特性TODO
- iadd
- TODO
- goto
- ifcom TODO
- new
- check instance
- cast TODO
原子、可见性、重排序。 性能,死锁。 偏向锁、轻量级锁、自旋锁、重量级锁。
read write 阻塞需要单独一个线程来负责一个连接,非阻塞可以更很少的线程来管理
ServerSocketChannel, SocketChannel SelectionKey ByteBuffer clear, position, limit, flip, remaining等
- 推荐Doug Lea的nio.pdf *
Future, Listener
netty是什么 非阻塞的、事件驱动的快速网络开发框架,很快的开发出健壮高效的网络应用。 netty结构 大体包括Bootstrap启动模块 ChannelHandler 中实现我们的业务逻辑,或者一些Codec编码解码器 Channel 代表一个连接 ChannelPipeline, 每个Channel会有一个ChannelPipeline ChannelHandlerContext, pipeline和handler关联起来 ByteBuf Netty里的ByteBuffer实现
Servlet的作用,Servlet生命周期 Jetty结构,Jetty启动过程,一个请求从接收到返回的中间步骤
redis 数据结构 redis 数据结构实现 redis cluster redis 实现计数器 redis 实现缓存,缓存如何失效,缓存一致性,如何保证缓存和数据库的一致性 redis 实现发布订阅 redis 实现报警,判断一分钟达到阈值
kafka,rabbitmq
rabbitmq、activemq, redis实现,beanstalk
主键、索引、数据存储方式
- Java并发编程实践
- 深入理解Java虚拟机
- java虚拟机规范7、8
- 高性能mysql
- TCP/IP详解
- Netty In Action(英文版的)
- 计算机程序的构造与解释
- Clean Code( 代码整洁知道)
- EffectiveJava
- 重构( 我刚看了一点,羞愧,要补一补)
- Thinking In Java( 我刚看了一点,羞愧,要补一补)
- 代码大全
- 大型网站xxx(淘宝出的一些书,技术演进等等,能对互联网常用技术、发展有一个大概了解)
- Spring揭秘
- 从Paxos到Zookeeper
- Go语言编程
- Java并发编程的艺术
- Docker的一些书(介绍用就可以了,主要靠实践)
- 深入分析javaWeb内幕
- 软技能
- 人月神话
- Java特种兵
- ElasticSearch服务器开发
- Spring 3.x 企业应用开发
- spring技术内幕