自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL基础

最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。比如表缓存,记录缓存,key缓存,权限缓存等。存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

2024-02-26 19:58:59 227

原创 第四章 RocketMQ 应用

Producer 对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。同步发送消息是指,Producer 发出一条消息后,会在收到 MQ 返回的 ACK 之后才发下一条消息。该方式的消息可靠性最高,但消息发送效率太低。异步发送消息是指,Producer 发出消息后无需等待 MQ 返回 ACK,直接发送下一条消息。该方式的消息可靠性可以得到保障,消息发送效率也可以。单向发送消息是指,Producer 仅负责发送消息,不等待、不处理 MQ 的 ACK。该发送方式时 MQ也不返回 ACK。

2024-02-08 00:49:22 248

原创 第三章 RocketMQ 工作原理

路由表:实际是一个 Map,Key 为 Topic 名称,value 是一个 QueueData 实例列表。QueueData 并不是一个 Queue 对应一个 QueueData,而是一个 Broker 中该 Topic 的所有 Queue 对应一个 QueueData。即,只要涉及到该 Topic 的 Broker,一个 Broker 对应一个 QueueData。QueueData 中包含 brokerName。

2024-02-05 22:54:07 726

原创 Oracle 执行计划(Explain Plan)

执行计划:一条查询语句在 ORACLE 中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。如果要分析某条 SQL 的性能问题,通常我们要先看 SQL 的执行计划,看看 SQL 的每一步执行是否存在问题。看懂执行计划也就成了 SQL 优化的先决条件。通过执行计划定位性能问题,定位后通过建立索引、修改 sql 等解决问题。

2024-02-04 18:23:31 611

原创 第二章 RocketMQ 的安装与启动

NameServer 是一个 Broker 与 Topic 路由的注册中心,支持 Broker 的动态注册与发现。RocketMQ 的思想来自于 Kafka,而 Kafka 是依赖了 Zookeeper 的。所以,在 RocketMQ 的早期版本,即在 MetaQ v1.0 与 v2.0 版本中,也是依赖于 Zookeeper 的。从 MetaQ v3.0,即 RocketMQ 开始去掉了 Zookeeper 依赖,使用了自己的 NameServer。

2024-02-03 23:04:13 982

原创 第一章 RocketMQ 概述

RocketMQ 是一个统一消息引擎、轻量级数据处理平台。RocketMQ 是一款阿里巴巴开源的消息中间件。2016 年 11 月 28 日,阿里巴巴向 Apache 软件基金会捐赠 RocketMQ,成为 Apache 孵化项目。2017 年 9 月 25 日,Apache 宣布 RocketMQ 孵化成为 Apache 顶级项目(TLP),成为国内首个互联网中间件在 Apache 上的顶级项目。

2024-02-03 18:50:53 848

原创 Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁

当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。当执行monitorenter时,如果目标锁对象的计数器为零,那么说明它没有被其他线程所持有,Java虚拟机会将该锁对象的持有线程设置为当前线程,并且将计数器加1。在目标锁对象的计数器不为零的情况下,如果锁对象的持有线程时当前线程,那么Java虚拟机可以将其计数器加1,否则需要等待,直到持有线程释放该锁。而当前帐户余额字段(

2024-02-03 14:57:33 642

原创 Juc06_Lock8锁问题、字节码层面看Synchronized、反编译synchronized锁

(调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程会将先持有 monitor 然后再执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放 monitor)(不一定,如果方法中直接抛出异常处理,那么就是一个 monitorenter 和 monitorexit)作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁。作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁。synchronized 静态同步方法。

2024-02-03 14:50:15 286

原创 Docker核心教程

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。docker 的理念回顾将应用和环境打包成一个镜像。数据如果都在容器中,那么我们容器一旦删除,数据就会丢失需求:数据可以持久化MySQL,容器删了,删库跑路需求:MySQL数据可以存储在本地容器之间可以有一个数据共享的技术,Docker 容器中产生的数据同步到本地这就是卷技术,目录的挂载将我们容器内的目录挂载到 Linux 上面。

2024-01-30 19:57:36 1597 3

原创 k8s详细教程(二)

自主式 pod:kubernetes 直接创建出来的 Pod,这种 pod 删除后就没有了,也不会重建控制器创建的 pod:kubernetes 通过控制器创建的 pod,这种 pod 删除了之后还会自动重建什么是Pod控制器?Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

2024-01-20 02:24:25 2256

原创 k8s详细教程(一)

一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。

2023-12-10 22:40:46 1200

原创 Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略

如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任务时。

2023-12-10 16:03:22 819

原创 Juc04_阻塞队列

①. 什么是阻塞队列?阻塞队列:顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如图所示,当阻塞队列是空时,从队列中获取元素的操作将会被阻塞②. 为什么用?有什么好处?好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为BlockingQueue都一手给你包办好了在concurrent包发布以前,在多线程环境下,我们每个程序员都必须自己去控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不小的复杂度。

2023-12-10 00:47:37 874

原创 Juc03_多线程中的虚假唤醒的产生、问题分析、解决方案

(一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面;按照上述操作,进行十轮做面吃面的操作)②. 代码展示(两个线程不会出现虚假唤醒问题,三个或多个线程才会出现)

2023-12-09 23:22:55 430

原创 Juc02_Synchronized、ReentrantLock实现生产者和消费者问题

①. 生产者消费者模式是一个十分经典的多线程协作的模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。所谓生产消费者问题,实际上主要是包含了两类线程:一类是生产者线程用于生产数据一类是消费者线程用于消费数据②. 为了耦合生产者和消费者的关系,通常会采用共享的数据区域,就像一个仓库生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为消费者只需要从共享数据区中获取数据,并不需要关心生产者的行为③.线程四句口诀掌握。

2023-12-09 22:06:34 389 1

原创 Juc01_多线程概述、四种实现方式、常用方法API、生命周期、买票案例、synchronized锁

1.摩尔定律失效(硬件方面):(1) 集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍,可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频(2). 在主频不再提高且核数不断增加的情况下,要想让程序更快就要用到并行或并发编程高并发系统,异步+回调的生产需求(软件方面)

2023-12-07 23:31:05 883

原创 Juc09_CompletableFuture概述、创建方式、常用API、电商比价需求

①. 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法②. 它可能代表一个明确完成的Future,也有可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作③. 它实现了Future和CompletionStage接口。

2023-12-06 19:07:06 882 1

原创 16_垃圾回收相关概念

我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。【既偏门又非常高频的面试题】强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么?在JDK 1.2版本之后,Java对引用的概念进行了扩充,将引用分为 强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4中,这4种引用强度一次逐渐减弱。

2023-12-01 17:11:49 905 1

原创 15_垃圾回收相关算法

需要区分出内存中哪些是存活对象,哪些是已经死亡的对象垃圾标记阶段引用计数算法可达性分析算法。

2023-12-01 17:11:10 906 1

原创 14_垃圾回收概述

极大提高了开发效率面试的热点运行程序中没有任何指针指向的对象导致内存溢出。

2023-12-01 17:10:49 928 1

原创 13_StringTable

String:字符串,使用一对 “” 引起来表示。String 声明为 final 的,不可被继承String 实现了 Serializable 接口:表示字符串是支持序列化的。实现了 Comparable 接口:表示String可以比较大小String 在 jdk8 及以前内部定义了 final char[] value 用于存储字符串数据。jdk9 时改为 byte[]String:代表不可变的字符序列。简称:不可变性。

2023-12-01 17:10:23 867 1

原创 12_执行引擎

一般来讲,JIT编译出来的机器码性能比解释器高。C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器。自JDK10起,HotSpot 又加入一个全新的即时编译器:Graal编译器。编译效果短短几年时间就追平了C2编译器。未来可期目前,带着 “试验状态” 标签,需要使用开关参数去激活,才可以使用写在最后2:关于AOT编译器jdk9引入了AOT编译器(静态提前编译器,Ahead Of Time Compiler)

2023-12-01 17:09:49 824 1

原创 11_直接内存

不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存空间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑直接使用内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区也可能导致OutOfMemoryError异常。

2023-12-01 17:09:16 383 1

原创 10_队形的实例化内存布局与访问定位

JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的呢?

2023-12-01 17:08:23 366 1

原创 09_方法区

运行时数据区结构图从线程共享与否的角度来看方法区在哪里?所以,方法区看做是一块独立于Java堆的内存空间。方法区的基本理解Hotspot中方法区的演进设置方法区内存的大小如果解决这些OOM?方法区(Method Area)存储什么?《深入理解Java虚拟机》书中对方法区(Method Area)存储内容描述如下:  它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。 类型信息  对每个加载的类型(类class、接口interface、枚举enum、注解an

2023-12-01 17:07:46 968 1

原创 08_堆空间

08_堆1、堆的核心概述1、内存细分2、设置堆内存大小与OOM1、堆空间大小的设置3、年轻代与老年代4、图解对象分配过程5、Minor GC、Major GC、Full GC6、堆空间分代思想7、内存分配策略8、为对象分配内存:TLAB9、小结堆空间的参数设置X、堆是分配对象的唯一选择吗1、堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间。堆的大小可以调节《J

2023-12-01 17:07:22 813 1

原创 sql ---慢sql定位及优化

然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用count(distinct left(列名, 索引长度))/count(*)的区分度来确定。如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。当需要重复引用大型表或常用表中的某个数据集时,可以使用临时表。

2023-10-17 11:42:16 85

原创 07_本地方法栈

07_本地方法栈本地方法栈(Native Method Stack)本地方法栈(Native Method Stack)Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)① 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个 StackOverflowError 异常。② 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申

2022-01-04 14:17:00 71

原创 06_本地方法接口

06_本地方法接口06_本地方法接口什么是本地方法?为什么要使用 Native Method ?现状06_本地方法接口什么是本地方法?  简单地将,一个 Native Method 就是一个Java调用非Java代码的接口。一个 Native Method 是这样一个Java方法:该方法的实现由非Java语言实现,比如 C。这个特征并非Java所特有,很多其他的编程语言都有这一机制,比如在C++中,你可以用extern “C” 告知C++编译器去调用一个C的函数。  “A native metho

2022-01-04 14:16:21 111

原创 05_虚拟机栈

05_虚拟机栈1、虚拟机栈概述2、栈的存储单位3、局部变量表4、操作数栈5、代码追踪6、栈顶缓存技术7、动态连接8、方法的调用:解析与分派9、方法返回地址10、一些附加信息11、战的相关面试题1、虚拟机栈概述 虚拟机出现的背景  由于跨平台型的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。  优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 内存中的栈与堆 栈是运行时的单位,而堆是存储的单位。即:栈解

2022-01-04 14:15:55 93

原创 04_程序计数器(PC寄存器)

04_程序计数器(PC寄存器)1、PC Register 介绍2、举例说明3、两个常见问题1、两个常见问题2、CPU时间片1、PC Register 介绍官网地址:https://docs.oracle.com/javase/specs/jvms/se8/html/  JVM的程序计数寄存器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。  这里,并非是广义上所指的物理寄存器,

2022-01-04 14:15:06 159

原创 03_运行时数据区概述及线程

03_运行时数据区概述及线程1、概述  内存是非常重要的系统资源,是硬盘和CPU 的中间仓和桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。  Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一 一对应的

2022-01-04 14:11:28 379

原创 02_类加载子系统

02_类加载子系统1、内存结构概述2、类加载器与类的加载过程1、类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法去中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)2

2021-12-24 15:39:05 66

原创 01_JVM与Java体系结构

01_JVM与Java体系结构6、JVM的整体结构HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++一较高下的地步。7、Java代码执行流程...

2021-12-24 14:47:25 184

空空如也

空空如也

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

TA关注的人

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