-
JPA 多数据源实现
-
线程同步方法
-
有几种线程池
-
CAS机制
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。
CAS通过调用JNI的代码实现的。JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言。
而compareAndSwapInt就是借助C来调用CPU底层指令实现的。
下面从分析比较常用的CPU(intel x86)来解释CAS的实现原理。
http://zl198751.iteye.com/blog/1848575
-
CAS 全称
Compare and Swap(比较和交换)
-
垃圾回收机制
可达性算法 新生代每清除一次记1 新生代 达到15岁 移动到老年代
新生代 使用 复制算法
每次按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收
复制算法原理 (新生代)
Survivor区,一块叫From,一块叫To,对象存在Eden和From块。当进行GC时,Eden存活的对象全移到To块,而From中,存活的对象按年龄值确定去向,当达到一定值(年龄阈值,通过-XX:MaxTenuringThreshold可设置)的对象会移到年老代中,没有达到值的复制到To区,经过GC后,Eden和From被清空。
即若只分一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移走,剩下的对象直接清理即可。
另外,分成两块Survivor,From和To分工明确,逻辑理解和技术实现较简单。
标记整理算法(老年代)
标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。
整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。
一般来说,大对象会被直接分配到老年代,所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组,比如:
byte[] data = new byte[4*1024*1024]
这种一般会直接在老年代分配存储空间。
- Java8开始使用G1 Java9正式G1 作为默认的垃圾回收
- G1 原理就是 开始全局 使用 标记整理算法 包括新生代和老年代
-
注册中心保持高可用
Eureka
自我保护机制
心跳 可以设置1s 一次 剔除列表
Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。
Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
Consul
-
最近印象深刻的项目
-
Redis中的数据结构有哪些
简单动态字符串
链表
字典
跳跃表
整数集合
压缩列表
对象
-
使用了zk 和redis 的什么
-
RPC框架比较
-
三个词语评价自己
-
Java中几种Map
-Hashtable(线程安全--废弃)、LinkedHashMa(链表)、TreeMap(基于红黑树)、WeakHashMap、ConcurrentHashMap(线程安全)、HashMap(哈希表 非线程安全 -
怎么形容Stream 函数式编程