自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

避免专业名词,喜欢讲人话。

开发是座围城,但城外是一片荒凉,愿我们一起成长!

  • 博客(56)
  • 收藏
  • 关注

原创 令牌桶算法——流量控制和限流

令牌桶算法(Token Bucket Algorithm)是一种常用的流量控制和限流算法,广泛用于网络传输、API 限流、系统资源管理等场景中。它通过一个“桶”来模拟请求的处理能力,并以固定的速率往桶中放入令牌(token),只有拿到令牌的请求才能被处理。

2025-05-26 15:25:34 650 1

原创 《JVM第10课》内存溢出(OOM)排查过程

如上图,进来后如果本地有正在运行的 Java 进程,可以监控此进程,双击打开可以看到右侧也有类似于 jconsole 的监控界面。jmap 是 JDK 自带的一个命令行工具,主要用于打印出 Java 进程的内存快照,包括堆内存的详细信息、垃圾回收器信息等。jvisualvm 不仅可以监控正在运行的进程内存状况,也可以导入内存快照。我们都知道 Linux 中 ps 命令是用来查看进程的,jps 相当于是 java ps,是只查看 Java 进程的命令,在Windows和Linux上都可以。

2024-11-12 16:18:35 1996 1

原创 《JVM第9课》垃圾回收器

先来看一张图,串行代表两个垃圾回收器按顺序执行,并行代表同时执行。STW代表工作线程暂停,Stop The World的意思。-XX:+PrintCommandLineFlags,查看使用的垃圾收集器-XX:+UseSerialGC,指定使用Serial GC处理新生代,并且默认会使用Serial Old GC处理老年代-XX:+UseParNewGC,指定新生代使用ParNew GC,-XX:+UseConcMarkSweepGC,指定老年代使用CMS GC。

2024-11-12 16:03:35 793

原创 《JVM第8课》垃圾回收算法

它将内存空间分为两块,每次只使用一块,在进行垃圾回收时,会首先STW,然后遍历将可达对象复制到另外没有被使用的内存块中,然后再将当前内存块标记为可重用,后续再按相同的流程进行垃圾回收,两块内存交换着来。垃圾是指 JVM 中没有任何引用指向它的对象,如果不及时清理这些垃圾对象,那么它就会一直占用内存,如果垃圾对象越来越多,就会出现OOM了。可达性分析法会以GC Roots作为起始点,然后一层一层的去寻找引用的对象,被找到的对象就是存活对象,无法到达的对象就是垃圾对象。要判断对象是否是垃圾对象有两种方式,

2024-11-06 14:28:21 941

原创 《JVM第7课》堆区

堆是JVM中最重要的一块区域,JVM规范中规定所有的对象和数组都应该存放在堆中,在执行字节码指令时,会把创建的对象存入堆中,对象的引用地址存入虚拟机栈的栈帧中。不过当方法执行完之后,刚刚所创建的对象并不会立马被回收,也就是说对象并不会随着栈帧的消失而消失,而是要等JVM后台执行GC后,对象才会被回收。可以通过 -XX:NewRatio 参数来配置老年代和新生代的比例,默认为 -XX:NewRatio=2,表示新生代占1,老年代占2。默认情况下,-Xms等于物理内存大小/64,-Xmx等于物理内存大小/4。

2024-11-06 14:19:42 954

原创 《JVM第6课》本地方法栈

首先要知道什么是本地方法,本地方法并不是 JVM 自己的方法,也不是 jre 里面的方法,而是指那些操作系统自己的方法(如C/C++方法),它们在操作系统目录里。可以这么理解,本地方法就是计算机操作系统对外提供的方法,JVM 通过调用这些方法可以实现 Java 程序和计算机的交互。本地方法是Java程序中的一种特殊方法,其声明在Java代码中,但实现由非Java语言编写。通过本地方法,Java程序可以访问操作系统资源、优化性能、使用现有库和直接访问硬件设备。常见的实现方式包括JNI和JNA。

2024-10-31 09:50:53 1526

原创 《JVM第5课》虚拟机栈

Java虚拟机栈(Java Virtual Machine Stack,简称JVM栈,又称Java方法栈)是 JVM 运行时数据区的一部分,主要用于支持Java方法的执行。每当一个新线程被创建时,JVM就会为这个线程分配一个私有的方法栈,线程执行过程中每个方法调用都会创建一个新的栈帧(Stack Frame),而这些栈帧会被组织成的栈结构。

2024-10-31 09:42:53 596

原创 JVM结构图

JVM结构图,简单明了!!!

2024-10-30 10:02:08 661 2

原创 《JVM第4课》程序计数器

Java程序计数器(Program Counter Register)是Java虚拟机(JVM)运行数据区的一个组成部分。每个线程都有它自己的程序计数器,这部分内存用于存储该线程下一条要执行的字节码指令的地址。如果该方法为本地方法(Native Method),则程序计数器的值为未定义。

2024-10-30 09:56:20 498

原创 《JVM第3课》运行时数据区

可分为 5 个区域,分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。

2024-10-30 09:51:32 470

原创 《JVM第2课》类加载子系统(类加载器、双亲委派)

JVM 使用类加载器加载 class 文件,类加载器可分为引导类加载器和自定义类加载器两种。引导类加载器(Bootstrap ClassLoader),有时也被称作启动类加载器或者零类加载器(Null ClassLoader),是 Java 虚拟机中最基础的类加载器之一。它的主要职责是加载 Java 核心类库。自定义类加载器需要继承自 ClassLoader 类,JDK 默认提供了一些。比较重要的有两个,拓展类加载器(ExtClassLoader)和应用类加载器

2024-10-29 11:03:47 1437

原创 《JVM第1课》Java 跨平台原理

为什么源代码需要先编译成字节码呢?JVM为什么不直接翻译源代码呢?其实这里主要是出于性能的考虑,因为Java是高级编程语言,所谓高级就是更贴合人类的语言习惯,高级的代价就是更远离机器语言,从代码到机器语言这个转换过程变长导致效率低。先由编译器将源代码转换为一种简单的中间形式(即字节码),然后再由 JVM 来执行这个中间形式,是一个更为高效的设计方案。

2024-10-29 10:54:30 615

原创 Java序列化、反序列化、反序列化漏洞

Java 中序列化的意思是将运行时的对象转成可网络传输或者存储的字节流的过程。而反序列化正相反,是把字节流恢复成对象的过程。拿 Java 原生的反序列化举例,反序列化需要调用 ObjectInputStream#readObject() 方法,但是如果数据流的对象自己重写了 readObject(),那 Java 便会调用自己的这个 readObject() 方法,这就给了攻击者可乘之机,他们就能在自己的 readObject() 方法里写攻击代码。

2024-09-25 09:50:57 1185 1

原创 聚簇索引和非聚簇索引(一级索引和二级索引)

聚簇索引是根据主键构造的一颗B+树,叶子节点存储行数据,查找只需一次效率高;非聚簇索引叶子节点存的是主键的key,查询需要两次效率相对较低,但是可以创建多个。

2024-09-12 10:17:12 486 1

原创 布隆过滤器(Bloom Filter)原理+实战

布隆过滤器的作用是:可用来判断值 可能在集合中 和 绝对不在集合中。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(hash 函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率且删除困难。布隆过滤器的使用场景比较多,比如我们现在讲的防止缓存穿透、垃圾邮件的检测等。

2024-09-10 17:06:05 816

原创 18 Python如何操作文件?

通常使用内置的` open(文件路径, 模式, encoding="utf-8") `函数。- 文件路径:可以是相对路径或绝对路径。- 模式:(可选)决定了文件打开后如何处理文件。- encoding:(可选)编码方式。

2024-09-10 09:54:55 1198

原创 17 Python异常处理(捕获异常、抛出异常、自定义异常)

自定义异常通常是通过继承Python内置的异常类(如Exception或更具体的异常类)来实现的。抛出异常是用raise关键字实现的。passpasstry:class CustomError(Exception) : pass class MyError(CustomError) : pass try : raise MyError("This is a custom error message.") except MyError as e : print(f"捕获自定义MyError异常: {

2024-09-09 09:58:12 967

原创 16 Python的包以及import和from的使用

简单来说,from后面可以跟到包或者模块,import单独使用时后面只能跟到模块,搭配from使用时只能跟from差一级。

2024-09-09 09:53:29 398

原创 15 Python模块

本篇是 Python 系列教程第 15 篇,更多内容敬请访问我的 Python 合集一个模块其实就是一个文件(以.py结尾)。使用模块的好处是便于维护和重用代码。要创建一个模块,只需编写一个新的文本文件,保存为 .py 扩展名。

2024-09-06 10:25:15 877

原创 14 Python面向对象编程:反射

本篇是 Python 系列教程第 14 篇,更多内容敬请访问我的 Python 合集在Python中,“反射”通常指的是根据字符串查找并执行相关的类、方法或者属性的能力。Python提供了几个内置函数和语法特性来支持这种能力,比如getattr()setattr()hasattr()delattr()以及dir()等。这些功能使得程序可以在运行时动态地获取和设置对象的属性和方法,从而增强代码的灵活性。前面函数那一篇粗略的介绍了Python内置函数,也讲到了getattr()

2024-09-06 10:21:24 879

原创 13 Python面向对象编程:装饰器

本篇是 Python 系列教程第 13 篇,更多内容敬请访问我的 Python 合集Python 装饰器是一种强大的工具,用于修改或增强函数或方法的行为,而无需更改其源代码。装饰器本质上是一个接收函数作为参数的函数,并返回一个新的函数。装饰器的用途包括日志记录、性能测试、事务处理、缓存、权限校验等。

2024-09-05 09:53:47 775

原创 12 Python面向对象编程:运算符重载

知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面也定义一些特殊方法,使得调用这些方法能实现类对象的加减乘除。方法不是典型的运算符重载方法,但它确实是一种特殊的方法,用于定义对象的“官方”字符串表示形式。不是用来重载算术或比较运算符的,但它可以被认为是一种形式的“方法重载”,因为它允许你自定义对象如何被转换成字符串形式。在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。在这个例子中,我们定义了一个。

2024-09-05 09:51:29 754

原创 11 Python面向对象编程:三大特性,封装、继承、多态

用于表示属性或方法是内部使用的,但这实际上只是一个约定,不会阻止外部访问。通过改写属性名称来隐藏属性或方法,使它们在类的外部难以直接访问。其实,有一个骚操作,在对象的属性没有对外提供修改方法的情况下仍能修改属性值,那就是直接通过类名.__init__()

2024-09-03 09:48:18 700

原创 10 Python面向对象编程:类和对象以及和Java的对比

在Python中,你可以使用class关键字来定义一个类。例如,定义一个名为Person__init__方法是一个特殊的方法,称为构造器,用于初始化类的新实例。self参数代表类的实例本身,并且是类任何方法的第一个参数。类方法需要通过self来访问类属性。

2024-09-03 09:46:32 765

原创 9 Python函数、参数、作用域、内置函数、lambda表达式

在 Python 中,你可以使用def关键字来定义一个函数。# 函数体# ...: 函数的名称。parameters: 函数接受的参数列表。参数是可选的。return: 可选的关键字,用于返回函数的结果。如果没有显式返回值,默认返回None。# 调用函数print(sum) # 输出 8局部变量只在其定义的函数内部可见。全局变量在整个程序中可见。内嵌作用域允许内部函数访问外部函数的局部变量。内建作用域包含了 Python 的预定义内置函数和变量。

2024-09-02 10:07:04 3124 1

原创 8 Python基本数据结构(列表、元组、字典、集合)

本篇是 Python 系列教程第 8 篇,更多内容敬请访问我的 Python 合集Python 提供了几种内置的数据结构,这些数据结构可以帮助我们有效地组织和管理数据。

2024-09-02 10:05:35 340

原创 7 Python流程控制

本篇是 Python 系列教程第 7 篇,更多内容敬请访问我的 Python 专栏Python和Java一样,也有条件语句(if)、循环语句(for和while)以及跳转语句(break和continue。

2024-08-29 09:54:12 327

原创 6 Python运算符和表达式

本篇是 Python 系列教程第 6 篇,更多内容敬请访问我的 Python 专栏Python运算符和Java类似,但也有个别不同。Python表达式和Java的区别是Python表达式不用跟“;”结尾。

2024-08-29 09:52:30 513

原创 5 Python的变量、关键字、命名规则、基本数据类型及类型转换

在Python中定义变量非常简单,你只需要给变量赋值即可。Python会自动检测变量的数据类型。

2024-08-28 11:37:04 1899

原创 4 Python虚拟环境【详细解释】但【超级简单易懂!!!】

Python的虚拟环境一般存在于项目的根目录,其作用其实和Vue项目的node_modules文件夹差不多,存放一些本项目的依赖包。与node_modules不同的是node_modules只是用来存放外部依赖包,而Python虚拟环境还存放了可执行文件和Python解释器(即python.exe)。在了解虚拟环境之前,我们先来了解一下真实环境,Python真实环境包含以下内容Lib:一些包site-packages:安装的外部包标准库:Python预装的模块和包。

2024-08-28 11:33:59 1985 3

原创 3 Python开发工具:VSCode+插件

相比PyCharm,VSCode更加轻量,启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高亮效果。

2024-08-27 14:21:49 954

原创 2 Python开发工具:PyCharm的安装和使用

图中这句话的意思是PyCharm将在项目的.venv目录自动为我们创建虚拟环境,虚拟环境的作用是让不同的项目使用不同的Python解释器、第三方库等。对于我们学习Python来说,用虚拟环境不是必须的,有没有这个.venv目录都没关系。这样我们就创建了第一个Python文件,接下来我们尝试在控制台打印一句话“Hello Python!关于Python虚拟环境,我单独写了一篇文章,道友感兴趣的话可以查阅专栏里《Python虚拟环境介绍》一文。由此,我们就创建了第一个Python项目并成功运行我们的代码啦!

2024-08-27 14:20:14 798

原创 Python 基础学习路线图【有PDF版】

曾经,学习对我来说就像一场匆匆的旅行——沿途的风景虽美,但转瞬即逝。除了那些在工作中反复磨练的技能,大多数知识仿佛过客般匆匆离去。尽管日复一日地忙碌着,每当被问及“你究竟学到了什么?”时,脑海中却一片空白。归其原因还是因为学习的内容比较杂乱,没有梳理知识点、形成知识框架。正好这段时间在学习已经被小学生都玩坏了的Python。所以我决定,把学过的知识用自己的语言描述出来,成体系、成框架的做一套教程。于是,我决定边学边记录,让这段旅程不再只是短暂的记忆,而是实实在在的成长。或许你会问:“已经有那么多现成

2024-08-26 13:06:52 667 4

原创 1 安装 Python

说不定之前安装过,查看已安装Python版本命令python - V。

2024-08-26 13:02:38 276

原创 SpringBoot如何配置动态数据源?原理+实战

若没空探究原理可直接跳转到“实现方式:注解+切面”目录数据源切换方法Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map。当JDBC操作数据库之时,会根据不同的key值选择不同的数据源。而这个key值可以放到方法的注解里。所以切换数据源的思路就是让JDBC在获取数据源时根据key获取到要切换的数据源。JDBC提供了AbstractRoutingDataSource抽象类,类名意思是数据源路由,该类提供了一个抽

2024-08-18 23:55:51 2765 3

原创 删除maven仓库里的垃圾文件

我们在使用Maven更新版本依赖的时候,经常因为网速的原因,未下载完成而导致产生垃圾文件(xxx.lastUpdated)。首先在桌面创建一个.txt文件,然后把后缀改成.bat。最后双击.bat执行就OK啦~换成你的maven仓库路径。

2024-08-16 15:13:07 426

原创 10W数据导入该如何与库中数据去重?

在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表。1. 先把新数据插入到临时表里,临时表结构和原始表一致。2. 用SQL的方式把不重复的数据DataA查询出来。3. 把DataA插入到原始表里。第2步有两种方式,一种是用 not exists 的方式第二种方式是用 left join

2024-08-16 13:04:28 680

原创 尝试问AI:什么是AIGC?

Q:介绍一下什么是AIGCA:AIGC,全称为Artificial Intelligence Generated Content(人工智能生成内容),是一种利用人工智能技术自动创造各种形式内容的方法。AIGC的出现标志着人工智能从1.0时代进入了2.0时代,它结合了多种AI技术,包括但不限于生成对抗网络(GANs)、CLIP模型、Transformer架构、扩散模型(Diffusion Models)、预训练模型以及多模态技术,这些技术的融合使得AI不仅能够理解和处理数据,还能创造出新的、原创的内容。

2024-08-14 18:14:36 1415 1

原创 SpringBoot 整合线程池如此简单

分为三步1. 启动类加 [@EnableAsync ]() 注解 2. 在方法上加 [@Async ]() 注解 3. 创建线程池配置类

2024-08-14 10:30:29 422

原创 Java栈溢出|内存泄漏|内存溢出

一个线程每执行到一个方法,JVM就会创建一个栈帧(用于存储基本数据类型、对象指针和返回值等),并将栈帧压入栈中。一旦递归过深,线程栈的容量增长超过了允许的栈容量,就会抛出StackOverflowError(栈溢出) 错误。在实际开发中,默认的线程栈大小通常已经足够满足需求,只有在遇到线程栈溢出错误时才需要考虑调整大小。Java线程栈默认大小是由操作系统决定的,一般为1MB或2MB。如果需要调整线程栈的大小,可以使用。Java虚拟机栈是线程私有的,它的生命周期和线程同步。

2024-08-13 15:25:43 523

Eclipse Memory Analyzer1.11 (JDK8)

Eclipse Memory Analyzer1.11 官方下载,适用于JDK8。 加压后直接点击MemoryAnalyzer.exe,不用安装。

2024-11-11

生日快乐祝福网页html+css+js源码,可直接运行,文案图片音乐皆可替换

生日快乐祝福网页html+css+js源码,可直接运行,文案图片音乐皆可替换 适合在女朋友或者兄弟生日或者其他节日时给他们一个程序员式的惊喜。如果你自己有服务器当然上传到服务器让女朋友访问网址更好,没服务器直接把源码发给她也能运行。 替换须知 1.用户名和密码在js/jquery-1.8.4.min.js里 2.欢迎文案在js/indexl.js里 3.回忆文案在html/Memories.html里 4.回忆图片在img目录下 5.最后的立方体六个面的图片在images目录下,替换注意名称要改成和默认的一致 6.BGM在music目录里,替换掉默认的后,名称需要和默认的一样

2024-06-28

程序员情书exe程序(会跳动的爱心,已打包成exe,windows可直接运行)

爱心代码,源码为python。已打包成exe,图标也改成了好看的情书样式,windows电脑可直接运行。适合撩小女生哦!

2024-05-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除