Java垃圾回收
复习一下:垃圾回收主要发生在 JVM 堆,也就是堆内存。堆内存和方法区共同组成线程共享区域,其中 方法区 主要存放 类的元数据,堆 主要存放 对象实例。方法区在 JDK 1.8 之后对应的是元空间(Metaspace),它位于本地内存中,不再直接受传统 JVM 堆大小的限制,但依然会受到机器总内存的约束。
类和对象的创建过程?线程私有区域有哪些?分别有什么用?
JVM 堆主要存放对象。从分代视角来看,堆通常分为新生代和老年代;如果放到 JDK 1.8 之前的语境里,还会提到永久代,这里暂时不展开。新生代内部又会继续拆成 Eden 区和两个 Survivor 区(通常记作 S0、S1 或 From、To)。
分代回收机制_3代之所以要做分代,是因为不同对象的生命周期差别很大。大多数对象“朝生夕死”,少量对象会长期存活,因此把它们放在不同区域、采用不同算法,回收效率会更高。
Minor GC / Young GC:当 Eden 区放不下新创建的对象时触发,主要负责新生代回收。Minor GC 一般采用标记-复制算法,因为新生代里大部分对象都活不久,适合直接把少量存活对象复制 ...
Java 并发与多线程
乐观锁和悲观锁悲观锁悲观锁的核心思想是:先假设冲突一定会发生,因此在访问共享资源前先把资源“锁住”。它更适合写操作频繁、冲突概率高的场景,可以避免大量重试带来的性能损耗。
synchronizedsynchronized 是 Java 内置的监视器锁,使用方式主要有三种。
修饰实例方法:锁的是当前对象实例,同一时刻同一个对象只能有一个线程执行该同步实例方法。
1public synchronized void decrement() {}
修饰静态方法:锁的是当前类对应的 Class 对象,同一时刻只能有一个线程执行该类的同步静态方法。
1public static synchronized void incrementStatic() {}
修饰代码块:锁的粒度更细,可以显式指定锁对象,通常比直接锁整个方法更灵活。
1234567891011121314151617181920class BlockCounter { private int count = 0; private final Object l ...
Spring相关
什么是 Spring 和 SpringBootSpring 是什么Spring Framework 是很多模块的集合,使用这些模块可以很方便地协助我们进行开发;核心功能是 IoC 和 AOP。下图是 Spring 中各个模块之间的依赖关系。需要大概知道一些模块是干嘛的。
Core Container:基础模块,包含spring-core、spring-beans等
Data Access/Integration:数据访问模块,包含spring-jdbc、spring-orm等
Spring Web:网络部分,包含spring-webmvc、spring-websocket等等
Spring BootSpringBoot是用来快速开发Spring应用的一个脚手架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程;
SpringBoot提供了很多内置的Starter(⼀系列依赖关系的集合)结合自动配置,对主流框架如 Redis MySQL无需配置或开箱即用;
SpringBoot简化了开发,采用JavaConfig的方式可以使用零xml的方式进行开发,配置即 ...
JVM内存区域
总览谈 JVM 内存区域时,最好先区分两个视角:
JVM 规范视角:关注的是运行时数据区有哪些逻辑区域,包括程序计数器、虚拟机栈、本地方法栈、堆、方法区。
HotSpot 实现视角:关注这些逻辑区域在具体虚拟机里是如何落地的。比如 JDK 8 之后,HotSpot 使用 元空间(Metaspace) 来实现方法区;元空间位于 本地内存,而不是 Java 堆中。
因此,平时常说的“JVM 内存”,通常指的是 JVM 运行时会使用到的内存区域;但如果继续深挖,就要分清楚哪些是 规范定义的逻辑区域,哪些是 HotSpot 的具体实现。
可以先用一张表把关系理顺:
区域
线程私有 / 共享
是否属于 JVM 规范中的运行时数据区
说明
程序计数器
线程私有
是
记录当前线程下一条将执行的字节码指令地址
Java 虚拟机栈
线程私有
是
保存 Java 方法调用对应的栈帧
本地方法栈
线程私有
是
为 Native 方法服务
堆
线程共享
是
存放对象实例的主要区域,也是 GC 的核心区域
方法区
线程共享
是
存放类元信息、运行时常量池等
元空间 ...
Hadoop, Hive, Spark的关系详解
概念梳理参考Gemini:https://g.co/gemini/share/749bc1f75063
1. Hadoop
主要包含三部分:
1.1. HDFS即Hadoop Distributed FileSystem分布式文件系统,将大文件分割成小块并分发到集群的多个节点上。用户存取数据都是和单机一样的操作流程,但实际上这些数据都是在多台单机上存储的,即屏蔽了底层的分布式实现。
1.2. MapReduce单机之间的协同计算。Hadoop 早期主要的分布式计算模型,用于批处理任务。它将计算任务分解为 Map(映射)和 Reduce(规约)两个阶段。
MapReduce程序的代码比较复杂,需要自行编写,非常麻烦。因此出现了Hive和Pig等工具,而后续Hadoop的MapReduce部分就基本不用了,更多用的是它的HDFS文件系统。
1.3. YARN即ResourceManager,资源管理器。负责集群资源的调度和管理,包括 CPU、内存等。它使得不同的应用程序(如 MapReduce、Spark、Hive 等)可以共享同一个 Hadoop 集群的资源。
这个感觉不一定要划分为Ha ...
K8S部署主从复制MySQL和哨兵Redis
前置准备首先配置好K8S,并能保证节点之间的通信,可能需要配置网络插件,例如flannel,确保单机跑多副本的nginx是没问题的。
总共大约4步:
配置NFS
helm更换镜像
配置NFS123456> sudo apt update && sudo apt install nfs-kernel-server -y> sudo mkdir -p /mnt/nfs_share # 自定义你要共享的目录> sudo chown nobody:nogroup /mnt/nfs_share && sudo chmod 777 /mnt/nfs_share # 设置权限> vim /etc/exports # 编辑配置,添加在文件最后添加 /mnt/nfs_share *(rw,sync,no_subtree_check)> sudo exportfs -a # 导出配置> sudo systemctl restart nfs-kernel-server # 重启NFS服务
可以在另一台服务器上测试一下
1234567 ...
SQL调优
SQL浅复习增(Create)注意INTO和VALUES关键字
12345678-- 指定字段插入多条数据INSERT INTO `user` (username, age, email) VALUES ('李四', 30, 'lisi@example.com'),('王五', 28, 'wangwu@example.com');-- 不指定字段插入单条数据INSERT INTO `user` VALUES (NULL, '赵六', 22, 'zhaoliu@example.com', NULL);
删(Delete)注意FROM关键字
1DELETE FROM `user` WHERE username = '赵六';
改(Update)注意SET关键字
1UPDATE `user` SET age = 31, email = 'lisi_new@example.com' WHERE id = 2;
查(Read)查的方 ...
计算机网络学习笔记
本文是在阅读JavaGuide关于计算机网络相关内容时的个人整理;
请移步:https://javaguide.cn
OSI七层模型很清晰、理论完整,但是太复杂且不适用,所以更多使用tcp/ip协议
应用层:为用户提供了与网络进行交互的接口;
表示层:进行一些数据处理,例如加密解密、编码解码、压缩和解压缩
会话层:管理应用程序之间的会话
传输层:为会话之间的通信提供可靠的数据传输
网络层:IP数据包在传输时的路由和寻址
链路层:对数据帧进行编码、对传输的误差进行纠正
物理层:传输比特流数据
TCP/IP四层模型应用层应用层:以报文为数据单元,为用户应用程序提供网络服务接口
常见协议:
基于TCP:
HTTP协议(HTTPs):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,为 Web 浏览器与 Web 服务器之间的通信而设计的
Websocket协议:客户端和服务端可以同时发送或接收,基于 TCP 连接的全双工通信,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性
SMTP协议(简单邮件传输(发送)协议)、IMAP/ ...
MySQL学习笔记
本文是在阅读JavaGuide关于MySQL相关内容时的个人整理;
请移步:https://javaguide.cn
三大日志MySQL 里常说的“三大日志”是 redo log、binlog 和 undo log。把它们放到一次更新里看,会更容易理清关系:
先把旧值相关信息写入 undo log,为回滚做准备,此时 undo log的 redo log 会写入 redo log buffer;
再修改内存中的数据页,也就是 Buffer Pool 里的页,这时会产生脏页;
同时把这次物理修改写入 redo log buffer;
事务提交时,再把 binlog 写好,并完成 redo log 的提交流程;
脏页本身不一定在提交时立刻刷回数据文件,而是由后台线程择机刷盘。
所以可以把三者粗略理解成:
redo log:负责把“已经做过、但还没落到数据文件里的修改”补回来,核心对应持久性;
undo log:负责把“不该保留的修改”撤销掉,核心对应原子性;
binlog:负责记录逻辑变更,用于主从复制,也参与判断事务是否真正提交成功。
更新时的日志和数据页MySQL 查询数据 ...
Redis学习笔记
本文是在阅读 JavaGuide 关于 Redis 的内容后做的个人整理;
请移步:https://javaguide.cn
核心知识点可以看这篇文章的总结:https://juejin.cn/post/7525640395234230326#heading-4
基本数据类型8种基本的5种
String(字符串),使用SDS,即Redis自己构建的简单动态字符串来实现;
List(列表),用的是双向链表,支持反向查找,可以用于实现消息队列;
Hash(散列),键的值是键值对,可以用于存储对象,实现类似Java的HashMap;
Set(集合),无序结构且无重复,支持交并差集的运算,可用于共同关注、粉丝等功能;用整数集合或哈希表实现(元素为整数且数量较少时用Set)
Zset(有序集合),跳表实现,针对Set中每个元素增加一个权重参数score,根据这个参数有序排列;可以根据score范围获取元素列表,可以用于实现排行榜
特殊的3种
Bitmap (位图)
HyperLogLog(基数统计)
Geospatial (地理位置)
底层数据类型8种1. 简单动态字符串SDS1234 ...










