欢迎来到我的博客 😀

Welcome to my blog!

 

本站其他资源MySQL是怎样运行的👍,Linux命令速查

提示:本站采用国外的对象存储服务,若出现加载异常,请尝试切换网络环境 👾

 

网站很久没更了,不是开摆了,是语雀🐦写笔记比这玩意好用🥲

探究 ThreadLocal 原理

1、ThreadLocal 的基本原理 ThreadLocal 的 set(T value) 方法,会将 value 保存在 Thread 类的 ThreadLocalMap…

MySQL 性能分析

1、查询执行频次 数据库优化需要有针对性,通过查询执行频次,可以了解该数据库的执行特点(是查询多,还是增删改比较多) -- 查询执行频次 show session/global status like 'com_______' -- (7个空格) variavle_name…

SpringCloud 服务保护 & 分布式事务

书接上回:SpringCloud 微服务 微服务调用链路中的某个服务故障,导致整个链路中的所有微服务都不可用。 如图所示:购物车服务调用商品服务,若商品服务出现了宕机或者处理速度太慢(单个请求要好几秒),就会出现商品服务上级资源得不到释放,使得上级的 Tomcat 线程资源被耗尽。在多级服务相互调用的情况下,这种阻塞的问题会不断向上传递,进而产生雪崩问题: ① 雪崩问题产生的原因是什么? ② 解决问题的思路有哪些? ① 请求限流:限制访问微服务请求的并发量,避免服务因流量激增出现故障。…

IDEA 宝藏快捷键记录

快捷键 描述 Ctrl+H 查看选中接口/类的实现类/子类 Ctrl+Alt+B 查看选中抽象方法的实现 Ctrl+Shift+M 快速提取一段代码为方法(代码重构) Ctrl+Shift+T 创建类的单元测试 Ctrl+Alt+F7 查看选中方法被哪里使用了…

Java 动态代理技术

动态代理技术主要有两种实现:JDK、CGLib 特点:无侵入式地给代码增加额外的功能 特点:需要被代理对象是某个接口的实现类 实现核心:新建代理对象Proxy.newProxyInstance(),这是一个静态方法 获取某个对象的接口还可以通过:obj.getClass().getInterfaces() ① 定义接口(包含多个方法) interface Subject { void sayHello(String…

Spring 零碎知识记录

1、SpringBoot 自动装配 1.1 普通Bean的扫描(非自动配置类) Spring Boot中与启动类不同包的普通组件(如Controller、Service等)的扫描,并不需要依赖spring.factories文件。这类组件的扫描规则与自动配置类无关。可以使用如下方法扫描普通 Bean 旧版本(Spring Boot 2.7之前): 自动配置类通过在META-INF/spring.factories文件中配置org.springframework.boot.autoconfigure.EnableAutoConfiguration键值来实现。 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\…

SpringCloud

SpringCloud 微服务

特别鸣谢:黑马程序员 — 虎哥《SpringCloud微服务开发与实战》课程 Note:学完之后记得参考 RuoYi-Cloud 的思路 服务治理中的三个角色分别是什么? 消费者如何知道提供者的地址? 消费者如何得知服务状态变更? 当服务提供者有多个实例时,消费者应该选择哪一个? 负载均衡方式:随机、轮询、加权轮询、哈希 Nacos…

Linux 知识记录

1、基本的Linux命令 # 显示当前所在的目录路径 pwd # 列出当前目录下所有文件 ls # 查看所有文件(包含隐藏文件) ls -a #…

Docker 学习笔记

一、快速开始 以快速启动一个 MySQL 的 Docker 容器为例: docker run -d \ --name mysql…

Java 零碎知识点记录

1、throw 和 throws 的区别 特性 throw throws 作用 主动抛出异常对象 声明方法可能抛出的异常类型 使用位置 在方法体内部(代码块中)…

MyBatis-Plus 学习笔记

特别鸣谢:黑马程序员 — 虎哥《SpringCloud微服务开发与实战》课程 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ② 继承 BaseMapper<T> package…

RabbitMQ

一、基于Queue的消息发送与接收 1、引入 Spring AMQP 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2、消息发送: rabbitTemplate.convertAndSend(String routingKey,…

JVM — Garbage Collection

一、如何判断对象可以回收 1、引用计数法(Reference Counting) 引用计数法是最简单的一种内存回收判断方式。其基本原理是:给对象添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1;当引用计数为0时,说明该对象不再被任何变量引用,可以被回收。 缺点:无法处理循环引用,即两个对象互相引用,即使它们不再被程序访问,但计数始终不为0,无法回收。 如下图,即使两个对象没有被使用,但两个对象的引用计数始终为1。 可达性分析法,是主流 JVM(如 HotSpot)采用的方式。其基本思想是:通过一系列称为“GC Roots”的对象(肯定不能作为垃圾被回收的对象)作为起点,扫描堆中所有的对象,凡是被 GC Roots…

JVM 调优

一、StringTable调优 1、修改虚拟机参数(StringTable桶个数) 对于读取大量string到内存的情况(例如读取一个存放弱密码的字典),通过StringTable调优,可以显著提升性能。 # 设置Bucket大小(StringTable底层是哈希表, # 当出现哈希冲突时,用链表解决。Bucket是指用到的数组长度) -XX:StringTableSize=10240 # 值越大,哈希冲突几率越小,形成链表概率更低,速度更快 # 若想查看配置是否生效,可以使用:…

JVM 内存诊断

1、jmap命令 # 显示堆内存的配置(初始/最大大小、各代内存分配)和实时使用情况。 jmap -heap <pid> 查看实时的堆内存占用情况 位置:在jdk/bin目录下(jdk 9 以后不再集成,需单独下载) 查看堆内存占用的具体情况:连接进程 ->…

JVM 参数设置

堆内存 -Xss #设置栈大小 栈空间不足时对应 java.lang.StackOverFlow 栈内存 -Xms #最小堆内存 -Xmx #最大堆内存 堆空间不足时对应 java.lang.OutOfMemory…

JVM 线程诊断

1、CPU占用过高 # 1、定位哪个线程占用较高(查看pid) top # 2、进一步定位哪个线程引起的CPU占用过高 ps H -eo pid,tid,%cpu | grep…

Redisson 可重入锁原理

获取锁: Redisson 获取锁源代码: return evalWriteAsync(getName(), LongCodec.INSTANCE, command, "if (redis.call('exists', KEYS[1]) == 0)…

场景手撕题——待完成

1、手写线程池(实现一个简易线程池) 2、生产者-消费者模型:例如一个厨子4s生产一个,一个客人10s消费一个 3、单例模式:懒汉,饿汉,双重校验锁 4、动态代理 5、手写一个HashMap,HashSet 6、有一个0-4的随机器rand4,如何实现0-6的随机器rand6,概率相同。拓展:rand X = func(rand Y),实现func函数 7、判断今天星期几 import…

concurrency

多线程交替打印:A B C 循环

这是一个多线程任务中的:依次执行问题 方式一:LockSupport package com.chstack.learning.concurrent.abc; import java.util.concurrent.locks.LockSupport; public class LockSuppABC { static Thread…

秒杀

秒杀场景下存在的问题

1、超卖问题 问题描述:在库存为100的情况下,使用jmeter并发抢购200单,后端逻辑: SeckillVoucher voucher = seckillVoucherService.getById(voucherId); // 4、库存是否充足 if (voucher.getStock() < 1)…

JUC Lock

读写锁 ReadWriteLock

ReadWriteLock 的作用 ReadWriteLock 是 Java 提供的一种读写锁机制,用于优化多线程环境下对共享资源的访问性能。其核心思想是: 适用场景: package com.chstack.learning.concurrent.lock; import java.util.HashMap; import…

concurrency

线程池 ThreadPool

池化技术:为了优化资源的使用(线程池、连接池、对象池...)

优点:防止频繁创建和销毁线程,实现了线程复用,提高了响应速度,方便管理线程

Java 泛型详解

Java 泛型(Generics)是 Java 5 引入的一个重要特性,它允许在类、接口和方法中使用类型参数。泛型的主要目的是提高代码的类型安全性和复用性,同时减少强制类型转换的需求。

Java interface 中的 default 关键字

default关键字在Java中用于接口中的方法定义,并不是访问修饰符。它允许你在接口中提供方法的默认实现。这意味着,如果一个类实现了这个接口,但没有提供该方法的具体实现,那么这个类可以直接使用接口中提供的默认实现。

concurrency

JUC Condition

在Java中,Condition 接口是与 Lock 配合使用的一个重要工具,它提供了类似于传统同步代码块(通过 synchronized 关键字)中的 wait()notify()notifyAll() 方法的功能,但更加灵活和强大。Condition 对象必须与一个 Lock 对象关联,这使得它们可以提供更细粒度的锁定控制。

Java 多线程中的 this 逃逸问题

在Java中,this关键字表示当前对象的引用,但在某些情况下,不当使用this可能会导致“this逃逸”问题。this逃逸指的是在对象的构造过程中,this引用被提前泄露,使得未完全构造的对象被外部访问,从而可能导致不可预测的行为或错误。

详解 JVM 执行引擎

Java虚拟机(JVM)的执行引擎是JVM的核心组件之一,负责执行字节码指令。它将编译后的Java字节码转换为机器码并执行,从而实现Java程序的运行。以下是关于JVM执行引擎的详细解释,包括其主要组成部分和工作原理。

Java 常见类型的默认值

在Java中,变量分为基本类型引用类型。每种类型的变量都有其默认值,这些默认值是在声明变量但未显式初始化时自动赋予的。以下是Java中常见的基本类型和引用类型的默认值总结:

详解 Java ClassLoader

Java类加载器子系统负责在运行时动态加载、链接和初始化类。这个过程使得Java应用程序能够在运行时动态地发现并使用新的类,而不需要在编译时就确定所有依赖关系。以下是类加载器子系统的三个主要功能:加载链接初始化的详细解释。

类加载过程对应的JVM内存位置

在Java中,类加载过程的每一步都涉及到不同的内存区域。Java内存模型主要分为以下几个部分:方法区(Method Area)、堆(Heap)、栈(Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。以下是类加载过程中每个步骤涉及的具体内存区域: 加载阶段涉及将类的字节码读入内存,并生成相应的Class对象。具体来说: 方法区(Method Area): 堆(Heap): 在Java和计算机科学的上下文中,metadata (元数据)是描述其他数据的数据。…

JVM的内存结构

Java虚拟机(JVM)的内存结构是其运行时数据区域的划分,这些区域用于存储程序运行时所需的各种数据。下面是对JVM内存结构各个部分的详细解释:

LaTeX 引入 subcaption 导致表格标题错乱

Latex 引入 subcaption 导致表格标题错乱时,在加载 subcaption 包后,使用以下代码设置一下即可 \usepackage{subcaption} % 后加载 subcaption 包 \captionsetup[table]{name={TABLE},labelsep=newline,font=sc}

Java 中的基本类型和包装类型的区别

1. 存储方式 基本类型:直接存储值,并且它们的大小是固定的(例如,int 占用4个字节)。 包装类型:作为对象存在,除了存储实际的数据外,还包括对象头等额外信息,因此会占用更多的内存空间。 2. 默认值 基本类型:有固定的默认值。例如,int 的默认值为 0,boolean 的默认值为 false。 包装类型:默认值为 null,因为它们本质上是指向对象的引用。 3. 功能 基本类型:提供的操作有限,主要支持算术运算、比较等基础操作。 包装类型:提供了丰富的类方法,如转换字符串、数值比较等。此外,它们可以使用面向对象的功能,比如继承和多态。 4. 集合框架 基本类型:不能直接存储在集合类(如 ArrayList, HashMap)中,因为这些集合只能存储对象。 包装类型:可以直接存储在集合类中,因为它们本身就是对象。…