基础
1、 bio nio区别
bio 是一种同步阻塞io,读写必须在一个线程内完成。
nio是同步非阻塞io,基于通道,面向缓冲区的,同步和异步说的是消息的通知机制,非阻塞体现在,这个线程可以去干别的,不需要一直在这等着io read writer。
aio异步非阻塞io
2、poll epoll 区别
poll文件描述符(指针)加载到内核态进行监控。内核态到用户态,来回拷贝。
epoll(不需要来回拷贝)
1)调用epoll_create建立一个epoll对象,这个对象包含了一个红黑树和一个双向链表。并与底层建立回调机制。
2)调用epoll_ctl向epoll对象中添加这100万个连接的套接字
3)调用epoll_wait收集发生事件的连接。
3、hashCode和equals
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等的
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
4、Java8中的解决方案
Java8中已经提供了官方的解决方案,Java8中新增了一个注解:@sun.misc.Contended。加上这个注解的类会自动补齐缓存行,需要注意的是此注解默认是无效的,需要在jvm启动时设置-XX:-RestrictContended才会生效。
https://blog.csdn.net/hanmindaxiongdi/article/details/81159314
集合
1、RandomAccess
RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。
下面再总结一下 list 的遍历方式选择:
实现了 RandomAccess 接口的list,优先选择普通 for 循环 ,其次 foreach,
未实现 RandomAccess接口的list,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的,),大size的数据,千万不要使用普通for循环
2、Hashmap
hashmap1.7put resize 通过头插法的方式,并发可能造成形成一个循环链表,造成死循环。
3、ConcurrentHashMap get为什么不需要加锁
因为node 节点的value 和next Node 都是用volatile修饰。并不是因为数组上的volatile。
数组中的volatile只能保证array中的地址是,并不保证value值是
并发
1、synchronized 原理
通过查看字节码,同步代码块中monitor(对象头中),monirotenter,monitorexit指令,同步方法:ACC_SYNCHRONIZED标志位同步方法。
对象头
偏向锁、轻量级锁加锁过程https://www.cnblogs.com/lzh-blogs/p/7477131.html
自旋锁、锁消除、锁粗化
2、AtomicReference,AtomicStampedReference与AtomicMarkableReference的区别
https://www.cnblogs.com/xyhz0310/p/9627582.html
3、线程中断的方法
https://www.cnblogs.com/aspirant/p/9184547.html
JVM
1、JDK8堆默认比例
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。
老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
2、# JVM: CMS过程中的promotion failure和concurrent mode failure有何区别
数据库
1、mysql分为当前读和快照读
2、varchar char
varchar 长度65535 char 255 varchar可变长度,char定长
3、磁道、磁盘块、页
索引是按照磁盘块为节点存储,磁盘块中包括,指针、数据项
4、MySQ binlog三种模式及设置方法
行模式 日志中会记录每一行数据被修改的形式
每一条会修改数据的sql都会记录到master的bin-log中
Mixed 自动模式
缓存
redis中的字符串类型是怎么实现的;(SDS)
消息队列
1、kafka 高效的原因
1、基于零拷贝技术
2、磁盘顺序写入
3、kafka 使用了 分区、分布式
框架
1、Spring Bean的生命周期
2、spring事务传播行为
PROPAGATION_REQUIRED 表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行
PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
PROPAGATION_REQUIRED_NEW 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常
PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务
3、容器初始化
注册BeanFactoryPostProcessor
注册BeanPostProcessor
初始化上下文的消息源(国际化处理)
初始化了一个事件传播器
加载监听器
非惰性Bean 初始化
算法
Linux
查看日志中访问次数最多的前10个IP
文件格式
1 192.168.1.1
2 192.168.1.2
3 192.168.1.3
4 192.168.1.1
5 192.168.1.1
6 192.168.1.2
cat access_log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | head -n 10
cut -d ' ' -f 1 access_log |sort |uniq -c | sort -nr | head -n 10
cat access_log|awk -F " " '{print $2}'|sort|uniq -c|sort -nr|head -n 10