自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 源码分析CompletableFuture使用默认线程池ForkJoinPool的弊端(cpu利用率低)

假如有20CompletableFuture任务并发执行时,都使用默认线程池ForkJoinPool,但cpu的核心数又小于3,那么就会新建20个线程(不使用默认线程池了),这20个线程相互竞争cpu资源和内存,很多线程都在等待,浪费了大量的性能在线程上下文切换上。

2023-08-23 19:46:05 989

原创 AQS源码分析

AbstractQueueSynchronizer简称AQS(抽象的队列同步器),是重量级基础框架以及JUC体系的基石,主要用于解决锁分配给谁的问题。

2023-08-04 13:55:41 93

原创 Spring事务传播机制、实现方式、失效场景及原理

本质:通过 this 来调用某个带有 @Transactional 注解的方法时,这个注解是失效的,可以看做这个方法(如上图B)上没有这个注解,当然书写的传播机制限制也是无效的,例如:propagation = Propagation.MANDATORY、propagation = Propagation.NEVER。但是若调用A的是CGLIB生成的代理对象,并且A上有 @Transactional 注解,那么方法A是具有事务的,方法B中的sql 就在方法A的事务中执行,所以整体A,B是有事务的。

2023-08-03 22:46:09 424 1

原创 Synchronized锁升级(偏向锁、轻量锁、重量锁)

高并发时,同步调用应该考虑到锁的性能消耗。能用无锁的数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能使用对象锁,就不用类锁。

2023-03-21 23:02:56 847

原创 JUC并发编程

处理器的读写速度远远大于内存,中间一般设有高速缓存区,现阶段一般windows电脑就有三级缓存。作用:屏蔽各种硬件和操作系统的内存访问差异。JMM:java内存模型,本身是一种抽象的概念,并不正是存在,它仅仅是描述的一组预定与规范。通过这组规范定义程序中各个变量的读写访问方式并对共享变量的写入何时/如何编程对另一个线程可见。关键技术点都是围绕多线程的原子性、可见性、有序性展开。能干嘛?通过JMM 来实现线程和主内存之间的抽象关系。

2023-03-15 17:45:18 113

原创 JVM垃圾回收算法与概念

在GC执行垃圾回收之前需要判定那些是存活对象,那些是死对象(当一个对象已经不再被任何存活的对象继续引用时,宣判死亡)。 - 引用计数器的属性,用于记录对象被引用的情况。对于一个对象A,只要任何一个对象引用了A, 则A的计数器就加1,当引用失效时计数器就减1.当对象A的计数器为0时即表示对象A不可能被使用,可回收。优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟。缺点: - 它需要单独的字段存储计数器,增加了储存空间开销。 - 每次赋值都需要重新更新计数器,增加时间开销 - 存在**无

2022-10-23 21:05:20 116

原创 JVM垃圾回收器

GC分类与性能指标吞吐量:运行用户代码时间栈总运行时间的比例。(程序运行时间 / 程序运行时间 + 内存回收时间)暂停时间:执行垃圾收集时,程序的工作线程所暂停的时间。内存占用:java堆区所占用的内存大小。

2022-10-23 21:03:38 177

原创 动态规划——背包问题

01背包、完全背包、多重背包

2023-10-02 16:28:36 157

原创 对象内存布局与对象头

在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充。

2023-08-19 19:23:05 218

原创 kubernetes(namespace、pod、deployment、service、ingress)

NameSpace名称空间用来隔离资源,但是不隔离网络。

2023-08-19 19:22:23 185

原创 ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

es支持对搜索结构进行排序,默认是根据相关度算分(_score)进行排序。可以排序的字段有keyword,数值、地理坐标、日期类型等。参与搜索的字段越多,查询效率越低,建议利用copy_to将多个检索字段放在一起,然后使用match—all字段查。最后将查询结果中 highlight 与 指定高亮的字段进行替换返回给前端就行。boolean query:布尔查询是一个或多个子查询的组合。ES默认搜索字段和高亮字段必须一致,否则不会高亮。精确查询: term字段全值匹配,range字段范围匹配。

2023-08-19 19:17:14 1735

原创 ElasticSearch索引库、文档、RestClient操作

springboot 导入elasticsearch依赖需注意,它默认使用的版本和springboot的版本一致,你需要对应到安装在服务器上的版本。mapping映射是对索引库中文档的约束。查询索引库 GET /索引库名 GET /linsy。es8.x已经弃用了RestHighLevelClient。删除 DELETE /索引库名/_doc/文档id。查询 GET /索引库名/_doc/文档id。映射:索引中文档字段的约束,比如名称、类型。删除索引库 DELETE /索引库名。

2023-08-19 19:06:35 1013

原创 ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步

拼音分词器的过滤规则,参照上面下载的链接。创建一个自定义分词器(text index库),分词器名:my_analyzer// 自定义拼音分词器 + mapping约束PUT /test},"py": {},"name": {

2023-08-19 18:59:06 1418

原创 ElasticSearch相关概念

进入docker 创建的容器的插件目录,找到Ik分词器下的 IKAnalyzer.cfg.xml 文件,扩展词典在 中添加文件名称(例如ext.dic),停用词典在 中添加,(例如stopword.dic)。springboot 导入elasticsearch依赖需注意,它默认使用的版本和springboot的版本一致,你需要对应到安装在服务器上的版本。参与搜索的字段越多,查询效率越低,建议利用copy_to将多个检索字段放在一起,然后使用match—all字段查。类似mysql对表单字段的约束。

2023-08-17 10:19:20 692

原创 XXL-JOB任务调度

XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。官网:https://www.xuxueli.com/xxl-job/

2023-06-26 17:35:18 351

原创 动态规划问题

分治法:大事化小,逐一解决动态规划:记录前一部分的最优解,与后文进行比较力扣53 最大子数和 public int maxSubArray(int[] nums) { int maxSum = nums[0], thisSum = 0; for(int num : nums){ thisSum += num; if(thisSum > maxSum) maxSum = thisSum; ..

2023-05-08 19:25:24 303

原创 动态规划(接雨水、最长回文子串)

第一步遍历标记从左到右的最大值 **maxL[ ]** 和从右到左的最大值 **maxR[ ]**,第二步再从左到右(或从右到左)遍历计算雨水总量。第二步中:遍历到 i 时,选择 maxL[i] 与 maxR[i] 中的最小者减去当前高度 height[i] ,则为当前 i 列储存雨水量。

2023-04-27 20:45:49 97

原创 迷宫算法(DFS,BFS)

dfs深度优先,:也可以找多条路径中最短距离时,当大于10x10或出现的路径较多时,效率较差。dfs使用标记、回溯解决循环绕圈问题。只有当所有边的权重都相等时(即向西面移动的所消耗的权重相等),才用BFS。寻找从该点开始距离为 “1” 的可成功到达的点(并记录它到起点的距离),一层一层找。最多枚举所有点位,而bfs会重复枚举相同点位。这里使用对象数组模拟队列存储坐标。

2023-04-25 20:26:15 255

原创 DFS算法(皇后问题解)

主要思考顺序来遍历搜索(暴力搜索)=> 递归。排列数字:https://www.acwing.com/problem/content/844/如:追溯到倒数第二个节点(A点),标记为已使用,然后再往下找,到叶子节点(标记、输出),回溯到上一节点,取消叶子的标记,然后再回溯到上一节点,取消A点的标记,当前表示 i = 2 这个节点已经遍历,接着遍历 i= 3 这个节点。

2023-04-25 17:16:18 75

原创 解决无法删除Terminating状态的namespace

场景:执行以下命令都无法删除namespace、处于进行状态(卡住)首先以分区的形式将命名空间导出,会出现一个(命名空间的名称.json)的json文件,编辑该json文件,将spec内容中的 finalizers

2023-04-09 16:01:33 170

原创 kubernetes(k8s)安装、集群搭建、可视化界面、完全卸载

Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。● 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)

2023-04-08 18:24:34 1512

原创 在Linux服务器上进行word转pdf(解决无中文字体问题)

首先要解决的是linux上没有中文字体的问题,这使得转换的pdf中字体有乱码。其次要选择合适依赖文件,我使用的是免费开源的com.spire.doc.Document。注意创建好相关目录:字体安装目录、pdf文件存储目录。

2023-04-06 10:28:01 936

原创 金额数字转换(英文、中文)

金额数字转大写中文,金额数字转大写英文

2023-04-06 10:07:49 503

原创 解决HttpURLConnection GET封装请求体

广义上get没有请求体,但在实际开发中可能会遇到get请求封装请求体的需求。这里我们要解决的是使用。解决方法:通过反射将对象的参数 requestMethod 重置为get。封装get请求body时,源码中会自动将get请求转为post请求。

2023-04-06 09:51:51 742 1

原创 Docker容器监控之 CAdvisor+InfluxDB+Granfana

docker status命令能看到当前宿主机所有容器cpu、内存、网络流量的数据,基本够用了。(如昨日某个时间段)。:容器监控工具,但是只能存储2分钟数据:数据库,存储监控数据:可视化分析平台。

2023-04-05 17:19:37 304

原创 Portainer安装与使用(docker可视化工具)

Protainer是一款轻量化应用,具有图形化界面,方便管理Docker单机环境和集群环境。第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000。官网:https://www.portainer.io/

2023-04-05 15:55:45 555

原创 Docker-Compose编排微服务与常用命令

Docker-Compose是Docker官方的开源项目,负责实现docker集群容器的快速编排。Compose使用三步骤: 1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像 2. 使用docker-compose.yml定义一个完整的业务单元,安排好整体各个容器服务 3. 最后执行docker-compose up命令一键启动

2023-04-05 15:35:27 345

原创 Docker网络模式解析以及自定义网络

实行容器间的互联互通,我们发现在同一个网络(bridge)使用ip能ping同对方,但使用实例名却无法ping通。但是这容器中很难保证ip不被改动,也不可能一直去更改配置。使用自定义网络通过实例名互联就能解决这一问题。新建一个网络将启动的容器使用自定义的网络(–network 指定网络名)进入容器通过ping 同一个网络的对方实例名。

2023-04-04 19:44:50 518

原创 DockerFile常用保留字及微服务镜像制作

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。构建三步骤:`编写Dockerfile文件` => `docker build命令构建镜像` => `docker run镜像运行容器实例`

2023-04-03 21:33:24 133

原创 docker部署redis集群(哈希槽)并实现扩缩容以及相关理论

redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。当我们连接master1(6381),进行数据写入时,如果key的hash值不在分配给master的槽位就会报错,写不进去,由下面第2、3张图可看槽位信息。主从机对应是随机生成的,我这里主从机对应是:6381 => 6385,6382 => 6386,6383 => 6384。第三步:移动的这些槽位由谁出?

2023-04-03 16:10:50 440

原创 docker中部署mysql主从复制

主机新建库-使用库-新建表-插入数据;第一步建立用户,第二部授权。从机使用库-查看记录。然后再次查看同步状态。

2023-04-02 17:35:04 81

原创 docker常规使用命令集及原理

exec是在容器中打开新的终端,并且可以启动新的进程,用exit推出,不会导致容器停止attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器停止

2023-04-02 15:59:22 218

原创 nginx常用命令与相关理论

服务器将生成的公钥提交给CA机构进行公钥认证,然后生成证书。服务器端响应数据时携带证书,操作系统内嵌CA公钥,当操作系统利用CA公钥能解开证书说明信息没有被篡改过(证书在传递过程中能够被解开,但是由于CA私钥是不会公开的,所以不能再次对证书进行正确的加密 ),客户端解密证书后拿到服务器公钥然后对信息进行加密传输(当然这个公钥其它人也能得到,但是他用服务器公钥解不开公钥加密的信息),因此保证了数据的安全性。

2023-04-01 14:50:54 1129

原创 错误日志与笔记

错误日志:一、解析excel单元格为纯数字时,利用getStringCellValue()会报错,类型错误。解决方法:使用 org.apache.poi.xssf.usermodel 包下的 XSSFWorkbook 等二、HSSFWorkbook使用org.apache.poi.hssf.usermode包下的 HSSFWorkbook、HSSFSheet 读取excel文件发生版本错误,错误信息:The supplied data appears to be in th

2022-12-08 13:06:47 266

原创 数据结构

数组模拟链表注意初始化时使用了数组的几个元素,让第k个数与数组下标对应,需要 k 加减 x。单链表AcWing826 单链表在k后插入值插入 ne[idx] = ne[k]; ne[k] = idx;双链表AcWing829 双链表在k的右节点插入一个数,若想在左边插入 add( l[k] , x ) r[idx] = r[k]; l[idx] = k; l[r[k]] = idx; ...

2022-11-16 10:55:45 131

原创 JVM类的加载过程与类加载器

跨平台语言(write once, run anywhere)前端编译器()的主要任务就是负责。javac编译四步骤:1. 词法解析、2. 语法解析、3. 语义解析、4. 生成字节码类的成员变量赋值:1、默认初始化 2、显式初始化 /代码块初始化 3、构造器初始化 4、有了对象之后(对象.属性或对象.方法)对成员变量赋值。

2022-10-23 21:03:01 212

原创 JUC初体验

实际开发中不用上面三种方式创建线程池,而是自定义。FixedThreadPool和SingleThreadPool:允许请求队列的长度为 Integer.MAX_VALUE,面临大量请求会导致OOM。CachedThreadPool 和 SingleThreadPool:允许创建线程数量为Integer.MAX_VALUE,可能会创建大量线程,从而导致OOM。

2022-10-23 21:02:14 200

原创 JVM执行引擎

简介:JVM执行引擎充当了将高级语言翻译为机器语言的译者。将字节码指令解释/编译为对应平台上的本地机器指令。工作过程。对字节码采用逐步解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。就是虚拟机将源代码直接编译成和本地机器平台的相关语言。JIT是将所有的字节码编译完才开始运行。后期执行速度快。现在JVM在执行java代码时,通常都会将解释执行与编译执行二者结合起来进行。(半编译半解释型语言)

2022-09-17 20:02:02 155

原创 JVM对象实例化内存布局与访问定位

栈中对象引用指向堆中对象实体数据,堆中对象实体数据含有指向方法区中对象类型数据的指针。缺点:需要开辟内存空间给句柄、多一个访问数据环节,速度较慢。JVM怎么通过栈帧中的对象引用访问其它内部对象实例?

2022-09-16 20:28:50 79

原创 JVM运行时数据区及线程

当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们的运行时数据区。比如大厨做饭,我们把大厨,比作是运行时数据区。而可以类比于执行引擎,将通过准备的东西制作成精美的菜品。运行时数据区即加载到物理内存的东西。

2022-09-16 20:28:09 49

空空如也

空空如也

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

TA关注的人

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