- 博客(52)
- 收藏
- 关注
原创 垃圾回收器之 G1 CMS ZGC
将堆内存分为多个大小相等的区域(Region),每个区域都可以是 Eden 区、Survivor 区或者 Old 区。筛选回收:对各个Region的回收价值和成本进行排序,根据所期望的停顿时间制定回收计划。1可预测停顿:使用者可以定义STW的时间不能超过N毫秒。1支持TB级别的内存,可以达到10ms以内的停顿时间。(标记GC Roots直接关联到的对象,STW),(标记整个引用链,无STW会产生漏标和多标),初始标记,并发标记,最终标记同CMS;(STW,解决漏标和多标),JDK11引入的垃圾收集器。
2024-07-23 16:50:25
134
原创 sql优化
1不走select *:会增加解析器解析的成本。查询不需要的字段也会造成资源的浪费。不走索引覆盖也会产生回表。4批量操作:循环逐条操作需要多次请求数据库。批量操作只需要请求一次数据库。(建议500以内一次批量)3提升group by的效率:如果使用group by的列没有使用索引,那么查询就会变慢。6join的表不宜过多:维度难度加大(如果需要分库,那到时候sql也需要改)5使用limit:一次查询的数据过多,使用limit进行分页。2小表驱动大表:可以更好的使用索引和条件对数据进行筛选。
2024-07-22 23:35:33
153
原创 双亲委派机制
1传入类的限定名,首先判断应用类加载器是否加载过,有则返回;7否,返回ClassNotFoundException。4否,向下委派,启动类是否可以加载,是就加载;2否,判断扩展类加载器是否加载过,有则返回;3否,判断启动类加载器是否加载过,有则返回;5否,扩展类是否可以加载,是就加载;6否,应用类是否可以加载,是就加载;双亲委派机制是一种类加载机制。
2024-07-21 21:58:55
56
原创 redis为什么快
3io多路复用:目的是允许单线程同时监控多个文件描述符(网络连接)4高效的数据结构:支持在高效的时间复杂度下进行插入删除查找操作。2redis的读写模块是单线程的,避免的多线程竞争和锁开销。1redis是基于内存的。
2024-07-20 00:29:41
61
原创 synchronized锁升级过程
获取锁,但没有线程对象上并发获取锁,偏向锁升级为轻量级锁,线程采用CAS自旋方式获取锁,避免阻塞线程造成cpu在用户态和核心态来回切换造成的开销。jdk1.6之前使用synchronized使用重量级锁。jdk1.6之后为了保证线程安全的基础上提高效率,采用偏向锁->轻量级锁->重量级锁。:会在锁对象的对象头上记录当前获取该锁的线程id,该线程下次获取该锁就可以直接获取。的获取锁,轻量级锁升级为重量级锁,避免无用的自旋消耗cpu。:当2个及以上的线程。
2024-07-08 12:15:13
144
原创 Redis 如何解决集群情况下分布式锁的可靠性?
如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。节点的分布式锁,基本思路为:让客户端和多个独立的 Redis 节点依次请求申请加锁,如果客户端能够和。成功地完成加锁操作,就认为,客户端成功地获得分布式锁,否则加锁失败。:加锁成功要同时满足两个条件:如果有。的获取到了锁,并且总耗时。
2024-06-27 14:31:37
226
1
原创 ThreadLocal的原理
ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,而 value 是强引用。,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。2ThreadLocal底层是通过ThreadLocalMap实现的,每个Thread对象中存在一个ThreadLocalMap,Map的。当一个共享变量是共享的,但是需要每个线程互不影响,相互隔离,就可以使用ThreadLocal。
2024-06-22 20:34:53
488
原创 自动装箱和自动拆箱
在 Java 5 中,在 Integer 的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了。Integer i = 10 等价于 Integer i = Integer.valueOf(10)int n = i 等价于 int n = i.intValue();装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型;
2024-06-22 13:52:58
207
原创 equals和==的区别?
equals()方法:一般是比较2个对象的属性,如果属性相等返回true。equals()方法:等价于==比较2个对象。对于基本数据类型和引用数据类型作用效果不同。对于基本数据类型,比较的是。对于引用数据类型,比较的是。
2024-06-22 13:41:33
117
原创 类加载过程
参考:B站《【JVM】Java类加载机制这块算是玩明白了》java类的生命周期加载:读取class文件,转化为某种静态数据结构存储在方法区中,并在堆中生成一个便于用户调用java.lang.Class类型的对象的过程验证:对静态结构进行语法语义上的分析,确保不会产生危害虚拟机的行为准备:为类变量分配内存和并初始化类变量值解析:把符号引用替换为直接引用。符号引用是一组用来描述引用对象的一组符号直接引用:内存中的地址。A调用的B是一个具体的类那么就是静态解析;如果B是一个抽象类或接口,
2024-05-26 18:56:12
265
原创 事务的隔离性
脏读:读到另一个未提交事务的数据。不可重复读:前后二次读到的数据不一致,后一次读到已提交事务的数据。幻读:前后二次读到的记录数不一致,后一次读到已提交事务的修改结果。SQL标准提出四种隔离级别来处理上述情况,隔离级别越高,性能就越低。读未提交:一个事务未提交时,它的变更可以被其他事务看到。读提交:一个事务提交之后,它的变更才能被其他事务看到。可重复读:一个事务内,前后二次的查询的数据是一致的。MySQL InnoDB引擎默认隔离级别。串行化:给记录加锁。
2024-04-10 17:44:41
354
原创 二分查找详解
使用二分查找思路:所给nums数组升序排列,找到正数的的位置可以转换为找到≥1的位置;找到负数的位置可以理解为<0的位置。一次遍历数组的方法的时间复杂度为O(n),而二分查找的时间复杂度为O(logn)。以力扣2529为例,题目要求找到正整数的个数和负整数的个数。>x可以转换为≥ (x+1)≤ x可以转换为(>x)-1。这里给出通用的二分查找:在。<x可以转换为(≥x)-1。
2024-04-09 16:14:01
231
原创 什么是缓存雪崩、击穿、穿透?
第二种用户体验较好,业务线程发现缓存失效,通过消息队列发送信息通知后台线程更新缓存,后台线程收到消息后,先判断缓存是否存着,不存在立刻读取数据库更新缓存。业务线程发现请求的数据不在redis中,就加个互斥锁,保证同一时间只有一个请求构建缓存,缓存构建完成后释放锁。大量恶意请求访问不存在的数据的时候,在API入口处判断请求参数是否合理(非法值,请求字段是否存在),判断恶意直接返回错误,避免进一步访问缓存和数据库。缓存中的热点数据(被频繁访问的数据)过期了,大量请求直接访问数据库,数据库被高并发的请求冲垮。
2024-03-19 16:20:58
325
原创 Object类方法
默认情况下,这个方法比较的是两个对象的引用是否相同,但是通常会在子类中重写这个方法以实现自定义的相等性比较。要实现clone()方法,类必须实现Cloneable接口,并且重写clone()方法。finalize(): 在对象被垃圾回收之前调用,可以重写此方法来执行资源释放等清理工作。notify(), notifyAll(), wait(): 这些方法用于线程同步和通信。hashCode(): 返回对象的哈希码。getClass(): 返回对象的运行时类。getClass(): 返回对象的运行时类。
2024-03-03 18:18:21
238
1
原创 COW写时复制
其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。redis持久化:RDB(一种基于快照的持久化方式)。
2024-01-30 19:39:35
169
原创 redis持久化机制
RDB(Redis DataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔内,如果满足一定条件(如某段时间内发生的写操作次数),Redis会生成一个包含当前内存数据的RDB文件。RDB持久化提供了较高的数据压缩率和快速的数据加载速度,但可能存在一定程度的数据丢失。AOF(Append Only File)持久化是一种基于日志的持久化方式。当Redis重新启动时,可以通过重放AOF文件中的命令来恢复数据。Redis提供了2种不同形式的持久化方式:RDB和AOF。
2024-01-30 19:20:31
151
原创 JVM,JRE,JDK的区别和联系简洁版
先看图利用JDK(调用JAVA API)开发JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
2024-01-09 19:50:34
836
原创 mysql索引覆盖
索引覆盖:一种查询优化技术,在查询过程中到数据页来获取查询结果。简单来说,当一个查询需要返回的数据列都包含在一个或多个索引(联合索引)中时,就可以利用索引覆盖来避免额外的磁盘读取操作。从而提高查询性能。第一条查询语句需要进行回表查询。通过辅助键查询找到对应的主键,再通过主键找到对应的数据行。第二条查询语句通过索引覆盖,不需要进行回表查询,提高查询性能。
2024-01-03 14:27:42
401
原创 mysql聚簇索引和非聚簇索引
聚簇索引和非聚簇索引的区别:叶节点是否存放一整行记录。:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置。InnoDB主键使用的是聚簇索引,MylSAM不管是主键索引,还是二级索引(辅助键索引)都使用的都是非聚簇索引。
2024-01-02 19:07:54
452
原创 简单了解ElasticSearch(ES)
ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTfu风格的WEB接口,官方客户端也对多种语言都提供了相应的API。补充1、Lucene:Lucene本身就是一个搜索引擎的底层。ES封装了Lucene。(Lucene功能不全,用户使用体验不佳)2、分布式:ES主要是为了突出他的横向扩展能力。(ES集群扩展只需要修改几个配置文件,方便)
2023-12-27 16:03:22
558
原创 java中.size()、.length和.length()的区别
length():求字符串String的长度。.size():求集合的长度。.length:求数组的长度。共同点:均是求长度的方法。
2023-12-26 11:07:41
483
原创 zookeeper简介及优缺点
参考:B战《黑马程序员Zookeeper视频教程,快速入门zookeeper技术》B站《为什么微服务与高并发程序都在放弃 Zookeeper》
2023-12-24 12:49:55
491
原创 transient关键字
1序列化前成员变量:username=“zhangsan”;password=“123456”2反序列化之后:username=“zhangsan”;:修饰类的成员变量,表示不参与序列化。transient修饰password。
2023-12-23 15:23:20
397
原创 主从复制和读写分离
1、二进制日志:记录所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句的日志。:将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上重新执行这些日志,使得从库和主库的数据保持同步。:把对数据库的读写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,有效减轻单台数据库的压力。:数据库的“写”(写1w条数据可能要几分钟)操作比较耗时,而数据库的“读”(读1w条数据可能只要几秒钟)
2023-12-21 14:57:43
406
原创 Cookie、Session、Token的区别
2服务器生成JWT,服务器不需要保存JWT,只保存密钥。浏览器以Cookie或Storage的形式存储。2服务器验证通过后会产生session,一般保存在redis中,把sessionID和存活时间放到cookie中传给浏览器。Cookie:一种数据载体,把Session放在cookie中送到客户端,Cookie跟随Http的每个请求发送出去。3浏览器会保存这些信息,之后每次访问服务器都会携带cookie。3浏览器之后访问服务器都会携带JWT,而不需要账号密码。Token:产生在服务器,
2023-12-20 15:51:35
354
原创 @Configuration、@Component和@Service注解之间的区别
@Component注解的特殊化版本,用于标记一个类,该类充当Spring应用程序上下文中的服务;:标记一个类,该类充当Spring应用程序上下文中的组件;包括控制器、拦截器、过滤器等。,包含@Bean注解用于定义Spring容器中的bean。:用于定义Spring应用程序上下文的。
2023-12-19 16:18:17
414
1
原创 使用防重Token的接口幂等性校验
使用防重token的好处:可扩展性好:使用注解,对于有注解标记的接口拦截器才会起作用。工作过程:1进入下单界面,前端会自动发请求,后端产生token返回前端,并将token存于redis中2用户点击“下单”,由于网络原因,点击多次发送多次请求3拦截器会拦截所有请求,只有成功删除redis中token的请求,才能进入“下单接口”,在数据库中创建订单。
2023-12-18 16:51:15
479
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人