- 博客(30)
- 收藏
- 关注
原创 对象组成、分配、强弱引用
对象最终会出现在Eden区(TLAB分配也是在Eden区,栈上分配不算),而线程栈中会出现一个指向对象的引用,之后需要使用该对象时,直接通过引用中的直接地址或句柄访问该块内存区域中的对象数据。mark word是8字节,klassword压缩前8字节,压缩后4字节,一般都是取压缩后,实例数据如果是对象,或是引用,就是8个字节,最后还要加上对齐,必须是8的倍数。压缩的是引用类型,比如object类型,原来是8字节,压缩后变成4字节,然后数组长度也变成4字节了。和类型指针,如果是数组对象,还会存在数组长度。
2026-03-16 23:12:31
401
原创 运行时数据区
方法区:用于存储已被虚拟机加载的类信息(元数据)、常量、静态变量等数据。堆:用于存储对象实例和数组,是JVM中最大的一块内存区域,也是垃圾回收器主要工作的区域。栈:每个线程都有自己的调用栈,用于存储局部变量和部分结果,以及在方法调用时的返回地址。程序计数器:每个线程都有一个程序计数器,用于存储当前线程执行的字节码的行号指示器。本地方法栈:用于支持本地方法的执行,存储本地方法的调用状态。有些区域随着虚拟机的启动而开辟,随着虚拟机的终止而销毁,有的区域则是在运行过程中不断的创建与销毁。
2026-03-16 23:11:58
357
原创 执行引擎子系统
执行引擎子系统担任着JVM的“翻译官”角色,它负责将加载进内存的class字节码指令“翻译”成机器语言交由硬件执行。而字节码可以通过解释器和即使编译器两种途径转换为机械指令。HotSpot虚拟机中,采用的便是解释器+即时编译器混合执行的工作模式。
2026-03-13 20:55:52
318
原创 类加载子系统
自定义类加载器一般都是继承自 ClassLoader 类,从上面对 loadClass 方法来分析来看,我们只需要重写 findClass 方法即可。自定义类加载器的核心在于对字节码文件的获取,如果是加密的字节码则需要在该类中对文件进行解密。自定义类加载器需要实现三点:1. 继承ClassLoader2. 重写findClass()方法3. 在findClass()中调用defineClass()// 运维终端类加载器// 接收到的class文件本地的存储位置// 构造器。
2026-03-13 20:55:05
341
原创 JVM基础概念
定义了Java程序在运行时如何管理内存,包括内存的划分、访问、线程间的可见性( 多线程环境中如何保证共享变量可见性,通过内存屏障、volatile关键字和同步机制 )和一致性等。
2026-03-10 21:41:32
392
原创 分布式事务
/ 自定义的分布式事务注解// 标识当前是全局事务的开启者// 标识当前是全局事务的结束者注解中有两个值,表示当前被该注解修饰的方法,是分布式事务中的第一个业务操作,isEnd=true代表是最后一个业务操作,接着需通过AOP①通过反射获取自定义注解修饰的Method方法对象,以及注解对象自身。②判断业务方法上注解的值,看看是isStart是否为True为true,是分布式事务中第一个业务操作,故向管理者申请创建一个事务组,并获取事务组ID。不为true。
2026-03-10 21:40:09
366
原创 主从与分库
将一个节点的所有数据同步给其他节点。为什么同步所有数据?不能对数据分片,不同节点同步不同数据嘛?历史遗留性问题,早些年分布式技术未完善,基本上都选用主从架构同步所有数据。①主节点宕机,从节点切换成主节点。②数据备份,主节点数据损坏时,从节点中保存着完整数据。③读写分离,主写从读。①硬伤:木桶效应,一个主从集群中所有节点的容量,受限于存储容量最低的那台服务器。(加大硬件配置)②数据一致性问题:由于同步复制数据的过程是基于网络传输完成的,所以存在延迟性。
2026-03-09 10:16:10
400
原创 海量数据分库分表
如果数据库整体压力都很大,而导致的查询效率低下,那不管再怎么做分表也无济于事,毕竟连流量入口都出现了拥塞,自然分表也无法解决问题,所以分表操作只建立在单库压力不高,但是单表查询效率低下的情况适用。分库能最大程度上提升数据存储层性能,但应先考虑使用主从、主主方案,如果他们依旧不满足,再考虑垂直分库,按业务属性划分库结构,最后才应该考虑选择水平分库。为什么需遵循这个顺序?架构不能过度设计,主从、主主满足需求时,就选这两种,实现起来也比较简单。
2026-03-09 10:15:12
378
原创 日志与mysql调优
需要花费大量时间的查询。此语句是慢查询日志的开关,默认是关闭的:会去定位有问题的sql语句,从而进行sql语句的优化。用语句手动打开慢查询日志:规定如果sql语句超过了10秒中,就是一个慢查询。使用合适的索引:根据具体查询需求创建适当的索引,以提高查询速度。优化查询语句:通过分析查询语句,找出潜在的性能问题并进行优化。避免全表扫描:尽可能地利用索引来进行查询,避免对整个表进行扫描。配置合理的缓存:通过合理配置数据库的缓存参数来提高查询性能。
2026-03-08 22:48:56
387
原创 索引和事务
普通索引,唯一索引,主键索引,联合索引索引和数据存储在引擎层。会退化成链表会自动平衡,时间复杂度会一直在O(logn),但是还是二叉树。节点只能有2个子节点,所以树的层高会很高,每访问一个节点就会有一次磁盘操作,层高=磁盘IO次数(适用于读多写少)他们都是平衡多叉树。1、 B+树只有叶子节点存数据,非叶子节点只有索引,所以非叶子节点容纳更多键。树层高变低,I/O减少。2、B+树的查询效率更加稳定:每个查询都要查到叶子节点。3、B+树更便于遍历:B+树直接扫叶子结点进行查询。
2026-03-08 22:47:35
398
原创 执行流程及存储表空间
不存在此列”是在预处理阶段报出的错。MySql架构分为两层:Sever层(建立连接、分析和执行SQL)+存储引擎层(数据的存储和提取)
2026-03-07 22:02:14
226
原创 数据库基本操作
注册情况:在controller层就把传入的数据封装成一个javabean对象varchar用单引号:因为之后写sql语句不是在mysql中写,而是在java中写,所以不应该用双引号,应用单引号:可能会出现双引号匹配错误的问题,第一个双引号应该和最后一个双引号匹配,可能会匹配到蔬菜前面那个双引号要使用JDBC就必须导入他的jar包,想要管理哪种数据库就要下载哪个数据库的驱动,查询操作会查询出来一堆数据,这堆数据存的地方就是ResultSet。
2026-03-07 22:00:08
374
原创 软件设计模式
将所有类对象的创建都放到同一个工厂类中,反射这种机制能在程序运行的过程中,动态地加载类、创建对象,不需要事先在代码中写死要创建哪些对象。所以,不管是创建一个对象还是十个对象,BeansFactory 工厂类代码都是一样的。在userservice包中定义注册登录信息,现在需要增加一个删除用户信息,但是删除操作最好交给后台管理系统才安全,所以现在就把删除接口放到后台的service包中。将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。通知有两种方式,一种是推,一种是拉。
2026-03-06 21:05:03
331
原创 反射-注解
/ 只有一个属性:日志级别,//这个属性的名字value就是自己取的,之后自己去实现②在方法上使用注解:括号里没有值就使用默认的info级别@Service@LogLevel("DEBUG") // 使用DEBUG级别return "用户信息: " + userId;@LogLevel("ERROR") // 使用ERROR级别return "删除用户: " + userId;@LogLevel // 使用默认的INFO级别return "更新用户: " + userId;
2026-03-06 21:04:12
330
原创 集合,迭代器,泛型,红黑树
2、红黑树插入效率更高:红黑树用非严格的平衡换取增删节点时旋转次数的降低,任何不平衡都会在三次旋转内解决,红黑树不追求完全平衡,只要求部分达到平衡,降低对旋转要求,提高性能。理想情况下使用随机的哈希码,容器中节点分布在 hash 桶中的频率遵循泊松分布,按照泊松分布的计算公式计算出了桶中元素个数和冲突概率的对照表,可以看到链表中元素个数为8时的冲突概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据概率统计而选择的。桥方法的内部实现,就只是去调用我们自己重写的那两个方法。
2026-03-05 15:54:18
352
原创 tostring,clone,comparable,equals,hashcode
他是一个指示接口,它的作用是指示一个类支持克隆操作,如果一个类实现了 Cloneable,JVM 就允许调用 clone()方法,否则抛出 CloneNotSupportedException。重写前不同的对象就算内容完全相同,hashcode也不同,因为重写前的hashcode是基于对象的,而不是基于内容,所以要重写。hashcode如果不重写的话返回的就是一个jvm提供的伪随机数,重写后相同的值的hashcode相同,而不只是伪随机数。引用类型的对象本身存在堆中,引用(地址值)存储在栈中。
2026-03-04 20:22:21
339
原创 面向对象,深浅拷贝,创建对象方法
所有类都有一个共同父类-Object类,本类初始化之前都会先调用父类的无参构造方法,每一个构造方法的第一行都会默认有一个super()方法,这个是jvm给的,不写也有。(先调父类无参构造,后调子类构造)一个对象只能使用finalize一次,如果用了这个方法之后,对象又不需要被回收了,那么也不能再调用第二次了,所以就会产生问题,尽量不用这个方法。多个类中有很多重复代码,定义一个父类,将重复代码抽取到父类中,然后让这些类继承此父类,这些类就不需要写重复代码了,只要一继承,子类就可以直接使用父类中非私有成员。
2026-03-04 20:20:08
379
原创 数组,序列化,异常
使用场景:1.当不想把错误直接暴露给前端或想让前端从业务角度判断后端的异常2.或者Java提供的异常类型没有准确的表述业务上的含义的。
2026-03-03 12:45:28
582
原创 数据类型(String,缓存池)
用bigdecimal做金钱计算,像浮点数在计算机中都是用二进制表示的,像0.1这样的数在二进制中是无限循环小数,只能近似表示,导致误差,而且浮点数只能表示固定的精度(32或64),运算过程中可能会丢失精度,而且浮点数的表示范围有限,但bigdecimal是任意精度的十进制表示。为避免字符重复创建,故当需用字符串时,先去字符串池查看该字符串是否已存在,若存在,则可直接用,若不存在,初始化,并将该字符串放入字符串常量池。并发场景下,对资源进行写操作是不安全的,不可变对象不能被写,故保证了多线程安全。
2026-03-03 12:44:57
601
原创 特点,jdk,c++区别,1.8新特性
是指为自定义的类或数据类型定义操作符的行为,改变或扩展这些操作符的功能,使它们适用于用户定义的类型。java.util.Date和SimpleDateFormat线程不安全,而LocalDate和LocalTime不可变,线程安全,不可修改。之前用的java.util.Date月份从0开始,要+1使用,不方便,java.time.LocalDate月份和星期都改成了enum。),Stream API(对集合增强,支持链式操作,高效简洁处理数据流),接口中可以实现默认方法和静态方法,新时间日期API。
2026-03-02 11:54:29
544
原创 计算机网络层
TCP保活机制:定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。当源地址为私有ip时,会先将源地址转化成公有ip向外发出请求,当请求从外部返回时,目的地址也是公有地址,除非你设置端口转发,这个端口特指了某个私有地址,才会转发给这个私有地址。第一次请求会把查到的MAC地址缓存起来,有缓存期限。
2026-03-02 11:53:34
640
原创 计算机网络传输层
面向连接的意思是一定要经过类似于三次握手,建立连接才可以进行通信字节流的意思是传输的信息是没有边界的,像消息流、数据报就是有边界的。还有两个特点:TCP的可靠性原理:流量控制关注的是接收方的处理能力,拥塞控制关注的是整个网络的承载能力。
2026-03-01 22:47:26
592
原创 计算机网络应用层
POST请求产生2个数据包,这个区别点在于浏览器的请求机制,先发送请求头(会先做一些预处理,读取请求头,如果请求头有问题就可以直接返回错误响应),再发送请求体,因为GET没有请求体,所以就发送一个数据包,而POST包含请求体,所以发送两次数据包。http2.0丢包会阻塞所有请求的原因是,TCP是可靠传输,它保证数据都是按顺序到达,如果前面有一个请求丢包了,那么会一直尝试重传直到这个包重新到达,否则这个包后面的请求就会被阻塞住,直到丢失的包重传后到达。无连接,传输效率高,可快速响应,头部小,占用更少资源。
2026-03-01 22:46:33
667
原创 计算机网络模型
如网线类型,光纤接口类型,各种传输介质传输速率。由实物所承载。传输比特流(二进制),将比特流转为电流强弱传输,到达后再转化为比特流:模数转换。电流强为1,电流弱为0。
2026-02-28 20:26:20
572
原创 线程调度,页面置换,磁盘调度, 内存分配
内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小。分为连续式分配(分为固定分区分配和动态分区分配,要求把程序完整的,有序的存入内存)和非连续式分配(把程序按照一定规则拆分)。3.如果进程等待时间很长而运行时间很短,那周转时间(等待时间+运行时间)就很长,要避免长周转。最短剩余时间优先(①):按剩余运行时间顺序,新作业到达时与当前进程的剩余时间比较,更少就抢占。当访问位为0时就淘汰,新页面插入该位置,访问位置1,表针前移。
2026-02-28 20:25:29
523
原创 进程,线程,进程间通信
并发:同一时间段内,多个任务交替执行。通过时间片轮转方式,让多个任务看起来像是同时进行的。并行:多个任务同时在执行。它需要多个处理器或核心来同时处理多个任务。并发状态时,进程切换前要在PCB中保存进程的上下文.管理的意思就是描述+组织,比如进程就是PCB+链表组织。
2026-02-27 21:19:38
244
原创 内存管理,虚拟内存,分段页
内存和磁盘的区别:内存数据掉电会丢,内存离cpu更近,速度更快,容量比磁盘小。外部碎片:指在内存中存在许多空闲的内存块,但这些空闲块的大小不足以满足新的内存分配请求。即使总的空闲内存足够大,但由于它们分散在各个地方,无法连续分配给新的进程。内部碎片:操作系统通常会将内存分配成固定大小的块。当一个程序需要内存时,操作系统会分配一个大小大于程序实际需要的块。内存块中会有一些空间被浪费,这些浪费的空间就是内部碎片。
2026-02-27 21:19:05
250
原创 用户态和内核态,中断
当外围设备完成用户请求后,会向CPU发出中断信号,这时CPU会暂停将要执行的指令转而去执行与中断信号对应的处理程序,因为这个中断是硬件产生的,属于系统级别操作,所以会立马转换到内核态.程序大部分运行在用户态,但需要操作系统帮助完成某些它没有权力完成的工作时会切换到内核态(如操作硬件),用户程序运行在用户态,操作系统内核运行在内核态。另一部分中断不是由 CPU 直接触发,是因为需要响应外部的通知,比如响应键盘、鼠标等设备而触发的中断,或是磁盘IO完成,这种中断我们称为异步中断。硬件中断:硬件发出的中断信号。
2026-02-26 12:28:51
380
原创 计算机结构,cpu多级缓存架构
对于数据缓存:访问时要按照内存布局顺序访问对于指令缓存:要先排序再遍历,通过分支预测器把预测到的要执行的指令提前放入指令缓存多核cpu如何提升缓存命中率?
2026-02-26 12:27:36
641
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅