- 博客(53)
- 收藏
- 关注
原创 2.4.2 JVM内存管理中有个“堆栈”的概念。栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象。那JVM里面的“栈”跟我们这里说的“栈”是不是一回事呢?如果不是,那它为什么又叫作“栈
JVM 的栈就是栈:它使用标准的数据结构“栈”来管理方法调用。名字由来:因为它操作方式是 Push/Pop,逻辑是 LIFO,所以叫 Stack。“堆栈”是合称:指 Heap 和 Stack 两块不同的内存区域,不是一种新结构。为什么不用其他结构:同上一个问题的答案——只有栈能最高效、最自然地匹配函数调用的嵌套返回逻辑。
2026-11-05 15:30:36
273
原创 2.4.1 在讲栈的应用时,讲到用函数调用栈来保存临时变量,为什么函数调用要用“栈”来保存临时变量呢?用其他数据结构不行吗?
特性栈 (Stack)其他结构 (如堆、队列)逻辑匹配度⭐⭐⭐⭐⭐ 完美匹配 LIFO⭐ 不匹配嵌套返回逻辑分配/释放速度⭐⭐⭐⭐⭐ O(1)O(1),仅移动指针⭐⭐~⭐⭐⭐ 可能需要搜索或 malloc/freeCPU 缓存友好⭐⭐⭐⭐⭐ 连续内存⭐⭐ 可能分散(如链表)硬件支持⭐⭐⭐⭐⭐ 专用寄存器和指令⭐ 通用指令,无专门优化实现复杂度⭐ 极简⭐⭐⭐⭐ 复杂,需手动管理状态结论函数调用使用栈,是因为函数调用的语义(嵌套、返回)与栈的数据结构特性(LIFO)是天作之合,同时还能获得。
2026-11-05 15:27:34
339
原创 控制反转、依赖反转、依赖注入,这三者有何区别和联系?
本文系统讲解了控制反转(IOC)、依赖注入(DI)和依赖反转原则(DIP)三个关键概念及其关系。控制反转是框架层面的设计思想,将程序流程控制权从开发者转移给框架;依赖注入则是实现IOC的具体编码技巧,通过外部传递依赖对象而非内部创建,提升代码可测试性和扩展性;依赖反转原则强调高层与低层模块都应依赖抽象而非具体实现。文章通过测试框架和消息通知等实例生动展示了这些概念的应用场景,并指出Spring等DI框架如何自动化管理对象依赖关系。最后强调DIP在框架设计中的重要性,即通过抽象解耦不同层级模块的依赖关系。
2026-06-08 14:37:17
221
原创 RocketMQ底层是java代码编写吗?
看到的绝大多数代码:全是 Java(包括各种 Service、Manager、Store 等)。感受不到但至关重要的性能模块:使用了 Netty 的 Epoll 传输库,其中包含了少量的 C 代码(通过 JNI 调用 Linux 系统级 API)。所以,可以把它看作是一个“纯 Java 的系统”,它不需要像 C++ 开发那样去手动管理内存,但它非常聪明地利用了 Linux 操作系统的底层特性来保证自己“快得像 C 语言写的程序”。
2026-04-10 11:30:02
249
原创 理解rocketmq底层代码导览
存储层:利用磁盘顺序写和**内存映射(mmap)**来保证吞吐量。逻辑层(顺序):通过Broker 端的写入锁和Consumer 端的对象锁,人为地在分布式系统中构筑了一个“排队通道”。
2026-04-10 11:25:31
355
原创 重放攻击以及防御手段
重放攻击是指攻击者截获并重复发送合法请求的攻击手段,可能导致重复操作(如重复转账)。防御核心是确保请求的时效性和唯一性,主要方法包括:1)时间戳+随机数组合,限制有效窗口期并确保请求唯一;2)序列号机制,用于金融等场景。HTTPS无法防御重放攻击,需配合应用层防护。防御流程分三步:客户端生成带时间戳和随机数的签名,服务器检查时效性、唯一性和签名合法性。仅非幂等接口(如涉及资金变更)需要严格防重放,查询类接口可不做防护。
2026-03-19 16:25:36
518
原创 组合优于继承,多用组合少用继承
摘要: 继承虽能实现代码复用和is-a关系,但过度使用会导致继承层次过深、复杂性增加,降低代码可维护性。例如,鸟类设计中,继承难以灵活处理不同行为(如飞行、鸣叫),易引发类爆炸。组合通过接口和委托能更优雅地解决这些问题,避免代码重复,增强灵活性。实际开发中,若继承结构稳定且简单,仍可使用;反之,优先选择组合。设计模式中,装饰者、策略等常用组合,模板模式则用继承。组合与继承各有优劣,需根据场景权衡使用。
2026-03-19 14:42:16
282
原创 Entity、BO、VO 代码重复问题以及MVC三层开发原因
本文探讨了MVC架构中Entity、BO、VO重复的必要性与简化策略。核心观点认为这种"结构性重复"是必要的层级隔离代价,而非简单冗余。文章建议:1)简单CRUD可合并BO与Entity;2)查询场景可直接映射VO;3)BO应基于业务聚合而非表结构。强调必须保留VO确保安全解耦,推荐使用MapStruct和Lombok工具简化转换。最终指出层级耦合比代码重复危害更大,适当重复是解耦的合理代价。
2026-03-18 17:18:30
315
原创 基于接口而非实现编程
本文探讨"基于接口而非实现编程"的设计原则,强调接口应作为功能协议而非具体语法。该原则通过将接口与实现分离,封装不稳定实现,暴露稳定接口,从而提高代码扩展性和维护性。文中以图片存储系统为例,展示了从公有云切换到私有云时,遵循该原则如何减少代码修改:1)使用抽象命名;2)封装实现细节;3)定义统一接口。同时指出并非所有类都需要接口,只有当实现可能变化时才需应用此原则。最终强调抽象思维在软件设计中的重要性,该原则可应用于从代码细节到系统架构的各个层面。
2026-03-18 16:34:54
370
原创 贫血模型&充血模型
摘要:贫血模型是领域驱动设计中的争议概念,指对象仅含数据而缺乏业务逻辑(如POJO/DTO),业务逻辑集中在Service层。其流行源于开发简单、工具链支持良好,但存在违反封装原则、逻辑分散等问题。与之相对的充血模型将逻辑封装在实体内部。实际开发中建议根据场景选择:简单CRUD适用贫血模型,复杂业务应采用充血模型,或采用核心实体充血、辅助类贫血的混合模式。当Service层出现大量状态判断时,应考虑转向充血模型以提升代码质量。
2026-03-17 17:51:27
607
转载 理解Redis知识点
从上面的例子可以看出,Redis 的内存几乎被缓冲区占用殆尽。以下是具体的结论:当前内存使用 (used_memory) 已经接近最大内存限制 (maxmemory),即 1.02 GB 接近 1.00 GB 的限制。内存开销 (used_memory_overhead) 很大,主要被客户端普通连接使用(可能是输出缓冲区),而实际的数据仅占用了很少的内存。分配器和 RSS 碎片率 (allocator_frag_ratio 和 mem_fragmentation_ratio) 较低,表明碎片不是问题。
2024-10-17 09:50:43
328
原创 LocalDate使用手册~
简介伴随 lambda表达式、stream 以及一系列小优化,Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、 长短(duration)、日期、时间、时区和周期。同时继承了Joda 库按人类语言和计算机各自解析的时间处理方
2022-02-23 11:00:29
1645
原创 为什么不能使用 BigDecimal 的 equals 方法做等值比较
总结放最前^v^:对于精确计算和比较时,例如钱,0.01分也是钱的时候,就用bigdecimal,bigdecimal建议还是在创建对象时,入参都进行toString,或者new string(param),保证精度不会丢失,不会出现小数点后面多几位,最重要的是计算则用它的自带加减乘除的方法,如果比较相等则用compareto方法比较。-----------------------------------------------------------------------------------
2022-02-18 15:41:36
347
原创 批量处理数据的三种方式
直接上结论:方法一、通过java for循环调用insert(单个对象),由于每次插入都会进行一次create SqlSession -> commit操作,因此数据量大时禁用,在插入条数少时可用,逻辑简单,使用方便。方法二、通过xml拼接sql foreach效率高,但条数过长会报错,插入条数长时可用,需要预估条数,在进行跑批。方法三、批处理java中自建sqlSession ->循环insert->commit,避免每次循环操作都进行commit,同方法二插入.
2022-02-11 18:12:12
5384
原创 在项目中用了Arrays.asList、subList,被公开批评
1. 使用Arrays.asList的注意事项1.1 可能会踩的坑先来看下Arrays.asList的使用:List<Integer> statusList = Arrays.asList(1, 2);System.out.println(statusList);System.out.println(statusList.contains(1));System.out.println(statusList.contains(3));输出结果如下图所示:然后,往statu
2022-01-17 18:08:11
184
原创 Java异步工具:CompletableFuture
通过阅读本篇文章你将了解到: CompletableFuture的使用 CompletableFure异步和同步的性能测试 已经有了Future为什么仍需要在JDK1.8中引入CompletableFuture CompletableFuture的应用场景 对CompletableFuture的使用优化 场景说明查询所有商店某个商品的价格并返回,并且查询商店某个商品的价格的API为同步 一个Shop类,提供一个名为getPrice的同步方法 店铺类
2022-01-12 11:36:23
432
原创 JAVA实现滑动时间窗口
先上代码package demo;import java.time.LocalTime;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Random;import java.util.concurrent.ConcurrentHashMap;/** * @author liaozian * @Description * @date 2021/12/..
2021-12-13 17:16:00
2629
1
原创 MySQL不用uuid做主键的原因
在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?本篇博客我们就来分析这个问题,探讨一下内部的原因。目录一、mysql和程序实例二、使用uuid和自增id的索引结构对比三、总结一、mysql和程序实例1.1.要说明这个问题,我们首先来建立三张表分别是user_auto_key,us
2021-12-13 13:52:45
607
原创 sqlsever查询索引sql、表结构sql(复制即可用)
引言最近在使用sql server数据库,查询表索引和mysql不太一样,实在不太方便,花时间找了几种可尝试方法便于大家查看索引~查询索引方法一:SELECT 索引名称=a.name,表名=c.name,索引字段名=d.name,索引字段位置=d.colidFROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c O...
2021-12-08 17:55:55
5213
转载 同事乱用 Redis 卡爆,我真是醉了...
首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多的同事开始抱怨,于是感觉代码可能有问题,开始排查。top 命令首先发现开发的本地ide没有发现问题,应用卡死时候数据库,redis都正常,并且无特殊错误日志。开始怀疑是sandbox环境机器问题(测试环境本身就很脆!_!)于是ssh上了服务器 执行以下命令top这时发现机器
2021-12-06 15:23:38
181
原创 实现序列化与反序列化,一定要绕开这些坑
目录1.序列化与反序列化的概念2.子类实现Serializable接口,父类没有实现,子类可以序列化吗?3.类中存在引用对象,这个类对象在什么情况下可以实现序列化?4.同一个对象多次序列化之间有属性更新,前后的序列化有什么区别?1.序列化与反序列化的概念先说说序列化和反序列化的概念 序列化:将对象写入到IO流中 反序列化:从IO流中恢复对象 Serializable接口是一个标记接口,不用实现任何方法,标记当前类对象是可以序列化的,是给JVM看的。序列化机
2021-12-06 13:50:00
234
原创 Java 性能优化的几十个细节
目录1. 尽量在合适的场合使用单例2. 尽量避免随意使用静态变量3. 尽量避免过多过常的创建Java对象4. 尽量使用final修饰符5. 尽量使用局部变量6. 尽量处理好包装类型和基本类型两者的使用场所7. 慎用synchronized,尽量减小synchronize的方法9. 尽量不要使用finalize方法10. 尽量使用基本数据类型代替对象11. 多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList12. 尽量合理的创建HashMap
2021-11-29 11:01:46
323
原创 HashMap解决hash冲突
1 什么是hash冲突我们知道HashMap底层是由数组+链表/红黑树构成的,当我们通过put(key, value)向hashmap中添加元素时,需要通过散列函数确定元素究竟应该放置在数组中的哪个位置,当不同的元素被放置在了数据的同一个位置时,后放入的元素会以链表的形式,插在前一个元素的尾部,这个时候我们称发生了hash冲突。2 如何解决hash冲突事实上,想让hash冲突完全不发生,是不太可能的,我们能做的只是尽可能的降低hash冲突发生的概率:下面介绍在HashMap中是如何应对hash冲
2021-11-23 18:02:40
6197
1
原创 MySQL 团队开发规范
数据库对象命名规范数据库对象数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。数据库对象全局命名规范1、命名使用具有意义的英文词汇,词汇中间以下划线
2021-11-23 16:34:28
182
原创 利用coalsece、ifnull、full join查询结果集案例
题目有如下三张表T1110A(仓库期初)T1110B(仓库发出)T1110C(仓库收入)要求得到如下结果:该如何写这个SQL?测试语句CREATETABLET1110A(WAREHOUSEVARCHAR(10),ITEMVARCHAR(10),QTYINT)INSERTINTOT1110AVALUES('A','P001',100);INSERTINTOT1110AVALUES('A','P002',200);I...
2021-11-10 10:54:05
537
原创 漫谈Mybatis
引言从源码角度看,mybatis是十分优秀的源码,其设计思路清晰简洁,虽然代码复杂度不高(相较于某些复杂源码)但麻雀虽小五脏俱全,非常适合拿来学习分析。通过本次分享,希望收获如下:了解mybatis设计思想,知晓各部分组成与职责,推敲源码细节不再迷茫 建立属于自己的看源码技巧,从容面对复杂源码,如:Spring 更好的体会面向对象、面向接口思想,能够在合适的场景将设计模式融入日常开发中一、准备工作——JDK动态代理二、mybatis核心模块1.Configuratio.
2021-11-09 15:04:01
338
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅