得过且过的勇者y
码龄12年
求更新 关注
提问 私信
  • 博客:504,949
    社区:65
    505,014
    总访问量
  • 139
    原创
  • 1,540
    粉丝
  • 74
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
目前就职: 阿里巴巴(中国)网络技术有限公司
加入CSDN时间: 2015-01-04

个人简介:万丈高楼平地起,勿在浮沙筑高台

博客简介:

qq_25046827的博客

查看详细资料
个人成就
  • 获得694次点赞
  • 内容获得228次评论
  • 获得6,650次收藏
  • 代码片获得6,095次分享
  • 博客总排名1,447,496名
创作历程
  • 3篇
    2025年
  • 1篇
    2024年
  • 63篇
    2023年
  • 32篇
    2022年
  • 41篇
    2021年
成就勋章
TA的专栏
  • java
    25篇
  • 深入理解Linux网络
    15篇
  • 深入理解MySQL
    20篇
  • 课程设计
    3篇
  • netty
    7篇
  • 后端
    29篇
  • springboot
    10篇
  • python
    5篇
  • 操作系统真相还原
    5篇
  • InnoDB存储引擎
    5篇
  • tcp/ip
    1篇
  • shiro
    3篇
  • 前端
    5篇
  • 运维
    3篇
  • oauth2
    1篇
  • http
    4篇
  • redis
    4篇
  • leetcode
    16篇

TA关注的专栏 9

TA关注的收藏夹 0

TA关注的社区 6

TA参与的活动 3

兴趣领域 设置
  • Java
    javatomcatspringspring bootjvm
  • 后端
    rabbitmqspring boot分布式中间件
创作活动更多

【多重好礼】鸿蒙心迹 · 开发录原创征稿活动

鸿蒙开发者的实战经验,值得被记录。从踩坑排查到项目复盘,从工具脚本到学习笔记,每一段真实的开发经历,都是社区最宝贵的技术资产。「鸿蒙心迹 · 开发录」正式启航,不限主题、随时可写,只要是鸿蒙开发相关的真实经验都欢迎投稿。 本活动为 [HarmonyOS 7.0 创新内容共创季](https://builderx.csdn.net/activity-site/harmonyos/activity2026)双轨征文之一,与[「共创季 · 稿事节」](https://harmonyosdev.csdn.net/6a97f0de2b83d06f0ecadec5.html)深度征文互补——「稿事节」写深度技术长文,「开发录」写日常开发实战笔记。 「开发录」每月一期,12月截止,本季共三期,投稿即有机会获得京东卡、CSDN博客流量券、亿万Token、社区定制周边好礼!

126人参与 去参加
  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

Java线程模型

Java程序在JVM上运行,JVM可以运行在不同的操作系统之上,不同的操作系统创建线程的方式是不同的,JVM通过对不同操作系统的原生线程进行抽象,屏蔽了底层不同操作系统的实现方式。(ULT):实现在用户空间的线程称为用户级线程。用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由用户空间的库函数完成,不需要内核的参与,也不需要进行用户态和内核态的切换,因此这种线程的。在内核的支持下运行,无论是用户进程的线程,或者是系统进程的线程,他们的创建、撤销、切换都是依靠内核实现的,但是。
原创
博文更新于 2026.02.24 ·
1549 阅读 ·
16 点赞 ·
1 评论 ·
15 收藏

Java安全点safepoint

安全点是指程序的某些特定的位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停。当程序执行某些特定的操作时需要避免其他线程的操作导致程序的状态不一致或不确定,因此此时会让应用程序产生停顿,这个停顿称为STW(Stop The World)。HotSpotVM使用安全点来实现STW,比如发生GC时,需要暂停所有活动线程,但是线程在这个时刻还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,等待GC结束。
原创
博文更新于 2025.06.08 ·
793 阅读 ·
17 点赞 ·
0 评论 ·
18 收藏

Java微基准测试工具JMH

JMH(Java MicroBenchmark Harness)是一个用于Java微基准测试的工具,能够有效控制JVM的预热和代码优化路径,确保测试结果的准确性。JMH通过多轮迭代、多进程测试等机制,避免JVM即时编译器对测试结果的干扰。使用JMH时,开发者可以通过Maven引入依赖,并利用注解如@Benchmark、@Warmup、@Measurement等配置测试环境。JMH还提供了多种性能剖析工具,如GCProfiler、StackProfiler等,帮助分析测试中的性能瓶颈。然而,使用JMH时需注意
原创
博文更新于 2025.05.18 ·
790 阅读 ·
16 点赞 ·
0 评论 ·
27 收藏

Java Agent 技术

Java Agent 是一种 JVM 插桩机制,允许在程序启动前或运行时修改和增强字节码。它通过 premain 和 agentmain 方法实现,分别用于程序启动前和运行时的代理。Java Agent 依赖于 Instrumentation 接口,提供了操作和监控 JVM 内部状态的能力,常用于调试、热部署等场景。代理 JAR 文件需在 MANIFEST.MF 中指定入口类和相关能力属性,如 Premain-Class 和 Agent-Class。Instrumentation 接口提供了类加载、字节码修
原创
博文更新于 2025.05.15 ·
531 阅读 ·
5 点赞 ·
0 评论 ·
6 收藏

Windows编程课设(C#)——基于WPF和.net的即时通讯系统(仿微信)

一款参考QQ、微信的即时通讯软件。采用CS结构,客户端基于.Net与WPF开发,服务端使用Java开发。
原创
博文更新于 2024.08.29 ·
1540 阅读 ·
0 点赞 ·
1 评论 ·
13 收藏

JSON和Protobuf序列化

因为像TCP和UDP这种底层协议只能发送字节流,因此当我们在开发一些远程过程调用(RPC)的程序时,需要将应用层的Java POJO对象序列化成字节流,数据接收端再反序列化成Java POJO对象。理论上对于性能要求不是太高的服务器程序可以选择JSON系列的序列化框架,而对于性能要求较高的服务器程序则应该选择传输效率更高的二进制序列化框架如Protobuf。
原创
博文更新于 2023.11.12 ·
2246 阅读 ·
3 点赞 ·
1 评论 ·
8 收藏

Netty编码器和解码器

OverrideSystem.out.println("解码出一个整数:" + i);@OverrideSystem.out.println("打印出一个整数:" + integer);使用上面的Byte2IngeterDecoder证书解码器需要先对ByteBuf的长度进行检查,如果有足够的字节,才进行整数的读取。这种长度的判断可以由Netty的ReplayingDecoder类来完成。
原创
博文更新于 2023.11.12 ·
1768 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

Netty底层原理

*每次发多少数据到网络中与当前网络的拥塞情况和服务端返回的TCP窗口的大小有关,涉及TCP的流量控制和拥塞控制,并且与Netty的反压有关。,它除了JDK自带的epoll模型的封装,还额外封装了一套,这两者都是epoll模型的封装,只是JDK的epoll模型是水平触发的,而Netty采用JNI重写的边缘触发。所谓背压,是进行流量控制的一种方案。TCP是面向字节流传输的协议,它把客户端提交的请求数据看作一连串的无结构的字节流,并不知道所传送的字节流的含义,也并不关心有多少数据流入TCP输出缓冲区中。
原创
博文更新于 2023.11.12 ·
1384 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

Reactor反应器模式

这种模式的优点是解决了前面的新连接被严重阻塞的问题,在一定程度上极大地提高了服务器的吞吐量。而且线程的反复创建、销毁、线程的切换也需要代价。这种方法最大的问题就是如果前一个网络连接的处理没有结束,那么后面的连接请求没法被接收,于是后面的请求统统会被阻塞住,服务器的吞吐量就太低了。在单线程反应器模式中,Reactor反应器和Handler处理器都执行在同一条线程上(dispatch方法是直接调用run方法,没有创建新的线程),因此当其中某个Handler阻塞时,会导致其他所有的Handler都得不到执行。
原创
博文更新于 2023.11.12 ·
711 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Netty基础入门和基本使用

这样就会导致一个结果@Sharable共享实例不是线程层面安全的,因此@Sharable共享的业务处理器,如果需要操作的数据不仅仅是局部变量,则需要进行线程的同步控制,以保证操作是线程层面安全的。出站处理用到的ByteBuf缓冲区一般是要发送的消息,通常由Handler业务处理器所申请而分配的,在每一个出站Handler业务处理器的处理完成后,最后数据包回来到出站的最后一棒HeadHandler,在数据输出完成后,ByteBuf会被释放一次,如果计数器为0,将被彻底释放掉。
原创
博文更新于 2023.11.12 ·
1704 阅读 ·
2 点赞 ·
1 评论 ·
9 收藏

Netty通道的容器属性Attribute

该方法的返回值为一个AttributeKey实例,它的泛型类型为实际上的key-value键值对中value的键值对中value的实际类型。可以通过AttributeMap的attr方法,根据key取得Attribute类型的value,然后根据value实例完成最终的两个重要操作:设置(set)和取值(get)。Netty中的Channel通道类,有类似于Map的容器功能,可以通过“key-value”键值对的形式来保存任何Java Object的值。
原创
博文更新于 2023.11.12 ·
917 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

Netty心跳检测

客户端的心跳检测对于任何长连接的应用来说,都是一个非常基础的功能。要理解心跳的重要性,首先需要从网络连接假死的现象说起。
原创
博文更新于 2023.11.12 ·
1365 阅读 ·
2 点赞 ·
0 评论 ·
1 收藏

Java线程池——Executor框架

这个类适当地扩展了AbstractQueuedSynchronizer,以简化获取和释放围绕每个任务执行的锁。这可以防止中断,这些中断旨在唤醒等待任务的工作线程,而不是中断正在运行的任务。我们实现了一个简单的不可重入互斥锁,而不是使用ReentrantLock,因为我们不希望工作任务在调用setCorePoolSize等池控制方法时能够重新获得锁。此外,为了在线程实际开始运行任务之前抑制中断,我们将锁状态初始化为负值,并在启动时(在runWorker中)清除它。
原创
博文更新于 2023.11.11 ·
2374 阅读 ·
1 点赞 ·
0 评论 ·
7 收藏

Java NIO三大核心组件

*因为外部设备的读写设计到操作系统的中断,引入缓冲区可以减少频繁地与设备之间的物理交换,操作系统会对内核缓冲区进行监控,等待缓冲区达到一定的数量的时候(由内核决定,用户程序无需关心),再进行IO设备的中断处理,集中执行物理设备的实际IO操作。NIO中一个连接就是用一个Channel(通道)来表示,一个通道可以表示一个底层的文件描述符,例如硬件设备、文件、网络连接等,除此之外Java NIO的通道还可以更加细化,例如对应不同的网络传输协议类型,在Java中都有不同的NIO Channel实现。
原创
博文更新于 2023.10.13 ·
588 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

x86的内存寻址方式

我们知道不同的进程之间看到的虚拟地址范围是一样的,所以多个进程下,不同进程的相同的虚拟地址可以映射不同的物理地址。即所有的段的基地址都是0,段长4G。所以说起来是分段,实际上等于没分了,再加上段的基地址全部是0,那进行地址翻译的时候,对于任何一个给定的逻辑地址,只需要看它的偏移量就可以知道它在内存中的位置,不需要去查找段描述符表和进行基址加偏移的运算。当进程需要内存时,从内核获得的仅仅是虚拟的内存区域,而不是实际的物理地址,进程并没有获得物理内存(物理页面),获得的仅仅是对一个新的线性地址区间的使用权。
原创
博文更新于 2023.08.27 ·
1171 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

CPU架构和指令集

地址总线的位数决定了CPU的寻址能力,它不一定和CPU位数相同,比如早期16位的CPU使用的是20位的地址总线,通过段地址的方式来实现20位的寻址。Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号兼容,主要有8086,8088(16位),80186,80286(过渡产品),80386,80486以及以后各种型号的Pentium芯片(32位CPU),通常所说的x86都是指32位CPU。x64是x86指令集的64位扩展,但它仍然兼容32位的x86指令集。
原创
博文更新于 2023.08.26 ·
1473 阅读 ·
1 点赞 ·
0 评论 ·
4 收藏

MySQL之深入InnoDB存储引擎——Undo页

TRX_UNDO_FSEG_HEADER:本UNDO页面链表对应的段的Segment Header信息(用于寻找INODE Entry)TRX_UNDO_PAGE_LIST:UNDO页面链表的基节点对于链表中的第一个页面,除了Undo Log Segment Header,在其下面还会有一个。
原创
博文更新于 2023.08.09 ·
802 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

MySQL之深入InnoDB存储引擎——redo日志

我们知道数据的修改首先是在Buffer Pool中进行的,之后再定时刷到磁盘中。那么如果在事务提交后还没刷新到磁盘中,系统就崩溃了,那么此时数据就丢失了,这就不满足事务的持久性了。而如果我们考虑每次提交之后,都同步将事务中所有的页面刷新到磁盘,这样确实可以保证持久性,但是我们只是希望这个提交的事务的修改不会丢失,即使崩溃在重启后也可能进行恢复,那么其实完全没有必要在每次提交的时候就将页面全部刷回去,**只需要对修改的内容简单的做一个记录就可以了**。
原创
博文更新于 2023.08.08 ·
1101 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

MySQL之深入InnoDB存储引擎——Buffer Pool

以这个算法为核心,InnoDB维护了一个LRU链表,如果页不在Buffer Pool中,在把该页从磁盘加载到Buffer Pool的时候,就把该缓冲页对应的控制块作为节点添加到LRU链表的头部,如果使用到链表中的某个页时也将其移动到链表头部。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中,在下一次读取相同的页时,首先判断该页是否存在缓冲池中,如果存在则被命中,直接读取,否则读取磁盘上的页。当从磁盘上读取到一个页时,我们需要将其放置在空闲的缓冲页中。
原创
博文更新于 2023.08.06 ·
711 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

MySQL查询执行计划详解(EXPLAIN)

如果被驱动表非常大,多次访问被驱动表可能导致很多次的磁盘IO(因为默认情况下是驱动表没找到一条记录就去查询被驱动表,如果被驱动表很大,那么可能会导致被驱动表前面引入的页面在后面被淘汰了,那么驱动表下一条记录进行连接时又要重新去磁盘中加载),因此引入join buffer,一次性读取多条驱动表记录放入其中。每个表都维护了一个变量,记录着对该表进行增删改的记录条数,**如果发生改动的记录数量超过了表大小的10%,并且自动重新计算统计数据的功能是打开的,那么服务器会重新计算一次统计数据。
原创
博文更新于 2023.08.06 ·
3503 阅读 ·
1 点赞 ·
0 评论 ·
7 收藏
加载更多