今年想做的事情课太多了,长这么大,从来没这么努力过,希望年底的时候能对得起自己的付出,新的一年,加油呀!
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编程。
image
imagejavap命令
查看二进制文件
jclasslib
一个idea插件,查看字节码
三色标记的大致流程可以讲一下吗
三色标记算法是一种查找垃圾的算法假设三种颜色
白色:初始状态
灰色:当前类存在关联类未标记
黑色:当前类及其关联类全标记
流程
初始状态:所有对象标记位白色
并发标记:所有从GC ROOTS开始查找的对象标记为灰色
最终标记:将灰色节点标记位黑色,开始查找关联节点标记位灰色
重复上述流程
最终白色的就是垃圾
ArrayList 和 Array(数组)的区别?
可变
javaIO设计模式之装饰器模式
装饰器实际就是对某个类增强,
类的生命周期
加载:将字节码转为jVM中的符号引用
校验 :校验语法
初始值:分配空间
引用:将符号引用转为直接引用
初始化:初始化值
使用
销毁
帧数据
帧数据实际就是栈数据,每个线程会分配一个栈帧,包含程序计数器,局部变量表,操作数栈,引用链接等
CMS收集器
是基于标记-整理算法实现的垃圾收集器,常用于老年代。存在的问题主要是容易产生浮动垃圾
回收过程
初始标记:从GCROOTS开始查找所有对象(STW)
并发标记:从这些对象开始查找关联的对象
最终标记:标记上个阶段产生的垃圾
清除阶段:清除垃圾
领取专属 10元无门槛券
私享最新 技术干货