- 博客(91)
- 收藏
- 关注
原创 百日筑基第六十天-学习一下Tomcat
Tomcat 中最顶层的容器是 Server,代表着整个服务器,从上图中可以看出,一个 Server可以包含至少一个 Service,用于具体提供服务。Service 主要包含两个部分:Connector 和 Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:【1】Connector 用于处理连接相关的事情,并提供 Socket 与 Request 和 Response相关的转化;
2024-08-23 23:43:00
1314
原创 百日筑基第五十九天-本地压测工具了解一下
是一款使用 Java 开发的功能和性能测试软件。工作原理是仿真用户向服务器发送请求,并收集服务器应答信息并计算统计信息。逻辑控制器。
2024-08-22 23:43:05
1192
原创 百日筑基第五十八天-雪花算法了解一下
UUIDUUID是通用唯一识别码 (Universally Unique Identifier),在其他语言中也叫GUID,可以生成一个长度 32位的全局唯一识别码。UUID虽然可以保证全局唯一,但是占32位而且无序,入库性能比较差。MySQL使用InnoDB存储引擎,底层索引使用的B+树索引。索引是按照顺序在叶子节点分布的,如果按顺序插入索引,则会使用顺序IO依次写入磁盘,也不会出现页分裂和浪费等问题,性能也比较高。但如果使用无序的UUID。
2024-08-21 23:51:23
857
原创 百日筑基第五十七天-虚拟线程
JDK19于2022-09-20发布GA版本,该版本提供了虚拟线程的预览功能。下载JDK19之后翻看了一下有关虚拟线程的一些源码,跟早些时候的Loom项目构建版本基本并没有很大出入,也跟第三方JDK如鹅厂的Kona虚拟线程实现方式基本一致,这里分析一下虚拟线程设计与源码实现。
2024-08-20 23:40:26
1121
2
原创 百日筑基第五十六天-分代ZGC
OpenJDK 21 是下一个 LTS 版本,将于 2023 年 9 月 19 日正式发布。其中包括的一个重要更新就是,分代 ZGC。我们都知道,先前的 ZGC 是不分代的,因此 ZGC 需要将所有对象存储在一起,无论对象存活时间或长或短,并且每次 GC 运行时,收集器都需要扫描所有对象。基于「大部分对象朝生夕死」的弱分代假说,ZGC 显然可以更进一步优化当前的实现。
2024-08-19 23:43:17
1175
原创 百日筑基第五十二天-初识ZGC
垃圾回收器的暂停问题一直是Java工程师关注的重点,特别是对实时响应要求较高的服务来说,CMS和G1等主流垃圾回收器的数十毫秒乃至上百毫秒的暂停时间相当致命。然而,这种超低延迟表现也需要一定的代价,因为在实现低延迟的同时,ZGC 会占用一定的 CPU 资源。与CMS中的ParNew和G1类似,ZGC也采用标记-复制算法,不过ZGC通过着色指针和读屏障技术,解决了转移过程中准确访问对象的问题,在标记、转移和重定位阶段几乎都是并发执行的,这是ZGC实现停顿时间小于10ms目标的最关键原因。
2024-08-15 23:14:58
834
原创 百日筑基第五十一天-进程、线程、协程、纤程和Virtual Threads之间的区别与关系
线程是进程内的执行单元,一个进程可以包含多个线程,它们共享进程的内存空间和资源。进程是计算机中运行的程序的实例。协程是一种更轻量级的线程,它可以在不同的执行点之间切换,而不是依赖于操作系统的线程调度。纤程是一种用户态的轻量级线程,它由用户程序自己调度,不依赖于操作系统的线程调度。纤程可以在同一个线程内切换执行,减少了线程切换的开销,提高了并发处理的效率。总而言之,线程是一种轻量级的执行单元,它可以并发执行并共享进程的资源。在多线程编程中,线程之间的执行是并发的,可能会出现一些同步问题,例如竞态条件和死锁。
2024-08-14 23:21:48
816
2
原创 百日筑基第五十天-TypeReference-FastJson详解
TypeReference是一个描述复杂泛型的工具类。很多类库都有,我们使用alibaba.fastjson来举例。在反序列化场景中获取泛型参数。TypeReference支持泛型参数,方便一些框架实现通用的反序列化类,对复杂的类型可以很方便的反序列化。使用Gson、Jackson或Fastjson反序列化泛型时,需要传递泛型的真实类型,所以一般都通过集成TypeReference来实现。
2024-08-13 23:19:38
878
1
原创 百日筑基第四十三天-了解一下Spring AI
Spring真的是追着把饭喂给程序员,通过SpringAI,创建一个AI应用全程都不到5分钟大家有兴趣的可以去试试其他的AI大模型,官网都有很详细的教程。
2024-08-06 23:53:59
814
2
原创 百日筑基第四十二天-JDK版本梳理
JDK 10 是 Java SE 10 平台的开源参考实现,由 Java Community Process 中的 JSR 383 定义。JDK 10 于 2018 年 3 月 20 日全面上市。Oracle 提供 GPL 下的生产就绪二进制文件;其他供应商的二进制文件也将很快推出。此版本的功能和时间表是通过 JEP Process 提出和跟踪的,并由 JEP 2.0 提案修订。
2024-08-05 23:50:47
837
原创 百日筑基第三十九天-关于枚举的一切
枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。Java 1.5的枚举能满足绝大部分程序员的要求的,它的简明,易用的特点是很突出的。在所有的单例实现方式中,枚举是一种在代码写法上最简单的方式,之所以代码十分简洁,是因为Java给我们提供了enum。
2024-08-02 23:52:03
984
原创 百日筑基第三十八天-阿里开发手册异常日志
1.【强制】错误码的制定原则:快速溯源、沟通标准化。2.【强制】错误码不体现版本号和错误等级信息。3.【强制】全部正常,但不得不填充错误码时返回五个零:00000。4.【强制】错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。5.【强制】编号不与公司业务架构,更不与组织架构挂钩,以先到先得的原则在统一平台上进行,审批生效,编号即被永久固定。6.【强制】错误码使用者避免随意定义新的错误码。7.【强制】错误码不能直接输出给用户作为提示信息使用。
2024-08-01 22:46:59
566
原创 百日筑基第三十七天-阿里开发手册编程规约
1.【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。// 开发者 A 定义了缓存的 key。// 开发者 B 使用缓存时直接复制少了下划线,即 key 是"Id#taobao" + tradeId,导致出现故障。2.【强制】long 或 Long 赋值时,数值后使用大写 L,不能是小写 l,小写容易跟数字混淆,造成误解。说明:public static final Long NUM = 2l;写的是数字的 21,还是 Long 型的 2?
2024-07-31 22:34:04
1551
原创 百日筑基第三十六天-阿里JAVA开发手册-1.编程规约
反例:定义为布尔类型 Boolean isDeleted 的字段,它的 getter 方法也是 isDeleted(),部分框架在反向解析时,“误以为”对应的字段名称是 deleted,导致字段获取不到,得到意料之外的结果或抛出异常。1)**【强制】**对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用 Impl 的后缀与接口区别。2)**【推荐】**如果是形容能力的接口名称,取对应的形容词为接口名(通常是 –able 结尾的形容词)。
2024-07-30 22:58:09
761
原创 百日筑基第三十五天-Java 21 新特性概览
JDK 21 于 2023 年 9 月 19 日 发布,这是一个非常重要的版本,里程碑式。JDK21 是 LTS(长期支持版),至此为止,目前有 JDK8、JDK11、JDK17 和 JDK21 这四个长期支持版了。
2024-07-29 23:06:27
850
原创 Integer.parseInt(s)与Integer.valueOf(s)的区别详解
Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象,得到的对象有时是同一个对象,有时是不同的对象,要根据把s字符串解析的整数值的大小进行决定:如果s字符串对应的整数值在 -128。通过上面示例,字符串s对应的整数值为100,在-128~127之间,所以解析出的两个对象i1和i2是相等的。equals是比较的两个对象i1和i2中的value值是否相等,“==”是比较i1和i2两个对象是否相等。不管对象是否相等,对象中的value值是相等的。
2024-07-29 22:33:55
488
原创 在使用单元测试时,遇到了下面的错误: java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare]
建议使用 Use assertEquals(期待值, 真实值, 允许误差)来比较浮点值。
2024-07-29 22:32:55
309
原创 百日筑基第三十三天-JAVA 如何实现链式调用
在 Java 中实现链式调用通常涉及返回当前对象的引用以便方法可以连续调用。这种模式常见于构建器(Builder)模式或流畅接口设计中。下面是一个简单的例子来说明如何实现链式调用。假设我们有一个Person类,它有一些属性和一些方法,这些方法可以设置这些属性,并且希望这些方法可以链式调用。
2024-07-27 23:03:03
394
1
原创 百日筑基第三十二天-GitHub项目开发流程(Idea虽好,但也要知道按钮背后的原理)
在Linux上拉取GitHub项目可以使用Git命令。首先确保已经安装了Git。如果没有安装,可以通过包管理器(比如aptyum)来进行安装。(win用户只有这一步不一样)
2024-07-26 23:50:38
363
原创 Java基础-IO流
磁盘与内存之间的数据交互,可以看做是一种数据的流动,按照流动方向,以内存为基准,分为输入 input 和输出 output,即流向内存的是输入流,流出内存的是输出流。Java IO操作主要是指使用 java.io包下的内容,进行输入、输出操作。输入也叫读取数据,输出也叫写出数据。根据数据的流向分为:输入流和输出流。根据数据的类型分为:字节流(以字节为单位)和字符流(以字符为单位)。输入流输出流字节流字符流ReaderWriter。
2024-07-26 09:00:00
812
原创 Java基础-Atomic原子类
/枚举类//1.提供类的属性,声明为private final//2.声明为final的属性,在构造器中初始化。//3.通过公共的方法来调用属性//4.创建枚举类的对象:将类的对象声明public static finalpublic static final Season SPRING = new Season("spring", "春暖花开");
2024-07-26 08:00:00
1554
原创 百日筑基第三十一天-对象池复用实践
【1】是Apache提供的一个通用对象池技术实现,可以方便定制化自己需要的对象池。【2】Maven依赖</</</</【3】使用案例@Override@Override@Overridestatic {// 根据需求自定义配置// 资源耗尽时,是否阻塞等待获取资源,默认 true// 回收资源线程的执行周期,默认 -1 表示不启用回收资源线程// 对象总数// 最大空闲对象数// 最小空闲对象数// 借对象阻塞最大等待时间// 获取资源的等待时间。
2024-07-25 23:33:04
486
原创 都4202年了为什么大厂程序员还在用java8?
而对于第四个示例没有起始值的 reduce(),由于可能没有足够的元素,返回的是 Optional,请留意这个区别。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回 Stream 本身,这样你就可以将多个操作依次串起来。你也可以通过 map 来将对象转换成其他类型,map 返回的 Stream 类型是根据你 map 传递进去的函数的返回值决定的。当然你也可以直接通过接口创建对象,然后实现接口中的默认方法就可以了,我们通过代码演示一下这种方式。
2024-07-25 10:00:00
1342
1
原创 百日筑基第三十天-Java8 Optional 规范化处理NULL值的工具(极其优雅)
第 1-4 步每一个步骤的结果也具备不确定性,所以我们也把它们的结果设计成 Optional。Optional 就像一个处理不确定性的管道,我们在一头丢进一个可能是 null 的东西(接口返回结果),经过层层处理,最后消除不确定性。这篇文章是建立在你对 Optional 的用法有一定了解的基础上的,如果你还不太了解 Optional,可以先去看看相关教程,或者查阅。Optional 的魅力还不止于此,Optional 还有一些神奇的用法,比如 Optional 可以用来检验参数的合法性。
2024-07-24 22:46:09
1192
原创 Java基础-泛型相关总结
【1】解决元素存储的安全性问题。【2】解决获取数据元素时,需要类型强转的问题。【3】可以统一数据类型,便于操作。【4】将运行时的异常提前到了编译时,提高了效率。【5】实现代码的模板化,把数据类型当作参数传递,提高了可重用性。【6】只要在编译时期没有出现警告,那么运行时期就不会出现异常。
2024-07-24 09:00:00
679
原创 Java基础-异常处理
【1】创建自定义异常类继承类。/*** @description: 自定义异常类,包含了有参合无参构造器*/@Data//状态码//异常消息【2】将自定义的异常类添加到拦截的Handler中//拦截自定义异常(20001,“手动异常抛出”);@Autowiredtry{//手动抛出异常throw new BusinessException(20001,"手动异常抛出");
2024-07-24 08:30:00
1101
原创 企业级 线上故障排查思路
一旦超出监控的范围,则排查思路很重要,按照流程化的思路来定位问题,能够让我们在定位问题时从容、淡定,快速的定位到线上的问题。上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行。个对象,在循环的时候,所有的数据全部保存在某个方法中无法释放,导致内存堆积到。类引发的,故查询项目代码,获得如下信息:根据代码和日志分析,可知是由于限制值。的打印,代表内存设置过小或者有内存泄漏,此时需要抓取内存快照进行分享。过高的时候,接口性能会快速下降,同时监控也会开始报警。
2024-07-24 08:00:00
1145
原创 八日筑基第二十九天-为什么要将Double换成BigDecimal?
浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断。想要解决浮点数运算精度丢失这个问题,可以直接使用BigDecimal来定义浮点数的值,然后再进行浮点数的运算操作即可。// 0浮点数没有办法用二进制精确表示,因此存在精度丢失的风险。不过,Java 提供了BigDecimal来操作浮点数。BigDecimal的实现利用到了BigInteger(用来操作大整数), 所不同的是BigDecimal加入了小数位的概念。
2024-07-23 23:16:48
520
原创 七大设计原则-通过正反例代码学习
接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计的基本原则之一,它的核心思想是:使用多个专门的接口,比使用单一的总接口(总接口包含多个方法)要好。这样客户端仅需要知道它们感兴趣的方法。换句话说,一个类对另一个类的依赖应该建立在最小的接口上。依赖倒置原则高层模块不应该依赖低层模块,两者都应该依赖其抽象:这意味着,在设计系统时,我们应该尽量通过接口或抽象类来定义模块之间的依赖关系,而不是直接依赖于具体的实现类。抽象不应该依赖细节,细节应该依赖抽象。
2024-07-23 08:00:00
931
原创 百日筑基第二十八天-23种设计模式-行为型总汇
设计模式可以说是对于七大设计原则的实现。创建型模式,共五种:单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式,共七种:代理模式、外观模式、享元模式、组合模式、桥接模式、装饰器模式、适配器模式。行为型模式,共十一种:模板方法模式、迭代器模式、访问者模式、观察者模式、命令模式、状态模式、策略模式、备忘录模式、中介者模式、解释器模式、责任链模式。
2024-07-22 22:37:44
863
原创 企业级网站的性能优化方法有哪些?
如果性能测试结果不满足我们预期的需求时,检查请求处理的各个环节的日志,分析哪个环节响应时间不合理,超出预期;然后检查监控数据分析影响性能的主要因素是内存、磁盘、网络、还是 CPU,是代码问题还是架构设计不合理,或者系统资源确实不足。根据网站分成架构,可分为。
2024-07-22 09:00:00
1313
1
原创 百日筑基第二十七天-Java8 stream流常用操作
除了使用Collectors提供了toMap,toList等方法之外,我们还可以自定义Collection的数据结构收集//用LinkedList收集//用TreeSet收集。
2024-07-21 22:43:00
980
原创 百日筑基第二十六天-java8 Stream数据流入门
Stream是Java SE 8类库中新增的关键抽象,它被定义于Stream代表对象引用流,此外还有一系列特化流,如IntStreamLongStream等。Java 8引入的的Stream主要用于取代部分Collection的操作,每个流代表一个值序列,流提供一系列常用的聚集操作,可以便捷的在它上面进行各种运算。集合类库也提供了便捷的方式使我们可以以操作流的方式使用集合、数组以及其它数据结构;
2024-07-20 23:52:26
1010
2
原创 Mockito单元测试教程
Testverify(arrayList, description("size()没有调用")).size();// org.mockito.exceptions.base.MockitoAssertionError: size()没有调用verify(arrayList, timeout(200).times(3).description("验证失败")).add(anyString());
2024-07-20 09:00:00
1416
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅