- 博客(101)
- 收藏
- 关注
原创 JVM常见面试题
正常调用方法时,会不断地往Java虚拟机栈中存放新的栈帧,这样开销比较大,其实jvm虚拟机内部为了节省这样开销,可以把一些方法放到同一个 栈帧中执行。
2022-12-26 22:20:35
592
4
原创 jvm常见参数设置
设置新老年代晋升,最大值为15,并行收集器的默认值为15,CMS收集器的默认为6。超过多大的对象直接在老年代分配,避免在新生代的Eden和S区不断复制启用自适应生成大小调整。默认情况下启用此选项。当eden : s1 : s2 为8:1:1 时,这个参数启用后,实际上可能不是你设置的比例,会进行微调默认为8,也就是说Eden占新生代的8/10,From幸存区和To幸存区各占新生代的1/10设置用于并发GC的线程数。默认值取决于JVM可用的CPU数量。‐Xsssize。
2022-12-26 21:51:41
713
原创 JVM内存模型与垃圾回收
同时在不同的操作系统上安装对应版本的JDK,里面包含了各自屏蔽操作系统底层细节的JVM, 这样同一份class文件就能运行在不同的操作系统平台之上,得益于JVM。最终JVM需要把字节码指令转换为机器码,可以理解为是0101这样的机器语言,这样才能运行在不同的机器上,那么由字节码转变为机器码是谁来做的呢?除此之外,它还移除了编程语言之间的边界,并且支持通过即时编译技术,将混杂了不同的编程语言的 代码编译到同一段二进制码之中,从而实现不同语言之间的无缝切换。也可以作为静态编译器,实现AOT编译。...
2022-08-27 17:23:58
804
转载 Java synchronized偏向锁后hashcode存在哪里?
XX关闭延时。hashcode是懒加载,在调用hashCode方法后才会保存在对象头中。当对象头中没有hashcode时,对象头锁的状态是可偏向(biasable,101,且无线程id)。如果在同步代码块之前调用hashCode方法,则对象头中会有hashcode,且锁状态是不可偏向(001),这时候再执行同步代码块,锁直接是轻量级锁(thinlock,00)。如果是在同步代码块中执行hashcode,则锁是从偏向锁直接膨胀为重量级锁。Java技能树集合41328。...
2022-07-22 11:23:25
925
3
原创 MyBatis整合Spring原理分析
http://mybatis.org/spring/zh/index.html我们先来实现MyBatis和Spring的整合操作。1.2 配置文件我们将MyBatis整合到Spring中,那么原来在MyBatis的很多配置我们都可以在Spring的配置文件中 设置,我们可以给MyBatis的配置文件设置为空添加Spring的配置文件,并在该文件中实现和Spring的整合操作2.整合Spring的原理把MyBatis集成到Spring里面,是为了进一步简化MyBatis的使用,所以只是对MyBa
2022-07-14 16:27:13
831
原创 Mybatis插件的原理
我们创建的拦截器必须要实现Interceptor接口,Interceptor接口的定义为在MyBatis中Interceptor允许拦截的内容是1.2 配置拦截器创建好自定义的拦截器后,我们需要在全局配置文件中添加自定义插件的注册2.插件实现原理2.1初始化操作首先我们来看下在全局配置文件加载解析的时候做了什么操作。进入方法内部可以看到具体的解析操作该方法用来解析全局配置文件中的plugins标签,然后对应的创建Interceptor对象,并且封装对应的 属性信息。最后调用了Configu
2022-07-13 17:14:46
751
原创 MyBatis基础模块解析
基础支持层位于MyBatis整体架构的最底层,支撑着MyBatis的核心处理层,是整个框架的基石。基础支持层中封装了多个较为通用的、独立的模块。不仅仅为MyBatis提供基础支撑,也可以在合适的场景中直接复用。MyBatis在进行参数处理、结果集映射等操作时会使用到大量的反射操作,Java中的反射功能虽然强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射模块,该模块位于org.apache.ibatis.reflection包下,它对常见的反射操作做了进一
2022-07-13 15:40:44
392
原创 Mybatis的体系结构与核心工作原理分析
接下来我们就开始MyBatis的源码之旅,首先大家要从宏观上了解Mybatis的整体框架分为三层,分别是基础支持层、核心处理层、和接口层。如下图MyBatis的主要工作流程图首先接口层是我们打交道最多的。核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作接下来是核心处理层。既然叫核心处理层,也就是跟数据库操作相关的动作都是在这一层完成的。 核心处
2022-07-08 22:28:22
437
转载 浅谈tomcat线程池
正确的应用场景+合适的线程数量 = 快速运行速度Tomcat是目前比较流行的 Web 容器,接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度经典老题: 创建线程池时应该给多大的核心线程数,最大线程数?抛开场景谈线程数都是耍流氓,场景的话 一般分为IO密集型与CPU密集型,也就是线程的大部分时间将用来计算还是等待IO一个原则就是,如果IO密集型,线程大部分时间用来等待IO结果,例如查数据库这种操作,线程等待IO结果CPU是空闲可以处理其他事情的,这样场景鼓励多创建线程并发执行如果是CP
2022-07-05 19:17:25
479
原创 CompletableFuture 方法总结
纯消费类型的方法,指依赖上一个异步任务的结果作为当前函数的参数进行下一步计算,它的特点是不返回新的计算值,这类的方法都包含 Accept 这个关键字。在CompletionStage中包含9个Accept关键字的方法,这9个方法又可以分为三类:依赖单个CompletionStage任务完成,依赖两个CompletionStage任务都完成,依赖两个CompletionStage中的任何一个完成。例子thenAcceptBothAsync 拿到supplyAsync方法和completableFuture
2022-07-05 18:07:22
667
转载 简单解决redis cluster中从节点读取不了数据(error) MOVED
redis cluster集群中slave节点能成功复制master节点数据槽数据,但是无法get数据,显示只能到对应的master节点读取: (error) MOVED 742 36.112.201.233:6110 原因:Redis Cluster集群中的从节点,官方默认设置的是不分担读请求的、只作备份和故障转移用,当有请求读向从节点时,会被重定向对应的主节点来处理 解决办法:在get数据之前先使用命令readonly,这个readonly告诉 Redis Cluster 从节点客户端愿意读取可能过
2022-07-02 21:28:19
2546
原创 redis 集群模式原理
主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题。而且每个节点都保存了所有数据,一个是内存的占用率较高,另外就是如果进行数据恢复时,非常慢。而且数据量过大对数据IO操作的性能也会有影响。所以我们同样也有对Redis数据分片的需求,所谓分片就是把一份大数据拆分成多份小数据,在3.0之前,我们只能通过构建多个redis主从节点集群,把不同业务数据拆分到不冉的集群中,这种方式在业务层需要有大量的代码来完成数据分片、路由等工作,导致维护成本高、增加、移除节点比较繁琐。Redi
2022-07-02 21:26:41
2354
2
转载 redis集群中hash tag 使用
hash tag用于redis集群中。其实现方式为在key中加个{},例如test{1}。使用hash tag后客户端在计算key的crc16时,只计算{}中数据。如果没使用hash tag,客户端会对整个key进行crc16计算。下面演示下hash tag使用。将用户id为1的相关信息存储在6380实例127.0.0.1:6380> set user:info{1} 基本信息OK127.0.0.1:6380> set user:order{1} 2OK127.0.0.1:6380> ke
2022-07-02 16:57:19
1923
转载 Redis集群的重定向
本文主要来介绍redis集群的重定向问题。一、重定向产生的原因对于Redis的集群来说,因为集群节点不能代理(proxy)命令请求, 所以客户端应该在节点返回 或者 转向(redirection)错误时, 自行将命令请求转发至其他节点。使用时候的常用优化方法: 客户端可以将键和节点之间的映射信息保存起来, 可以有效地减少可能出现的转向次数, 籍此提升命令执行的效率。当节点需要让一个客户端长期地(permanently)将针对某个槽的命令请求发送至另一个节点时, 节点向客户端返回 转向。这个情况一般是,
2022-07-02 16:46:21
1255
转载 Redis集群(主从)脑裂及解决方案
redis 的集群脑裂是指因为网络问题,导致 redis master 节点跟 redis slave 节点和 sentinel 集群处于不同的网络分区,此时因为 sentinel 集群无法感知到 master 的存在,所以将 slave 节点提升为master 节点。此时存在两个不同的 master 节点,就像一个大脑分裂成了两个。 集群脑裂问题中,如果客户端还在基于原来的 master 节点继续写入数据,那么新的 master 节点将无法同步这些数据,当网络问题解决之后,sentinel 集群将原先的m
2022-07-02 15:14:51
2372
转载 一次生产环境redis内存占用居高不下问题排查
服务器在一次常规发布上线后,发现缓存过期速度远远小于配置的10min过期。现象:刚刚登录进系统后台,过了1分钟就发现缓存过期,登录不上后台,进到阿里云的redis服务器,发现登录的key没有了,期间还遇到各种诡异的问题,莫名其妙登录进系统但过一会儿掉线,后来进入阿里云后台发现redis内存占用高达100%。我就猜到可能是有线程在大量的写缓存,然后把redis空间给吃满了,由于redis服务器配置的是volatile-lru策略:当内存要满的时候,又有大量缓存写入的时候,就删除设置了过期时间的key中的最近最
2022-07-02 14:26:49
853
原创 redis主从中的Master自动选举之Sentinel哨兵机制
顾名思义,哨兵的作用就是监控Redis系统的运行状况,它的功能包括两个哨兵是一个独立的进程,使用哨兵后的架构如图所示,同时为了保证哨兵的高可用,我们会对Sentinel做集群部署,因此Sentinel不仅仅监控Redis所有的主从节点,Sentinel也会实现相互监控。在前面主从复制的基础上,增加三个sentinel节点,来实现对redis中master选举的功能。192.168.221.128(sentinel)192.168.221.129(sentinel)192.168.221.130(se
2022-07-02 14:24:36
3310
原创 redis主从模式
Redis作为一个高性能Nosq中间件,会有很多热点数据存放在Redis中,一旦Redis-server出现故障,会导致所有相关业务访问都出现问题。另外,即便是设计了数据库兜底的方案,大量请求对数据库的访问也很容易导致数据库出现瓶颈,造成更大的灾难。除此之外,Redis的集群部署还可以带来额外的收益:需要注意,Redis的主从复制,是直接在从节点发起就行,主节点不需要做任何事情通过启动命令来配置,也就是启动slave节点时执行如下命令启动redis-server之后,直接在客户端窗口执行下面命
2022-07-02 12:40:06
4526
原创 redis的持久化机制原理
Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种,也可以将这两种方式结合使用。RDB:根据指定的规则“定时”将内存中的数据存储在硬盘上,AOF:每次执行命令后将命令本身记录下来。RDB的持久化方式是通过快照(snapshotting)完成的,它是Redis默认的持久化方式,配置如下。Redis允许用户自定义快照条件,当符合快照条件时,Redis会自动执行快照操作。快照的条件可以由用户在配置文件中配置。配置格式
2022-06-30 22:50:24
1052
原创 redis淘汰策略
redis 默认的最大的内存设置为0,相当于基于物理机的最大值主要是4种算法,针对不同的key,形成的策略。算法:key :LRU是Least Recently Used的缩写,也就是表示最近很少使用,也可以理解成最久没有使用。也就是说当内存不够的时候,每次添加一条数据,都需要抛弃一条最久时间没有使用的旧数据。标准的LRU算法为了降低查找和删除元素的时间复杂度,一般采用Hash表和双向链表结合的数据结构,hash表可以赋予链表快速查找到某个key是否存在链表中,同时可以快速删除、添加节点,如图所示。
2022-06-24 16:18:36
22830
5
原创 redis数据结构分析
string 类型的数据结构 是SDS,是动态长度根据你存储的字符串长度,来决定使用那个sds类型存储结构quickli 内部默认定义的单个 ziplist 的大小为 8k 字节. 超过这个大小,就会重新分配一个 ziplist 了。这个长度可以由参数list-max-ziplist-size来控制。用户标签节点的层数是随机的......
2022-06-20 23:51:08
132
原创 12.ConcurrentHashMap源码分析
并发编程(1)-java中的6中线程状态并发编程(2)-怎么中断线程?并发编程(3)-synchronized的实现原理并发编程(4)-深入理解volatile关键字并发编程(5)-ReentrantLock源码分析并发编程(6)-Condition源码分析并发编程(7)-juc阻塞队列介绍并发编程(8)-什么是异步责任链并发编程(9)-Semaphore介绍和源码分析并发编程(10)-CyclicBarrier的使用及其源码分析并发编程(11)-forkJoin基本使用一、为什么要用
2022-05-17 16:00:45
616
转载 缓存一致性协议与伪共享问题
https://blog.csdn.net/weixin_53794227/article/details/124435514
2022-05-16 21:48:01
131
原创 11.forkJoin基本使用
并发编程(1)-java中的6中线程状态并发编程(2)-怎么中断线程?并发编程(3)-synchronized的实现原理并发编程(4)-深入理解volatile关键字并发编程(5)-ReentrantLock源码分析并发编程(6)-Condition源码分析并发编程(7)-juc阻塞队列介绍并发编程(8)-什么是异步责任链并发编程(9)-Semaphore介绍和源码分析并发编程(10)-CyclicBarrier的使用及其源码分析一 案例public class ForkJoinExa
2022-05-11 21:08:37
412
原创 10. CyclicBarrier的使用及其源码分析
一、 CyclicBarrier的使用public class CyclicBarrierDemo { static class RunTask implements Runnable { private CyclicBarrier cyclicBarrier; public RunTask(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier;
2022-04-24 19:01:30
241
原创 9.Semaphore介绍和源码分析
并发编程(1)-java中的6中线程状态并发编程(2)-怎么中断线程?并发编程(3)-synchronized的实现原理并发编程(4)-深入理解volatile关键字并发编程(5)-ReentrantLock源码分析并发编程(6)-Condition源码分析并发编程(7)-juc阻塞队列介绍并发编程(8)-什么是异步责任链一、Semaphore介绍和使用信号灯.限流器,限制资源的访问.本质上: 抢占一个令牌. -> 如果抢占到令牌,就通行, 否则,就阻塞!acquire() 抢占
2022-04-24 17:32:09
236
原创 8.什么是异步责任链?
并发编程(1)-java中的6中线程状态并发编程(2)-怎么中断线程?并发编程(3)-synchronized的实现原理并发编程(4)-深入理解volatile关键字并发编程(5)-ReentrantLock源码分析并发编程(6)-Condition源码分析并发编程(6)-7.juc阻塞队列介绍一、普通责任链@Datapublic class Request { private String name;}@Datapublic interface BaseHandle
2022-04-24 16:57:58
566
原创 7.juc阻塞队列介绍
并发编程学习目录并发编程(1)-java中的6中线程状态并发编程(2)-怎么中断线程?并发编程(3)-synchronized的实现原理并发编程(4)-深入理解volatile关键字并发编程(5)-ReentrantLock源码分析并发编程(6)-Condition源码分析什么叫阻塞队列?队列是一种只允许在一端进行删除操作,在另一端进行插入操作的线性表,允许插入的一端称为队尾、允许删除的一端称为队头。那么阻塞队列,实际上是在队列的基础上增加了两个操作。支持阻塞插入:队列满了的情况下,会阻塞
2022-04-22 23:01:59
338
原创 什么是中介者模式?
一、定义中介者模式又称调解着模式或调停着模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散。属于行为型模式。二、生活场景在我们生活当中如果你去租房子,没有中介的时候可能需要自己去找房源,房东和租客是一个网状结构。当我们有了中介以后,我们找房子可以直接找中介。三、例子在rpc(远程过程调用)出现之前,类与类之间是相互依赖的。导致服务之间不好管理,存在服务治理问题,后来引入注册中心(中介),服务与服务之间得以管理。伪代码public class R
2022-03-16 14:17:38
1095
原创 什么是备忘录模式?
一、定义备忘录模式又称快照模式,或者令牌模式。是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型模式。二、通用写法及其uml发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能备忘录角色(Memento):用于存储Originator的内部状态,可以防止Originator以外的对象访问备忘录管理员角色(Caretaker):负责存储。提供管理员备忘录,无法对备忘录内容进行操
2022-03-11 15:40:58
3005
7
原创 什么是命令模式?
一、命令模式的定义命令是对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方,命令模式属于行为型模式二、命令模式的uml图和通用写法uml通用写法/** * 功能:命令的抽象 */public interface ICommand { void execute();}/** * 功能:具体的命令 */public class ConcreteCommand implements ICommand{
2022-03-03 19:32:38
10108
原创 什么是迭代器模式?
一、定义迭代器模式又叫游标模式,它提供一种按顺序访问集合/容器的方法,无需报漏内部集合表示。属于行为型结构模式二、url图上图包括4个角色:抽象迭代器(Iterator):抽象迭代器负责定义访问和遍历元素的接口具体迭代器(MyListIterator):提供具体的元素遍历行为抽象容器(List):负责定义提供具体迭代器的接口具体容器(MyList):创建具体迭代器三、源码场景JDK当中就提供Iterator我们看具体的ArrayList 的实现具体的集合当中实现了自己的迭代器。
2022-02-28 22:33:04
1268
原创 商品下单未支付,如何取消订单?
一、业务场景当下完订单,一般超过15分钟或者30分钟就需要对未支付的订单进行关闭。二、解决方案1.定时任务通过定时任务隔一段时间扫描一次的数据,超过时间的订单,修改为取消状态public class OrderCloseTask { @Scheduled(cron = "0 0/15 * * * ?") public void closeOrder() { // .. 关闭订单 }}问题:时效性差定时任务每15分钟扫一次,如果14:59创建
2022-01-29 16:17:23
4236
转载 怎样理解阻塞非阻塞与同步异步的区别?
怎样理解阻塞非阻塞与同步异步的区别?阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句
2021-12-10 14:10:29
77
原创 什么是享元模式?
一、什么是享元模式?享元模式(Flyweight pattern)又叫轻量级模式,是对象池的一种标签。类似线程池,线程池可以避免不停的创建和销毁对象,消耗系能。享元模式可以减少对象数量,其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,属于结构型设计模式二、享元模式的写法极其uml图1.享元模式的uml图:主要的3个角色1.抽象享元角色(IFlyweight): 享元对象抽象基类或接口,同时定义出对象的外部状态和内部状态的接口或实现。2.具体享元角色(ConcreteFlyweight)
2021-03-28 23:07:30
3849
2
原创 6.并发类Condition源码分析
一、用ReentrantLock加condition完成生产消费者模型在前面学习 synchronized 的时候,有讲到 wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么这个时候我就在思考了,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面有没有提供类似的线程通信的工具呢? 于是找阿找,发现了一个Condition 工具类。Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线
2020-12-06 03:13:05
589
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人