dubbo负载均衡策略
- 轮询
- 随机:会有问题,单节点卡慢
- 最少活跃:使请求响应慢的节点任务更少
- 一致性Hash:相同参数请求总是请求到指定的节点
loadbalance 配置
dubbo线程模型
dispatcher
- all:所有请求都发到线程池
- direct:所有消息都不派发到线程池
- message:只有请求响应消息派发到线程池,其他连接断开,心跳等消息,直接再IO线程上执行
- excution:只有请求派发到线程池,不含响应,响应和断开,心跳等消息直接在IO线程上执行
- connection:再IO线程上,将连接断开事件放入队列,其它消息派发到线程池
threadPool
- fixed:固定大小
- cached:缓冲线程池
- limited:可伸缩线程池,线程只会增长不会收缩,防止大流量引起性能问题
- eager:优先创建worker线程池,超过maximum丢到阻塞队列中
put元素,如何计算hash值
首先通过hashcode计算,然后通过CRC16计算
put和get方法的实现
put
- 判断是否超过(负载因子*最大容量)阈值,超过阈值会出发扩容
- 扩容默认是2倍
- 计算hash值,然后判断值大小
- 如果值大于8且数组大小大于64,会转为红黑树;如果数组小于64或者值小于6会转为链表
- 在对应的数据结构上添加数据
get
- 计算hash值,查看对应的值是什么数据结构
- 根据对应的数据结构查找值
hashmap什么时候会转为红黑树
- 数组大于64
- 链表长度大于8
线程安全的Map
- concurrentHashMap
- collections工具类
- hashtable
hashmap是线程安全的吗
不是
put元素,如何计算hash值
首先通过hashcode计算,然后高16位异或运算
JDK7和8中HashMap区别
- jdk7采用头插法,8采用尾插法
- 7使用链表,8使用链表+红黑树
JDK7和8中concurrenthashmap区别
- 7使用分段锁8使用CAS+Node
JVM安全点和安全区域是什么
安全点
JVM清理垃圾的时候会暂停所有线程运行,即STW。安全点就是JVM设置的一些点位,当STW的时候,代码执行到点位的时候就会暂停执行,等待STW结束。 - 方法执行前 - 方法执行后 - 循环的末位
安全区域
某些运算比较复杂的方法或者执行时间较长的代码段不能立马结束,JVM就将这块特殊的区域标记为安全区域。安全区域中的代码执行完之后会查看是否STW结束了,如果结束了,就继续执行。如果没有结束,就等待。
常见的序列化协议有哪些
- json
- JDK原生
- protobuff
JDK自带序列化方式
实现Serilialable接口即可,实际就是WriteObject和ReadObject方法
无序性
值得是内部元素没有先后顺序区分
不可重复性
指的是内部元素不能重复
ArrayList扩容机制
- 默认扩容1.5倍
- 直接创建一个新的数组,然后将原来的数组拷贝过去,然后修改引用指针
如何自定义类加载器
继承ClassLoader,重写loadClass,findClass方法
类加载器
- 启动类加载器 加载lib下类
- 扩展类加载器 加载lib/ext下类
- 应用类加载器 加载用户
new一个HashMap的时候会发生什么
这里主要看两个参数,负载因子和容量,他们的乘积就是扩容阈值,默认扩容2的n次,实际就是2倍 默认大小16,默认负载因子0.75
copyonwritelist缺点
- 只能保证最终一致性,不能保证全程一致性
- 占用内存
什么是字节码
一种二进制文件,是通过Javac命令生成的一种文件,JVM能识别这种文件并实现跨平台特性。
受检异常和非受检异常有什么区别
受检异常:启动前必须显示处理,不然编译报错 非受检异常:可以不处理
Java中的Unsafe
Unsafe是Java提供的一个类,可以直接控制直接内存。
Vector和stack区别
Vector是数组,支持动态扩容 stack是栈,先进后出
linkedlist为什么不能实现randomaccess接口
randomaccess指的是随机读写,linkedlist底层是链表,无法实现
linkedlist插入和删除元素时间复杂度
插入:O(n) 删除:O(n)
ArrayList 与 LinkedList 区别
- 底层实现不同 数组 链表
- 使用场景不同 查询 增删
java随机访问流
randomaccessfile
Java字节流
input/outputstream
BIO
阻塞IO模型,值得是客户端发送请求后等待服务端响应,同一个线程同时只能处理一个请求。
对应Java中的实现就是,socket编程。


javap命令
查看二进制文件
jclasslib
一个idea插件,查看字节码
三色标记的大致流程可以讲一下吗
三色标记算法是一种查找垃圾的算法 假设三种颜色 - 白色:初始状态 - 灰色:当前类存在关联类未标记 - 黑色:当前类及其关联类全标记
流程
- 初始状态:所有对象标记位白色
- 并发标记:所有从GC ROOTS开始查找的对象标记为灰色
- 最终标记:将灰色节点标记位黑色,开始查找关联节点标记位灰色
- 重复上述流程
- 最终白色的就是垃圾
ArrayList 和 Array(数组)的区别?
可变
javaIO设计模式之装饰器模式
装饰器实际就是对某个类增强,
类的生命周期
- 加载:将字节码转为jVM中的符号引用
- 链接
- 校验 :校验语法
- 初始值:分配空间
- 引用:将符号引用转为直接引用
- 初始化:初始化值
- 使用
- 销毁
帧数据
帧数据实际就是栈数据,每个线程会分配一个栈帧,包含程序计数器,局部变量表,操作数栈,引用链接等
CMS收集器
是基于标记-整理算法实现的垃圾收集器,常用于老年代。存在的问题主要是容易产生浮动垃圾
回收过程
- 初始标记:从GCROOTS开始查找所有对象(STW)
- 并发标记:从这些对象开始查找关联的对象
- 最终标记:标记上个阶段产生的垃圾
- 清除阶段:清除垃圾


