面试总结
文章平均质量分 87
Java技术债务
坚决不留下一个技术债务,欢迎关注:Java技术债务!
展开
-
【面试系列】JDK动态代理和CGLIB静态代理
JDK动态代理代码实例Cglib 代理代码实例两者优缺点JDK动态代理只能代理接口实现类,原因是JDK动态代理是基于接口实现的,代理对象的类型由接口列表决定。如果你想代理一个类而不是一个接口,你需要使用其他的代理技术,比如CGLIB。原创 2023-07-21 16:32:19 · 339 阅读 · 0 评论 -
Java无法通过形参设置为null改变实参
Java中的对象是通过引用来传递的,这意味着当我们将一个对象作为参数传递给函数时,实际上是将该对象的引用传递给函数。如图所示,setNull函数仅仅解除了该函数体中的node变量与堆中的TreeNode object的绑定关系,并没有解除main函数中的node与TreeNode object的绑定关系。main函数中的node与setNull函数中的node是栈中两个不同的引用型变量,它们都指向了堆中同一个的TreeNode object。原创 2023-02-23 22:22:59 · 756 阅读 · 0 评论 -
Java是值传递还是引用传递?区别是什么?
在Java方法中参数列表有两种类型的参数,基本类型和引用类型。- **基本类型:**值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。- **引用数据类型:**指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)。原创 2023-02-22 23:26:37 · 661 阅读 · 0 评论 -
浅谈SQL中的union和union all
`MySQL UNION` 操作符用于连接两个以上的 `SELECT` 语句的结果组合到一个结果集合中。多个 `SELECT` 语句会删除重复的数据。`UNION` 操作符选取不同的值,如果允许得到重复的值,可以使用 `UNION ALL`union 和union all区别原创 2023-02-21 23:01:36 · 887 阅读 · 0 评论 -
JUC容器介绍
文章目录JUC结构1、tools(工具类)CountDownLatchCyclicBarrierSemaphoreCyclicBarrier 和 CountDownLatch 区别2、executorJava创建线程池的方式线程池的理解以及使用3、atomic4、Lock锁(重点)什么是Synchronized?Synchronized和lock5、集合类不安全JUC结构tools(工具类):又叫信号量三组工具类,包含有CountDownLatch(倒计数) 是一个同步辅助类,在完成一组正在其原创 2022-03-10 10:46:13 · 411 阅读 · 0 评论 -
Java创建线程池的方式
文章目录一、创建线程池的方式一般有两种:二、通过Executors工厂创建1. Executors.newSingleThreadExecutor()2. Executors.newFixedThreadPool(n)3. Executors.newCachedThreadPool()4. Executors.newScheduledThreadPool(n)三、通过new ThreadPoolExecutor(coreThreadSize, max... ...)一、创建线程池的方式一般有两种:通.原创 2022-03-09 10:42:43 · 1844 阅读 · 0 评论 -
几种常见的注册中心以及区别
文章目录服务注册服务发现心跳机制常见的注册中心consulclientserverserver-leaderraft服务发现协议服务注册服务发现eurekaEureka ClientEureka Server自我保护机制Eureka 集群原理Eurka 保证 APEurka 工作流程zookeeper服务注册为什么是临时节点?服务发现监听机制zookeeper功能zookeeper的存储结构zookeeper选举机制zookeeper应用场景**优点**nacos概念关键特性CAPconsul和eurek.原创 2022-03-06 22:14:00 · 6054 阅读 · 2 评论 -
JVM如何判断对象无用
文章目录1、引用计数为0(已经不用了)2、可达性分析算法GC Roots枚举根节点安全点-Safepoint安全区域-Safe Region1、引用计数为0(已经不用了)给对象添加一个引用计数器,有其他地方引用时这个计数器+1,引用失效时-1,为0时就可以删除掉了。但是它不能解决循环引用的问题2、可达性分析算法不可达的对象将暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一.原创 2022-03-03 22:38:24 · 973 阅读 · 0 评论 -
MySQL锁机制和锁算法
文章目录MyISAM和InnoDB存储引擎锁区别InnoDB锁机制InnoDB 表级锁的锁模式InnoDB 行锁模式及加锁方法InnoDB 行锁实现方式乐观锁和悲观锁悲观锁乐观锁间隙锁(Next-Key 锁)恢复和复制的需要,对InnoDB 锁机制的影响什么时候使用表锁关于死锁InnoDB锁的特性InnoDB锁算法MyISAM和InnoDB存储引擎锁区别MyISAM采⽤表级锁(table-level locking)。InnoDB⽀持⾏级锁(row-level locking)和表级锁,默认为⾏级锁.原创 2022-03-01 22:52:40 · 454 阅读 · 0 评论 -
Kafka存储结构和原理
文章目录1. kafka存储结构1.1 topic1.2 partition1.3 segment1.4 message结构1.5 查找 message过程2 Kafka存储原理2.1 顺序写2.2 零拷贝2.3 缓存机制3 Kafka维护消费偏移3.1 消费偏移的更新方式3.1.1 自动提交(默认方式)3.1.2 手动提交4 日志的清除策略以及压缩策略4.1 日志删除4.2 日志压缩策略1. kafka存储结构kafka 使用日志文件的方式来保存生产者和发送者的消息,每条消息都有一个 offset .原创 2022-02-27 21:19:47 · 1607 阅读 · 0 评论 -
Netty线程模型
Netty线程模型所有的技术架构都不是凭空捏造出来的,都是一步一步优化,升级出来的。首先先看一下单Reactor单线程模型单Reactor单线程模型所有IO操作均由一个线程完成,即多路复用、事件分发和处理都在一个Reactor线程上完成的。既要接收客户端的请求,向服务器发起链接,又要发送读取请求或应答响应消息。一个NIO线程同时处理成千上万的链路,性能无法支撑,速度慢,若线程进入死循环,整个程序不可用,对于高负载、大并发的应用场景不合适。1)Reactor 通过 select 监听客户端请求事件原创 2022-02-18 10:42:29 · 1127 阅读 · 0 评论 -
MySQL主从同步原理
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。原理:数据库有个bin-log二进制文件,记录了所有sql语句。我们的目标就是把主数据库的bin-log文件的sql语句复制过来。让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。具体需要三个线程来操作:4.1 binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创.原创 2022-02-14 22:47:43 · 3888 阅读 · 1 评论 -
Spring Boot自动配置原理
文章目录@SpringBootApplication@EnableAutoConfiguration@AutoConfigurationPackage@Import总结@SpringBootApplication@SpringBootApplication注解由@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration三个注解组成@SpringBootConfiguration:我们点进去以后可以发现底层是Configura.原创 2022-02-13 22:44:54 · 1172 阅读 · 0 评论 -
JVM垃圾回收算法以及垃圾回收器机制
文章目录JVM垃圾回收算法以及垃圾回收器概述判断对象是否存活垃圾回收算法标记-清除算法复制算法标记整理算法分代收集算法垃圾收集器Serial收集器ParNew收集器Parallel Scavenge收集器Parallel Old 收集器CMS 收集器G1 收集器常见的垃圾回收器组合JVM中几种GC类型JVM默认垃圾回收器JVM垃圾回收算法以及垃圾回收器概述JVM中,程序计数器、虚拟机栈、本地方法栈都是都是线程私有的,随线程而生随线程而灭,栈帧(栈中的对象)随着方法的进入和退出做入栈和出栈操作,实现了.原创 2022-02-09 19:51:01 · 1245 阅读 · 0 评论 -
Spring bean的生命周期
对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。bean的声明bean的声明有好几种,如上图。上图声明的一些bean信息可以通过ClassPathXmlApplicationContext(bean.xml)进行加载解析配置信息源码:// Tell the subclass to refresh the internal bean factory.//告诉子类刷新内部bean工厂,加原创 2022-02-02 23:56:05 · 1690 阅读 · 0 评论 -
面试之Spring的启动原理
引入为什么突然说一下Spring启动原理呢,因为之前面试的时候,回答的那可谓是坑坑洼洼,前前后后,补补贴贴。。。总而言之就是不行,再次看一下源码发掘一下。。。在Spring Boot还没有广泛到家家在用的时候,我们都还在书写繁琐的配置,什么web.xml、spring.xml、bean.xml等等。虽然现在很少,可以说几乎没有企业在去使用Spring的老一套,而会去使用Spring Boot约定大于配置来进行快速开发,但是,Spring的也要去学习,去挖掘,毕竟是我们Java程序员的基础呀。spri原创 2022-01-28 16:35:07 · 3624 阅读 · 0 评论 -
JVM之配置介绍(一)
文章目录基础配置内存溢出配置回收器选择响应时间优先的并发收集器垃圾回收统计信息更多文章和干货请移驾公众号查看获取基础配置Xms2048mJVM启动时申请的最小内存,默认为系统物理内存的1/64,但是小于1GXmx2048mJVM启动时申请的最大内存,默认为系统物理内存的1/4,但是小于1G;默认当空余堆内存小于40%时,JVM会增大heap到-Xmx指定的大小;可通过XX:MinHeapFreeRation改变比例;当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-原创 2022-01-21 20:12:02 · 1332 阅读 · 0 评论 -
OOM排查和处理
1、OOM异常:java.lang.OutOfMemoryError: Java heap spaceXms10m代表堆初始化大小为10m;Xmx10m代表堆最大为10M;XX:+PrintGCDetails代表打印日志Xms等于-XX:InitialHeapSize;-Xmx 等同于-XX:MaxHeapSize;而-Xss等同于-XX:ThreadStackSize;如果不配垃圾回收器,系统默认使用parallel scavenger和parallel old作为老年代垃圾回收器,堆原创 2022-01-20 13:36:38 · 2331 阅读 · 0 评论 -
JVM常用监控工具解释以及使用
文章目录jps进程状况工具jstat统计信息监控工具jmap堆内存使用状况jstack线程堆栈信息更多文章和干货请关注公众号jps进程状况工具jps:JVM Process Status Tooljps [options] [hostId]jps工具的主要选项optionsjstat统计信息监控工具jstat:JVM Statistics Monitoring Tool可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾手机、即时编译等运行时数据。jstat [options vmid原创 2022-01-20 13:27:14 · 2061 阅读 · 0 评论 -
JVM内存泄漏和内存溢出的原因
文章目录1 概念2 分析内存溢出可能出现的地方Java栈Metaspace堆2 分析内存泄漏的原因1、静态集合类:容器使用时引起的内存泄漏2、各种连接时:未正确使用close()方法导致的内存泄漏3、外部模块的引用4、单例模式更多文章和干活请关注公众号1 概念内存泄漏:分配出去的内存没有被回收回来,失去对内存区域的控制,造成资源的浪费,比如:new出来了对象并没有引用,垃圾回收器不会回收他,造成内存泄漏内存溢出:程序所需要的内存超出了系统所能分配的内存。2 分析内存溢出可能出现的地方从 J原创 2022-01-20 13:02:48 · 2890 阅读 · 0 评论 -
Spring循环依赖产生原因以及解决的原理
文章目录什么是循环依赖?产生原因Spring的解决办法循环依赖解决的过程源码剖析更多文章和干货请关注公众号之前简单讲过Spring循环依赖的解决办法,但是没有深入源码分析,今天源码相关分析来了。什么是循环依赖?循环依赖问题就是A->B->A,spring在创建A的时候,发现需要依赖B,因为去创建B实例,发现B又依赖于A,又去创建A,因为形成一个闭环,无法停止下来就可能会导致cpu计算飙升public class A { private B b;}public class B {原创 2022-01-18 20:36:02 · 1356 阅读 · 0 评论 -
Java常用集合List、Map、Set介绍以及一些面试问题
文章目录集合框架图常用接口介绍以及区别常用接口类介绍ArrayListLinkedListHashMapTreeMapLinkedHashMapHashSetTreeSet其他问题更多文章和干货请移驾公众号和个人网站集合框架图集合和数组的区别:数组是固定长度的;集合可变长度的。数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。常用接口介绍以及区别List(有序、可重复)List里存放的对象原创 2022-01-17 23:01:59 · 793 阅读 · 1 评论 -
面试之Spring AOP和IOC
AOP:面向切面编程概念AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。为什么需要 AOP想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。在传统的面向过程编程中,我们也会将这段代码,抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们原创 2022-01-16 22:07:16 · 2520 阅读 · 0 评论 -
Redis 常见面试题
Redis 常见面试题文章目录概述什么是RedisRedis有哪些优缺点优点缺点为什么要用 Redis /为什么要用缓存为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快数据类型Redis有哪些数据类型Redis的应用场景优势持久化什么是Redis持久化?Redis 的持久化机制是什么?各自的优缺点?RDBAOF优缺点是什么?如何选择合适的持久化方式Redis持久化数据和缓存怎么做扩容?过期键的删除策略Redis的过期键的删除策略Redis key的过期时间和永久有效分别怎原创 2022-01-12 20:52:29 · 155 阅读 · 0 评论 -
Spring Boot多线程环境下,解决多个定时任务冲突问题
问题引入关于定时任务注解@Scheduled在之前的文章已经讲到,Spring Boot定时器默认的是单线程的。但是问题就来了,如果在线程争夺资源后,某个线程需要比较长时间才能执行完,那其他的定时器怎么办,都只能进入等待状态,时间越久,累计等待的定时器越多,这就容易引起雪崩…场景重现我们清晰的看到执行结果都是scheduling-1。如果在线程争夺资源后,某个线程需要比较长时间才能执行完,那其他的定时器怎么办,都只能进入等待状态,时间越久,累计等待的定时器越多,这就容易引起雪崩…其实只需要添原创 2022-01-11 23:18:19 · 1950 阅读 · 0 评论 -
redis主从复制
文章目录概念Redis 的复制分为全量同步和增量同步。Redis主从同步策略主从复制的特点主从复制的实现更多文章和干货请移驾公众号和个人网站概念主从复制:Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。通过数据复制,Redis 的一个 master 可以挂载多个 slave,而 slave 下还可以挂载多个 sla原创 2022-01-10 19:32:08 · 1376 阅读 · 0 评论 -
redis内存的淘汰机制
引入Redis是基于内存存储,常用于数据的缓存,所以Redis提供了对键的过期时间的设置,实现了几种淘汰机制便于适应各种场景。设置过期时间我们可以在设置键时设置expire time,也可以在运行时给存在的键设置剩余的生存时间,不设置则默认为-1,设置为-1时表示永久存储。清除过期Key的机制定期删除和惰性删除定期删除:默认每隔100ms随机抽取设置过期的key,检查是否过期。保证性能。缺点:会有很多过期key到时间没有被删除。惰性删除:定期删除没有被删除,主动去系统查询key才会被删除原创 2022-01-06 22:48:50 · 1385 阅读 · 0 评论 -
redis缓存如何保证数据一致性
问题的引入同时有请求A和请求B进行更新操作,那么会出现(1)线程A更新了数据库(2)线程B更新了数据库(3)线程B更新了缓存(4)线程A更新了缓存如果访问数据库后,不更新缓存,直接删除缓存,由下一个请求去缓存那么会出现如下情况:(1)如果你是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致,数据压根还没读到,缓存就被频繁的更新,浪费性能。(2)如果你写入数据库的值,并不是直接写入缓存的,而是要经过一系列复杂的计算再写入缓存。那么,每次写入数据库后,都再次计算写入缓原创 2022-01-05 21:48:31 · 1151 阅读 · 0 评论 -
redis的缓存穿透、缓存雪崩、缓存击穿怎么搞?
文章目录1 概念2 解决办法3 更多文章和干货请移驾公众号和个人网站1 概念缓存穿透: 大量请求的key根本不存在于缓存中,请求直接落在了数据库上,没有经过缓存。缓存雪崩:同一时间内缓存大面积的失效,后面的所有请求会全部落在数据库上,造成数据库短时间内承受大量的请求而崩掉。缓存击穿:就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。2 解决办法缓存穿透参数校验缓存原创 2022-01-05 21:24:43 · 1098 阅读 · 0 评论 -
redis线程模型
1、线程模型redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型。它采用IO多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。2、每秒万级别处理能力的原因(1)纯内存访问。数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。(2)非阻塞I/O多路复用,Redis采用epoll做为I/原创 2022-01-04 22:41:11 · 1412 阅读 · 0 评论 -
Redis的常用数据结构和底层实现方式
文章目录Stringlisthashsetzset更多文章和干货请看公众号以及博客String存储方式key-value,可支持数字,性能高,用处微博数,粉丝数基本命令set key valueget keygetrange key start end #返回key中字符串值的从start到end的字符mget key1 key2 key3… #获取一个或多个key的值setex key seconds value #将值关联到key并且设置key的过期时间(以秒为单位)setnx原创 2022-01-03 22:33:08 · 1297 阅读 · 0 评论 -
MySQL执行sql语句的机制
文章目录1 概念执行过程我的公众号1 概念连接器: 身份认证和权限相关(登录 MySQL 的时候)。查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等。做完这些操作后,原创 2022-01-02 22:56:55 · 1000 阅读 · 0 评论 -
欢迎光临我的公众号和我的博客
公众号内有更多的文章和干货,你还可以联系博主索取博主的诸多收藏你还可以保存博主的个人博客网站,可以第一时间获取更多的文章和干货博客地址:https://www.cuizb.top原创 2021-12-31 11:48:18 · 1195 阅读 · 0 评论 -
MySQL中的MVVC多版本并发控制机制
文章目录引入MySQL中MVCC的运用快照读和当前读更多文章和干货引入MVCC全称是:Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,与Postgres在数据行上实现多版本不同,原创 2021-12-31 09:17:51 · 1438 阅读 · 0 评论 -
Spring中Bean的循环依赖怎么办?
什么是循环依赖?循环依赖问题就是A->B->A,spring在创建A的时候,发现需要依赖B,因为去创建B实例,发现B又依赖于A,又去创建A,因为形成一个闭环,无法停止下来就可能会导致cpu计算飙升Spring的解决办法spring解决这个问题主要靠巧妙的三层缓存,所谓的缓存主要是指这三个mapsingletonObjects主要存放的是单例对象,属于第一级缓存;earlySingletonObjects属于第二级缓存,作用是防止重复创建代理获取提前引用,并且防止循环依赖;原创 2021-12-27 22:36:13 · 898 阅读 · 0 评论 -
BeanFacroty和FactoryBean到底是什么?AppliacationContext它又是什么?
文章目录引入概念BeanFactory和FactoryBean区别:BeanFactory和ApplicationContext的区别:更多文章和干货请关注公众号引入概念BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式AppliacationContext 是在 BeanFacto原创 2021-12-27 22:25:37 · 934 阅读 · 0 评论 -
ConcurrentHashMap的原理分析
JDK1.7:底层数据结构:数组(sgement)、数组(HashEntry)、链表(HashEntry节点)两个主要的内部类:class Segment内部类,继承ReentrantLock,有一个HashEntry数组,用来存储链表头结点class HashEntry 定义的节点,里面存储的数据和下一个节点主要方法:get()方法:1、第一次哈希 找到 对应的Segment段,调用Segment中的get方法2、再次哈希找到对应的链表,3、最后在链表中查找。put()方法:1、首原创 2021-12-02 00:03:33 · 890 阅读 · 0 评论