- 博客(26)
- 收藏
- 关注
原创 Go的内存逃逸场景是什么?
而Go则不同,不论基础类型还是引用类型,都会直接使用内存逃逸去分析,如果逃逸到堆上,则在堆中分配,否则在栈上分配即可,栈上分配的,会随着当前go协程的生命周期分配和销毁,堆上的则需要依靠内部GC去回收。Go也有栈和堆,但是他的分配与Java的分配不同,Java的基础类型会在栈上分配,引用类型在堆上分配,然后再基于Java自己的一些逃逸分析去做优化。的指针可能被其他 Goroutine 使用,需分配在堆上。栈空间有限,大对象(如大数组)可能直接分配在堆上。通过逃逸分析优化,可减少不必要的堆分配。
2025-09-07 16:37:31
459
原创 MySQL独占间隙锁为什么会互相兼容?
这也是为什么小林大佬的这幅图中会出现死锁的现象,原因就是独占间隙锁是可以多事务持有的(猜测是为了更好的并发性能吧),但是插入意向锁对应间隙的间隙锁又不能被其他事务持有,这才导致了死锁发生(互相等待释放间隙锁)如果A事务想要插入一条数据,这个间隙的独占间隙锁被当前自己这个事务持有了,那插入就不会被阻塞(别人持有间隙锁就阻塞,自己持有间隙锁或者没有间隙锁,那插入就不会阻塞)因此,独占间隙锁和共享间隙锁,其他从功能来看都是一样的,都是加了间隙锁,而防止插入操作的发生,从而避免了幻读。,而是排斥其他事务的 。
2025-08-30 17:23:46
417
原创 背了这么多次,终于弄懂CMS和G1垃圾回收器了!!!!
JVM的垃圾回收机制能自动管理内存,释放不再使用的对象占用的空间。根据回收区域和策略的不同,Java垃圾回收主要分为MinorGC、MixedGC、MajorGC和FullGC几种类型。
2025-08-22 16:28:51
532
原创 JVM内存区域详解
支持 JNI(Java Native Interface)调用的本地方法(如 C/C++ 代码)执行。用于 NIO 高性能 IO 操作(如文件、网络缓冲区),避免堆内外数据拷贝。:包括线程栈、元空间等,由操作系统管理,JVM 仅通过系统调用申请。存储方法调用的栈帧(局部变量表、操作数栈、动态链接、方法出口)。存储类元数据(类名、方法、字段)、运行时常量池、静态变量。方法执行时入栈,结束后出栈,自动释放内存。线程共享,是垃圾回收(GC)的主要区域。:堆内存中的永久代(PermGen)。
2025-08-21 12:09:56
323
原创 StampedLock为什么被称为锁王?它与 ReentrantReadWriteLock 的核心区别是什么?
:虽然StampedLock 在读多写少的场景下性能会更好一些,但是StampedLock 的复杂 API(如戳记管理)和不可重入性可能增加编程风险,需谨慎使用。:读锁与写锁严格互斥,保证强一致性,但可能引发写线程饥饿(如大量读线程阻塞写锁)。:乐观读模式在读多写少场景下性能接近无锁(如缓存系统),减少线程阻塞。:写锁(独占)、悲观读锁(共享)、乐观读锁(无锁化读取)。:支持写锁降级为读锁,但不支持读锁升级为写锁。:支持读锁与写锁的相互转换(如。:读锁(共享)、写锁(独占)。
2025-08-20 21:16:44
245
原创 Java 锁升级的四个阶段及过程详解
Java 中的锁升级机制(从 JDK 1.6 引入)通过动态调整锁状态来优化多线程性能,根据竞争强度逐步从低开销锁升级到高开销锁。同一线程再次访问时,直接比对线程 ID,无需同步操作(无 CAS 开销)。:偏向锁竞争失败或撤销次数超过阈值(默认 20 次)。:减少线程阻塞(用户态自旋),适合短时间低竞争场景。若原线程已退出同步块 → 撤销偏向锁,降为无锁状态。:第一个线程访问同步代码块时,升级为偏向锁。:对象初始化时默认状态,无任何线程持有锁。:锁首次被单个线程访问(无竞争)。
2025-08-20 19:05:30
324
原创 ReentrantLock的CLH队列是一条双向链表,如何实现非公平性?
这是一条双向链表,ReentrantLock没抢到锁的时候,会追加到这条队列中,挂起等待锁的释放。里面是一个个节点节点(Node):每个节点代表一个正在等待获取同步状态的线程。每个节点包含了一些关键信息,如前驱节点(prev)、后继节点(next)、当前线程(thread)以及节点的状态(waitStatusFIFO队列:AQS使用的是一个双向链表结构的队列,新加入的线程总是被添加到队列的尾部,确保了先进先出(FIFO)的顺序。节点的状态字段waitStatus。
2025-08-19 21:33:32
432
原创 Java中,重写equals()不重写hashcode()在HashMap为什么会出错?
Java 1.8 的HashMap中,如果重写了equals()方法但未重写hashCode()
2025-08-18 14:47:20
188
原创 罗盘自营商城
罗盘自营商城是共创罗盘中的单独开辟的一个小货盘平台,可以支持让自己仓库有商品的人把货上传到罗盘自营商城中,无缝对接共创罗盘300+店铺的采集上架到Temu销售端售卖的过程。5. 出单之后,用户可以填写下单信息,此时供应商端会有[我的订单]查看用户填写的单,并按照实际需求发货。3. 填写完毕之后,即可在本供应商端、用户端展示(供应商端仅展示当前供应商的商品)4.用户端查看的商品可以支持采集上架,上架之后,可以在Temu等销售端售卖。每个供应商都需要给自己的商品新建仓库,这个仓库用于供应商真实发货使用。
2025-08-11 01:11:32
136
原创 前后端加密交互?后端如何知道前端拿到手的真实数据![浅谈APIFOX如何进行后置操作]
所以,前后端数据加密传输,其实对于有一定基础的人来说还是比较容易破解的,但是毕竟这种操作是有点违规的,而很多比较严谨的项目会有更深的保密手段(比如我曾经尝试分析我校教务处的登录系统,但是发现浏览器f12没有抓到前端传递到后端的请求,用小鸟工具Reqable才抓到login接口,但是这个接口,在source资源也搜索不到对应源码位置,不知道为什么,有知道答案的可以评论教教我呗!于是我拿着这部分的源码,丢给Deepseek,帮我生成一下APIFOX的后置操作脚本,之后再调用这个接口,就可以看到真正的返回值了。
2025-08-01 10:15:31
286
原创 操作系统常见信号、Golang对于信号的处理过程
一般常见的就是监听中断退出信号,然后对程序进行优雅退出。终端输入(如 Ctrl+C 产生 SIGINT)如果进程被阻塞(如系统调用中),内核会中断阻塞。软件事件(如定时器触发 SIGALRM)硬件异常(如段错误 SIGSEGV)内核将信号放入目标进程的信号队列。系统调用注册自己的信号处理器。默认情况下会拦截所有列出的信号。发送 SIGKILL)
2025-07-31 11:27:08
308
原创 MESI协议工作流程详解
CPU缓存一致性问题中,为了保证多CPU之间对于同一个变量的数据一致性,我们需要让多CPU之间有办法进行互相同步,可以让各个CPU之间的读写事件互相传递,比如CPU A写了变量i,那就需要把这份脏数据同步到其他核心比如 核心 B,那就需要使用广播的机制。(总线嗅探的工作机制可以这么去理解)同时还需要MESI协议,这个协议可以保证对于同一变量在。用一个具体的例子,配合状态变化图,彻底讲清楚MESI协议如何保证多核CPU的缓存一致性。
2025-07-29 18:27:47
963
1
原创 Linux多进程相同的虚拟地址映射到不同的物理内存地址?怎么做到的?
TLB(Translation Lookaside Buffer)需要区分不同进程的虚拟地址映射,避免混淆。:CPU 将当前进程的 ASID 和虚拟地址一起发送到 TLB,仅匹配相同 ASID 的条目。TLB 对共享页的处理:不同进程的相同虚拟地址可映射到同一PFN(ASID不同但PFN相同)。:TLB 条目绑定进程标识,确保不同进程的相同虚拟地址映射到不同物理地址。硬件支持 ASID 时,可保留多进程的TLB条目,减少刷新开销。,存储该进程的虚拟页号(VPN)到物理页框号(PFN)的映射。
2025-07-21 15:02:13
340
原创 Golang中的协程是什么?大家都说Go支持高并发是为啥?[浅谈轻量级用户态线程]
但是,事实上很多公司都停留在较低版本的JDK开发,JDK11和JDK17是目前的主流(还有部分清朝编程需要实习生改JSP代码的我就不点名了),对于线程池阻塞的问题,无法使用虚拟线程特性的都是使用 调大线程池数量 、 不阻塞并设置异步回调函数 之类的方案去解决。如果我们采用虚拟线程池化技术,虚拟线程在阻塞时自动挂起,释放底层线程资源并且运行其他任务,等到原本阻塞的任务执行完毕了再重新调度获取空闲线程去执行,解决了阻塞的问题。其实,线程分为三种,内核线程、用户线程和轻量级用户态线程。
2025-07-16 15:01:09
954
1
原创 在Linux里面开了这么多进程?CPU执行权怎么分配?[进程调度算法]
我们都知道进程、线程的执行,都是需要用CPU去跑去处理的。看过小林大佬花的图的都知道下面这张图,是多级反馈队列调度器,也就是兼顾了优先级和公平性的一版调度算法。例如:若只有A、B进程,且 进程A权重 是 进程B权重 的2倍,则A的时间片也是B的2倍。实现了理论上的完全公平,同时通过动态调整兼顾了交互式任务的低延迟和批处理任务的高吞吐量。: 这样设计,能确保设置了高优先级(也就是低nice值)的进程,它的。那么,Linux是采用什么调度器呢,也是多级反馈队列调度算法吗?:红黑树结构支持数千个进程的高效调度。
2025-07-11 13:45:45
832
原创 Linux内存不足了,回收策略是什么?怎么个回收法?回收哪些个东西?
经常会在top 或者free -h命令看见内存的一些基本情况,而一些进程的内存不足大多时候也是基于LRU的改进版,比如我们熟知的MySQL会有几条LRU链表来管理buffer pool,还引入了老年代和新生代,来避免全表扫描时访问次数少的预读页,覆盖了原本有用的数据页。那Linux的内存淘汰策略又如何?
2025-07-07 14:20:05
803
1
原创 golang mysql: packets.go:122: closing bad idle connection: EOF 的一些见解
我的代码里面设置的存活时间很长,但是通过查看MySQL的变量发现,MySQL的连接超时时间只有120s,导致代码层使用到了已经失效的连接,sql也就对应无效了。因此,要么就修改MySQL的超时时间为5400s(也就是1h30min),要么就把代码的存活时间设置为90s左右。如上图,自从Java实习结束,兜兜转转来到一家Go公司实习,使用MySQL的时候出现了上图这个问题。怪不得业务上出现了奇奇怪怪的问题,导致后端这里需要多写一些补偿机制的接口和后台任务!
2025-06-13 11:23:21
249
原创 JetBrains编辑器,IDEA或Goland报错:‘xxx‘未解析引用,但是程序能正常运行
goland编辑器:代码爆红说找不到引用,问了AI,说是指针类型和值类型不同无法识别,但是实际上并未对这部分的类型进行修改,而且项目可运行。
2025-06-04 11:51:10
324
原创 为什么system提示词会失效啊???
以美团智能客服举个例子这样,我骑美团单车,之后由于网络波动或者其他原因,我无法正常通过页面的"关锁"按钮进行关锁,于是我就去美团客服中咨询智能客服,客服会帮我查询最近一笔单车的订单,并且询问我是否关锁,此时我再次确认关锁,之后美团智能客服就会帮我把骑行订单的状态修改为"已完成"并成功关锁。但是没等我输入确认,智能客服就自己去调用接口并关锁并返回最终结果了!也就是这里system提示词的"在关锁之前,必须确保条款允许这样做,且必须在继续之前征得用户同意"生效了,但是没有完全生效!
2025-05-02 16:29:32
570
原创 无法解析符号VectorStore?向量数据库包的正确位置!
由于想要自己快速搭建一个demo,因此不想选用额外的数据库去存储向量数据,发现官网中有一个SimpleVectorStore直接将数据存储到Java内存中,因此想着试试,结果一直无法正确导包,很烦很烦很烦!查了资料和问了AI对话,都没有什么作用。SpringAI这块,遇到网上资料都参差不齐,各种大模型数据又太旧,对这块知识的记载几乎太少,因此建议可以先从各种组件的官网查询资料,而后再选择从博文查看是否有对应的解决方案,再次才是直接问大模型会话。
2025-05-01 00:51:41
429
4
原创 java: 找不到符号 符号: 变量 log
如果还是不能解决(我就是),那就是版本冲突了,可以去pom.xml丢给AI,让AI帮我修正一版更好的pom.xml然后复制粘贴,覆盖到项目的pom.xml中。(我就是这样解决了)这个问题很抽象,可以先去看其他博文说的,把1. 注解处理开起来;2. 加一个运行时命令行参数。如果还不能解决,那就不知道了,欢迎评论区继续讨论。
2025-04-30 12:19:13
433
原创 UUID唯一性的一些“八股”,是否依赖于MAC地址?
因此,在实际应用中,Version 1 UUID的使用逐渐减少,更多使用Version 4 UUID(基于随机数)。如果别人知道你的身份证号(Version 1 UUID),他们可能会猜到你的出生地(MAC地址),所以现在更多人使用随机生成的彩票号码(Version 4 UUID)。使用命名空间(如URL、域名)和输入数据(自己保证是业务上唯一的数据即可),通过SHA-1哈希算法生成。为了确保每个人的身份证号(UUID)都是唯一的,需要结合出生时间(时间戳)和出生地(MAC地址)。
2025-03-14 14:46:06
440
原创 @Resource 和 @RequiredArgsConstructor 注入方式不同带来的数据不一致的问题
具体的getSerializer()方法如下,如下图RedisTemplate类中有一个属性变量为valueSerializer,因此我使用反射的方式获取对应的字段,然后再设置为可访问,然后传入对应的示例对象,获取该对象对应的valueSerializer字段。首先,我开了一个demo项目,然后造了两个接口,一个是http://127.0.0.1:8080/redis,一个是http://127.0.0.1:8080/redis/2 ,下方两个图是具体的代码逻辑。于是,我的接口就报错了,查了日志。
2025-02-26 15:40:01
402
1
原创 直接操作数据库再删除缓存与延迟双删策略差异的一些解释
在数据库更新后,如果直接删除缓存,而此时恰好有大量请求涌入,这些请求会因为缓存缺失而直接打到数据库上,形成所谓的“缓存穿透”,这可能会对数据库造成极大的压力,甚至导致服务不可用。:通过在数据库操作前后各进行一次删除操作,尤其是在第二次删除(延迟后删除)时加入适当的延迟,可以给之前的读请求留出足够的时间完成,从而减少由于并发带来的不一致问题。:虽然第一次删除时可能会有短暂的缓存缺失,但相比于直接更新数据库再删除缓存,这种方式能更好地控制并发请求对数据库的冲击,维护服务的稳定性,从而间接提升用户体验。
2024-05-30 16:32:47
554
1
原创 Java基础:垃圾回收器会回收的对象
不再被任何活跃对象引用的对象:当一个对象不再被任何其他对象引用时,它就成为垃圾,垃圾回收器会将其回收并释放其占用的内存空间。对象的引用被置为null的情况:如果一个对象的引用被置为null,意味着程序不再需要这个对象,垃圾回收器会将其回收。总的来说,Java的垃圾回收器会回收不再被程序使用的对象和内存空间,以确保内存的有效利用和程序的性能优化。程序结束时未释放的内存:在程序结束时,垃圾回收器会回收程序运行时分配的所有内存,包括未显式释放的内存。//搬运自GPT问答。
2023-12-21 20:25:44
731
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人