- hashmap和hashtable区别
线程安全,非线程安全 - 为什么产生死锁
相互占有对方需要争夺的资源 - jvm类加载
使用ClassLoder分为
加载(会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口)
连接(校验=字节流符合虚拟机规范
、准备=给静态变量
等赋初始值0,如果是final会赋真值、解析=将符号
引用转为直接引用)
初始化(执行静态方法块)
运行
销毁 - java反射获取私有属性,改变值
要通过反射访问是有方法首先要将设置为access=true
来取消访问检查
然后要使用declare方法 - 反射用途 反射详细描述
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法,
编译后
就会把泛型给擦除
,使用反射可以设置进Object
- 在运行时调用任意一个对象的方法
- 在
运行时
创建新类对象Class.forName(), ClassLoader.loadClass()
class.newInstance, constructor.newInstance - 生成
动态代理
反射是为了能够动态的加载一个类,动态的调用一个方法,动态的访问一个属性等动态要求而设计的
Method,Constructor,field,Proxy,InvocationHandler
优点:可以动态的创建对象和编译,最大限度发挥了java的灵活性。
缺点:对性能有影响。使用反射基本上一种解释操作
,告诉JVM我们要做什么并且满足我们的要求,这类操作总是慢于直接执行java代码
- 所用数据库
- 项目难点,问题
- 如何解决项目中遇到的问题
- 数据库乐观锁使用
version - 状态机(有限状态机)
一个有限状态机(后文以状态机缩写指代)是一种
特殊的组织代码
的方式,用这种方式你能确保你的对象随时
都知道自己所处的状态
以及所能做的操作
。其中每一个状态
都是独立的代码块
,与其他不同的状态分开独立运行,这么做可以使得游戏的调试变得更加方便,同时也更易于增加新的功能
列出 所有状态枚举
列出 状态 -> 状态
所有可能(分布式状态变更需要传递状态变更前后信息)
实现 状态
对应事件操作
reactor
的EventBus
实现事件驱动,监听者记忆变化前和变化后状态,发送通知,@Selector
根据配置好的状态机变更流程,做出处理
-
如何解决状态机不对问题
丢弃不存在的注册状态,并且打warn日志 -
如何分库分表
按用用户规则分库分表 -
MySQL极限
-
HashMap源码
hashcode(=hashcode^h>>>16
)
resize(原容量大小&数据hashcode
如果为1迁移到新链表,否则在旧链表)
table[] + link + redblack-tree
1.8解决了死循环,原来使用头插法为了读到热数据,改成使用尾插法 -
设计一个线程安全的HashMap
直接给方法加 synchronized
或者使用小粒度的读写锁,在put的链表头锁,并且同事更新count -
快排的实现,时间复杂度和空间复杂度
时间复杂度O(nlogn),空间复杂度O(nlogn)
partition();
left();
right();
-
会什么算法
-
如何把项目变成SOA架构
有序,服务化,业务服务化
搭建esb总线, -
Spring源码,最深刻的模块,aop用途
-
JVM内存模型
-
垃圾回收机制
-
项目中查看垃圾回收
-
栈溢出,堆溢出
不断递归方法,会导致stackoverflow
不断往集合新加对象,又不删除,会导致 heapoverflow,死循环不断创建对象,直接解析一个超大的json成为对象(而没有局部处理)
比如ThreadLocal,使用了weakReference
保存,在gc的时候会回收没有引用的对象
softReference
在oom前会回收没有引用的对象
Guava的Cache就使用了弱引用
和软引用
-
synchronized和lock原理和使用
隐式(jvm释放) 和 显示(手动释放)
都能重入
用CAS来优化重量级的Mutex Lock(此锁会在用户态
和内核态
切换,导致线程上下文
切换,性能很差)
网友评论