自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 Linux零拷贝解析

零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域(例:CPU拷贝数据从内核缓冲区到用户缓冲区),从而可以减少CPU上下文切换以及 CPU 的拷贝时间。

2022-11-19 17:51:19 1892 1

原创 Mybatis-Plus——分页+模糊查询

假如,我们有这样一种排序:全匹配显示在最前面,比如:孔。数据左半部分匹配,右边按字母排序,比如:孔1、孔2、孔技术。从中间开始匹配,比如:1孔、2孔。第2步和第3步,还要根据字符长度排序,字符短的排在前面,比如:孔1、2孔、1孔技术1

2022-11-16 22:51:14 5378

原创 Redis 实现限流策略

除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。对非法行为,业务必须规定适当的惩处策略。

2022-11-15 21:58:52 1816

原创 JVM线程安全

当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为(单次调用)都可以获得正确的结果,那就称这个对象是线程安全的。

2022-11-09 22:26:08 363

原创 Java&线程&协程

线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。

2022-11-08 22:58:20 1683

原创 Java内存模型

并发处理的广泛应用是Amdahl定律代替摩尔定律[1]成为计算机性能发展源动力的根本原因,也是 人类压榨计算机运算能力的最有力武器。

2022-11-08 18:09:59 624

原创 JVM后端编译与优化——编译器优化技术

·最重要的优化技术之一:方法内联。·最前沿的优化技术之一:逃逸分析。·语言无关的经典优化技术之一:公共子表达式消除。·语言相关的经典优化技术之一:数组边界检查消除。

2022-11-07 18:33:06 429

原创 后端编译与优化——提前编译

提前编译产品和对其的研究有着两条明显的分支:一条分支是做与传统C、C++编译器类似 的,在程序运行之前把程序代码编译成机器码的静态翻译工作;另外一条分支是把原本即时编译器在运行时要做的编译工作提前做好并保存下来,下次运行到这些代码(譬如公共库代码在被同一台机器 其他Java进程使用)时直接把它加载进来使用。

2022-11-07 16:44:27 354

原创 后端编译与优化(JIT,即时编译器)

Java程序最初都是通过解释器 (Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称为即时编译器。

2022-11-05 21:43:28 813

原创 前端编译与优化(Javac,语法糖)

编译期可能是指一个前端编译器(叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是 指Java虚拟机的即时编译器(常称JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器码的过程;还可能是指使用静态的提前编译器(常称AOT编译器,Ahead Of Time Compiler)直接把程序编译成与目标机器指令集相关的二进制代码的过程。

2022-11-04 22:30:46 322

原创 类加载及执行子系统的案例

在Class文件格式与执行引擎这部分里,用户的程序能直接参与的内容并不太多,Class文件以何种 格式存储,类型何时加载、如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行 为,用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能。

2022-11-03 23:29:29 155

原创 基于栈的字节码解释执行引擎

对于一门具体语言的实现来说, 词法、语法分析以至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。也可以选择。

2022-11-03 19:06:05 314

原创 虚拟机字节码执行引擎——动态类型语言支持

随着JDK 7的发布的字节码首位新成员——invokedynamic指令。这条新增加的指 令是JDK 7的项目目标:实现动态类型语言(Dynamically Typed Language)支持而进行的改进之一, 也是为JDK 8里可以顺利实现Lambda表达式而做的技术储备。

2022-11-03 18:29:36 308 1

原创 MySQL45讲(第40~44讲)

Simple Nested Loop Join 的性能问题

2022-11-02 00:24:27 321

原创 MySQL45讲(第36~40讲)

临时表与内存表的区别内存表,指的是使用Memory引擎的表,建表语法是create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。除了这两个特性看上去比较“奇怪”外,从其他的特征上看,它就是一个正常的表。而临时表,可以使用各种引擎类型 。如果是使用InnoDB引擎或者MyISAM引擎的临时表,写数据的时候是写到磁盘上的。当然,临时表也可以使用Memory引擎。

2022-11-01 22:44:34 231

原创 MySQL45讲(第31~35讲)

这个策略最大的收益,就是在扫描这个大表的过程中,虽然也用到了Buffer Pool,但是对young区域完全没有影响,从而保证了Buffer Pool响应正常业务的查询命中率由于客户端的性能问题,对数据库影响更严重的例子?这个问题的核心是,造成了“长事务”。至于长事务的影响,就要结合我们前面文章中提到的锁、MVCC的知识点了。

2022-10-31 22:26:23 487

原创 MySQL45讲(第26~30讲)

这时,如果实例X有从库,那么将CREATE TABLE和insert语句的binlog同步过去执行的话,执行事务之前就会先执行这两个SET命令, 这样被加入从库的GTID集合的,就是图中的这两个GTID。举个例子,一个事务更新了表t1和表t2中的各一行,如果这两条更新语句被分到不同worker的话,虽然最终的结果是主备一致的,但如果表t1执行完成的瞬间,备库上有一个查询,就会看到这个事务“更新了一半的结果”,破坏了事务逻辑的原子性。而且,由于所有线程都处于等待状态,此时占用的CPU却是0,而这明显不合理。

2022-10-29 22:33:30 317

原创 MySQL45讲(第22-25讲)

假设一个事务A执行到一半,已经写了一些redo log到buffer中,这时候有另外一个线程的事务B提交,如果innodb_flush_log_at_trx_commit设置的是1,那么按照这个参数的逻辑,事务B要把redo log buffer里的日志全部持久化到磁盘。如果把innodb_flush_log_at_trx_commit设置成1,那么redo log在prepare阶段就要持久化一次,因为有一个崩溃恢复逻辑是要依赖于prepare 的redo log,再加上binlog来恢复的。

2022-10-27 21:39:14 418

原创 虚拟机字节码执行引擎——方法调用

方法调用并不等同于方法中的代码被执行,暂时还未涉及方法内部的具体运行过程。Class文件的编译过程中不包含传统程序语言编译的连接步骤,,而不是方法在实际运行时内存布局中的入口地址(也就是之前说的直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂,某些调用需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。

2022-10-26 19:18:04 298

原创 虚拟机字节码执行引擎——运行时栈帧结构

虚拟机”是一个相对于“物理机”的概念,这两种机 器都有代码执行能力,其区别是,而,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。在不同的虚拟机实现中,执行引擎在执行字节码的 时候,通常会有两种选择,也可能两者兼备,还可能会有同时包含几个不同级别的即时编译器一起工作的执行引擎。但 从外观上来看,

2022-10-25 22:47:18 464

原创 MySQL45讲(第16-21讲)

“orderby”是怎么工作的?

2022-10-25 21:21:17 192

原创 JAVA_类与类加载器

类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节 流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为“类加载器”(Class Loader)。

2022-10-24 16:04:20 73

原创 MySQL45讲(第11-15讲)

当要给字符串创建前缀索引时,有什么方法能够确定我应该使用多长的前缀呢?实际上,我们在建立索引时关注的是区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。

2022-10-23 22:30:59 454

原创 MySQL45讲——第6~10讲

当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。有了这个功能,为什么还需要FTWRL呢?

2022-10-22 23:05:55 333

原创 Java类加载的过程

通过一个类的全限定名来获取定义此类的二进制字节流”这条规则,它并没有指明二 进制字节流必须得从某个Class文件中获取,确切地说是根本没有指明要从哪里获取、如何获取。

2022-10-21 23:02:25 306

原创 一个线程OOM后,其它线程还能运行吗?

当JVM资源利用出现问题时抛出,更具体地说,这个错误是由于JVM花费太长时间执行GC且只能回收很少的堆内存时抛出的。根据Oracle官方文档,默认情况下,如果Java进程花费98%以上的时间执行GC,并且每次只有不到2%的堆被恢复,则JVM抛出此错误。换句话说,这意味着我们的应用程序几乎耗尽了所有可用内存,垃圾收集器花了太长时间试图清理它,并多次失败。在这种情况下,用户会体验到应用程序响应非常缓慢,通常只需要几毫秒就能完成的某些操作,此时则需要更长的时间来完成,这是因为所有的CPU。

2022-10-21 16:50:04 1597

原创 Redis秒杀lua脚本

【代码】Redis秒杀lua脚本。

2022-10-20 21:35:12 364

原创 MySQL实战45讲(前5讲)

1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据2、最左前缀:联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

2022-10-20 20:55:10 1094 1

原创 JAVA字节码指令简介

Java虚拟机的指令由(称为,Opcode)(称为,Operand)构成。由于Java虚拟机采用而不是面向寄存器的架构,所以字节码指令集限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着;又由于,这就意味着虚拟机在处理那些超过一个字节的数据时,不得不在运行时从字节中重建出具体数据的结构譬如要将一个16位长度的无符号整数使用两个无符号字节存储起来(假设将它们命名为byte1和byte2),那它们的值应该是这样的:(byte1

2022-10-19 21:15:39 650

原创 Class类文件结构(JAVA8)

Java技术能够一直保持着非常良好的向后兼容性,Class文件结构的稳定功不可没,任何一门程序 语言能够获得商业上的成功,都不可能去做升级版本后,旧版本编译的产品就不再能够运行这种事 情。

2022-10-18 22:59:24 647

原创 虚拟机性能监控、故障处理工具

基础故障处理工具

2022-10-16 18:19:18 711

原创 JAVA选择合适的垃圾收集器+内存分配实战

目录低延迟垃圾收集器Shenandoah收集器ZGC收集器选择合适的垃圾收集器Epsilon收集器收集器的权衡虚拟机及垃圾收集器日志垃圾收集器参数总结 实战:内存分配与回收策略Shenandoah也是使用基于Region的堆内存布局,同样有着用于存放大对象的Humongous Region,默认的回收策略也同样是优先处理回收价值最大的Region……但在管理堆内存方面,它与G1至少有三个明显的不同之处,最重要的当然是支持并发的整理算法,G1的回收阶段是可以多线程并行的,但却不能与用户线程并发。其次,Shen

2022-10-15 21:02:10 664

原创 JAVA经典垃圾收集器与内存分配策略

如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己 (this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出“即将回收”的集合;如果对象这时候还没有逃脱,那基本上它就真的要被回收了。它的运行代价高昂,不确定性大,无法保证各个对象的调用顺序,如今已被官方明确声明为不推荐使用的语法。

2022-10-13 23:42:43 371

原创 进程间通信IPC

(1)管道是特殊类型的文件,在满足先入先出的原则条件下可以进行读写,但不能进行定位读写。(2)匿名管道是单向的,只能在有亲缘关系的进程间通信;有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。(3)**无名管道阻塞问题。

2022-10-13 21:32:51 406

原创 Java内存区域与内存溢出异常

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

2022-10-12 23:22:53 454

原创 RocketMQ

1、MQ简介MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生 产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。2、MQ用途限流削峰 :MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统 被压垮。异步解耦:上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。而异步调用则会解决这些问题。

2022-10-10 23:24:26 1103

原创 Zookeeper知识总结

Apache ZooKeeper 为分布式应用提供高效且可靠的分布式协调服务。在解决分布式数据一致性方面,ZK没有直接采用Paxos算法,而是采用了ZAB(ZooKeeper Atomic Broadcast)协议。ZK可以提供诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列等功能。「它具有以下特性:」「顺序一致性」:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 Zookeeper 中;「原子性」:要么所有应用,要么不应用;

2022-09-29 14:42:27 974

原创 RabbitMQ简易原理及使用

MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。⚫ MQ,消息队列,存储消息的中间件⚫ 分布式系统通信两种方式:直接远程调用(RPC) 和 借助第三方完成间接通信⚫ 发送方称为生产者,接收方称为消费者AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议 的一个开放标准,为面向消息的中间件设计。

2022-09-28 22:43:36 674

原创 Zookeeper——(failed to connect to zookeeper server)

Zookeeper 是一个分布式的、开源的分布式应用程序的协调服务。

2022-09-26 22:59:46 1601

原创 原子操作的实现原理

原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。

2022-09-23 17:14:54 189

空空如也

空空如也

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

TA关注的人

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