jvm内存模型

主内存:所有变量都保存在主内存中
工作内存:每个线程的独立内存,保存了该线程使用到的变量的主内存副本拷贝,线程对变量的操作必须在工作内存中进行

每个线程都有自己的本地内存共享副本,如果A线程要更新主内存还要让B线程获取更新后的变量,那么需要:

  • 将本地内存A中更新共享变量
  • 将更新的共享变量刷新到主内存中
查看更多

高并发、分布式学习

微服务如何拆分?
微服务如何选型、组合与落地?
微服务治理场景及方法有哪些?
流控、负载、容错级别、链路追踪参数等都有哪些调整策略?
需求、性能、数据一致性方面都需要注意那些设计细节?

1.微服务架构如何拆分
2.微服务架构应用场合
3.微服务架构与Docker容器化
4.微服务架构如何达到99.999%的高可用
5.微服务架构性能怎么满足千亿次请求调用
6.微服务架构开源框架对比(Spring Boot , Spring Cloud , Dubbo等)

Dubbo 微服务之负载均衡算法原理分析

  1. 如何理解集群与微服务的关系
  2. 负载均衡有哪些业务场景
查看更多

垃圾回收

基本回收算法

1. 复制(Copying)

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

2. 标记-清除(Mark-Sweep)

此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

3. 标记-整理(Mark-Compact)

此算法结合了 “标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

4. 分代(Generational Collecting)

垃圾收集器
串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并发回收GC(ParNew)

GC有两种类型:Scavenge GCFull GC
JVM分别对新生代和旧生代采用不同的垃圾回收机制

查看更多

ReentrantLock

什么是Reentrant

Jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。

Synchronized和ReentrantLock的相同点:

1.ReentrantLock和synchronized都是独占锁,只允许线程互斥的访问临界区。但是实现上两者不同:synchronized加锁解锁的过程是隐式的,用户不用手动操作,优点是操作简单,但显得不够灵活。一般并发场景使用synchronized的就够了;ReentrantLock需要手动加锁和解锁,且解锁的操作尽量要放在finally代码块中,保证线程正确释放锁。ReentrantLock操作较为复杂,但是因为可以手动控制加锁和解锁过程,在复杂的并发场景中能派上用场。

2.ReentrantLock和synchronized都是可重入的。synchronized因为可重入因此可以放在被递归执行的方法上,且不用担心线程最后能否正确释放锁;而ReentrantLock在重入时要却确保重复获取锁的次数必须和重复释放锁的次数一样,否则可能导致其他线程无法获得该锁。

查看更多

偏向锁升级为轻量级锁

对象处于偏向锁时,mark word中的偏向锁标记为1,锁标志位为01;下面是分析过jvm源码(biasedLocking.cpp)解析的偏向锁升级流程(忽略一些细节),示例中:线程1当前拥有偏向锁对象,线程2是需要竞争到偏向锁。

  • 线程2来竞争锁对象;
  • 判断当前对象头是否是偏向锁;
  • 判断拥有偏向锁的线程1是否还存在;
查看更多

zookeeper

  1. zookeeper 是什么?
    zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  2. zookeeper 都有哪些功能?

查看更多

kafka

  1. kafka 可以脱离 zookeeper 单独使用吗?为什么?
    kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。

  2. kafka 有几种数据保留的策略?
    kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留。

查看更多

高并发

项目中的限流怎么实现的?(Guava ratelimiter,令牌桶算法)
具体怎么实现的?(要点是固定速率且令牌数有限)
如果突然很多线程同时请求令牌,有什么问题?(导致很多请求积压,线程阻塞)
怎么解决呢?(可以把积压的请求放到消息队列,然后异步处理)
如果不用消息队列怎么解决?(说了RateLimiter预消费的策略)

微服务

分布式追踪的上下文是怎么存储和传递的?(ThreadLocal + spanId,当前节点的spanId作为下个节点的父spanId)

链路追踪的信息是怎么传递的?(RpcContext的attachment,说了Span的结构:parentSpanId + curSpanId)
SpanId怎么保证唯一性?(UUID,说了下内部的定制改动)

redis持久化

RDB:  redis 主进程只需要 fork 一个子进程,让子进程执行磁盘 IO 操作来进行 RDB 持久化

优点:
数据快照,适合做冷备
对性能影响小
回复快
缺点:
丢失少量数据
数据量过大,影响服务提供

AOF: AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
优点:
数据不丢失(1s fsync)
可读方式记录,适合恢复
缺点:
文件大
QPS相对低
发年bug,数据未恢复一致