自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbiitMQ 消息丢失问题

Rabbitmq 消息丢失

2022-10-31 16:31:31 519 1

原创 Go interface的结构以及在并发过程中赋值的问题

Go concurrency

2022-10-19 06:32:25 378

原创 Spring xml配置文件中命名空间的实现

1 在spring中使用xml配置bean的时候 ,我们可能会使用到其他的命名空间。例如我们配置aop.<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfram

2022-05-25 10:22:44 308

原创 Java中 registerNatives的原理

在看JDK中的源码是,有的类通常会使用以下的结构,来注册本类可以使用的Native方法private static native void registerNatives(); static { registerNatives(); }我们以Thread.java类的 registerNatives的注册为例找到Thread.c这个文件可以发现有以下数组static JNINativeMethod methods[] = { {"start0",

2022-05-17 23:57:16 582

原创 Python中的变长对象

本系列文章都是基于陈儒的Python源码剖析一书。typedef struct { PyObject_VAR_HEAD} PyVarObject;#define PyObject_VAR_HEAD \ PyObject_HEAD \ Py_ssize_t ob_size; /* Number of items in variable part */基于我们在Python对象基石P

2022-05-13 23:33:10 202

原创 Python 对象的基石 PyObject

本系列文章都是基于陈儒的Python源码剖析一书。打开object.h 文件typedef struct _object { PyObject_HEAD} PyObject;上述代码定义了一个数据类型PyObject. 可以发现PyObject中就是PyObject_HEAD。#define PyObject_HEAD \ _PyObject_HEAD_EXTRA \ Py_ssi

2022-05-13 23:04:32 539

原创 Guava中AbstractIterator源码分析

今天阅读Guava源码发现一个通用的迭代器设计。package com.google.common.collect;import static com.google.common.base.Preconditions.checkState;import com.google.common.annotations.GwtCompatible;import com.google.errorprone.annotations.CanIgnoreReturnValue;import java.ut

2022-05-05 00:05:06 387

原创 Systemd入门

systemd 介绍systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具。systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令

2022-05-03 00:36:17 219

原创 Python 中默认参数的特性

在Python中默认参数只会别求值一遍,然后记录下这个值,以后每次调用这个方法或者是函数的时候都会传递这个求值一遍的默认值,如果这个默认参数的值是一个不可变的值,没什么问题,但是当这个默认参数的值是一个可变的值,就会触发一些意想不到的Bug.代码如下:class Player(object): def __init__(self,name,items=[]): self.name = name self.items = itemsplayer_a = P

2022-05-02 02:44:12 675

原创 Java MethodHandle 使用中的一个坑

1 先创建一个实体类import java.lang.invoke.MethodHandles;public class Student { private int id; private String name; public int getId() { return id; } public String getName() { return name; } public Student(int id

2022-04-15 12:07:40 622

原创 TCP的三次握手和四次挥手

网络

2022-04-08 00:38:47 56

原创 Python中的super

1 由于python多继承的所以python需要一个确定到底是调用那个继承类方法的机制。super并不是和java中一样是一个关键字,super在python中是一个类。2 mro .python中每个类都有一个mor方法,这个方法会返回当前类的继承循序类的一个列表。在python2.3之后mr0使用的是C3算法。如果一个类的继承关系不满足C3算法,那么这个类的继承关系有误。class A(object): passclass B(A): passclass C(A,

2022-04-05 17:25:55 824

原创 Java SPI 之 ServiceLoader

Java spi的实现机制

2022-04-02 18:50:05 2570

原创 ASM 在方法进入时候添加语句和方法退出的时候添加语句

ASM

2022-03-26 09:52:37 431

原创 ASM 添加字段已经生成相对应的get set 方法

1 首先创建一个实体类Student. 代码如下package com.org.xcyz.asm;public class Student { private int id; private String name; private boolean sex; public int getId() { return id; } public void setId(int id) { this.id = id;

2022-03-22 08:12:42 383

原创 理解Java Class 中的 StackMapTable

Java class StackMapTable

2022-03-21 10:18:04 653

原创 Java泛型的协变与逆变

Java 泛型

2022-03-17 00:50:35 3226

原创 Integer 中 getChars

static void getChars(int i, int index, char[] buf) { int q, r; int charPos = index; char sign = 0; if (i < 0) { sign = '-'; i = -i; } // Generate two digits per iteration .

2022-03-16 23:26:19 237

原创 HashMap 中的 tableSizeFor方法

tableSizeFor

2022-03-11 11:47:23 266

原创 bash中的数学运算

#!/bin/bashread -p "input a number:" numexpr $num + 1 &> /dev/nullif [ $? -eq 0 ];then if [ `expr $num \> 0` -eq 1 ];then echo "positive" for((i=1;i<=$num;i++)) do sum=`expr $sum + $i` done ...

2020-06-09 05:46:08 243

原创 shell 中的变量的替换和删除

从左到右${var#str} 讲var变量中匹配到的以str开头的第一次匹配到的删除${var##str} 讲var变量中匹配到的以str开头的最后一次一次匹配到的删除从右到左${var%str} 讲var变量中匹配到的以str开头的第一次匹配到的删除${var%%str} 讲var变量中匹配到的以str开头的最后一次一次匹配到的删除替换变量${var/old/new} 替换第一次 匹配到的${var//old/new} 替换全部 匹配到的...

2020-06-09 05:24:25 152

原创 git 的备份

1 哑协议/path/repo.git2智能协议file:///path/repo.git 这两个协议都是本地的协议 https和http协议htttp(s)://gitserver:port/path/repo.git http和https协议是需要出入用户名和密码的 ssh协议 user@gitserver/path/repo.git哑协议传输过程不可见而且传输速度慢下面演示一下[git@localhost tmp]$ git clone --bare /home/git/...

2020-05-24 19:55:43 262

原创 git 的常用操作

1 git branch -d branch_name 删除某一个分支(如果这个分支中有些commit没有 被合并那么这种删除会失败)2 git branch -D branch_name强行删除一个分支3 git commit --amend 修改最近一次的提交信息

2020-05-24 01:41:23 68

原创 git 中HEAD的理解

当HEAD指向某一个分支的时候那么就是说我们在某个分支的某个分支实质上也是指向某个commit如果HEAD 直接指向某个commit此时处于分离头指针的状态。如果我们在这个状态下做了更改然后我们切换分支然而我们忘记将这个没有属于任何分支的commit和分支挂钩的话git可能就会清除我们之前的commit我们可以认为HEAD实质上就是某一个commit的指代所以HEAD有一些特殊的用法就是HEAD指代git diff HEAD HEAD~1 这样就可以比较HEAD 和 HEAD前一个版本作比较

2020-05-24 00:29:54 1803

原创 git 中的存储模型

我们之前提到在git中有三种存储对象1 commit 2 tree 3 blob一个commit对应一个tree。一个tree对应于多个tree和多个blob。一个blob对应于一个文件文件内容相同就是同一个blob那么git是怎么样的一种存储文件的形式呢我们可以以我的git为例子看看首先我们看看当前的commit唯一标识[git@localhost git_learn]$ git log --oneline98051f5 change readme96b52f6 add java.

2020-05-23 23:57:04 287

原创 git 中存储对象的类型

1tree 2commit 3 blob每个 commit 对应一棵树就是一个tree但是每一棵树可以对应多棵树和多个blob。我们可以简单的认为一个属代表一个文件夹一个blob代表一个文件同时blob既然是文件在git中被标示不是通过文件名而是通过文件的内容可以认为在git中文件内容相同的文件就是一个blob。git的commit和merge可以认为就是tree的持久化和创建新树的过程...

2020-05-23 23:19:55 122

原创 git config 的三种范围

--global 是当前用户的--system 是整个系统的--local是 当前项目的可以从三个config文件的位子来推测和辨别当你设置了--global的话在/home/${USER}/.gitconfig的文件当你设置了--system的话在/etc/gitconfig的文件当你设置了--local的话在当前项目的.git目录下面config文件如果想查看的话可以使用git config --list --system/--global/--local三个范围不设

2020-05-23 03:15:48 557

原创 Prometheus 架构设计

Prometheus 的架构设计图通过prometheus的架构图可以看出,prometheus提供了本地存储,即tsdb时序数据库。本地存储的优势就是运维简单,缺点就是无法海量的metrics持久化和数据存在丢失的风险,我们在实际使用过程中,出现过几次wal文件损坏,无法再写入的问题。当然prometheus2.0以后压缩数据能力得到了很大的提升。为了解决单节点存储的限制,prometheus没有自己实现集群存储,而是提供了远程读写的接口,让用户自己选择合适的时序数据库来实现prometheus

2020-05-19 02:04:30 543

原创 Prometheus 简介

1 开源监控工具2 时间序列数据库(TSDB)3 多维度拉模式4白盒和黑盒监控都可以做到5专注Metrics 和 Alert6 单机性能较好7 网站 htttps://prometheus.io/

2020-05-19 01:40:17 129

原创 四种监控方式

四种方式 Logging Tracing Metrics HealthCheck1 研发成本来说 Logging 比较低 Metrics 一般 Tracing比较高2 运维成本来说 Logging 比较高3 相应能力来 Metrics 比较好4 解决问题来说 Tracing 比较好 Loggin一般,Metrics 一般表示趋势一边监控需要比较灵敏所以一般是Metrics 和 HealthCheckMetrics 一般是分层的监控运维人员一般关注于系统层次的metrics开发

2020-05-19 01:30:21 1108

原创 FTP 服务介绍

ftp 协议1 主动模式 被动模式ftp 不支持带外数据所以需要命令链路和数据链路命令链路一般是21端口数据链路分为主动模式和被动模式1 主动模式就是服务器主动的向客户端发起一个数据连接请求。可能出现的问题是客户端所在的主机的端口并未开放,导致服务端请求客户端没有响应2 被动模式 服务器主动开启一个大于1024的端口来等待客户端和服务器连接2 vsftpd 是ftp 服务端进程软件 ftp是客户端软件在 centos 或者rhel 上 yum -y install ftp..

2020-05-14 03:52:40 248

原创 Tomcat系统架构(下):聊聊多层容器的设计

Tomcat 设计了 4 种容器,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。下面我画了一张图帮你理解它们的关系Context 表示一个 Web 应用程序;Wrapper 表示一个 Servlet,一个 Web 应用程序中可能会有多个 Servlet;Host 代表的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置...

2020-04-17 13:40:56 173

原创 Tomcat系统架(上): 连接器是如何设计的?

Tomcat 要实现 2 个核心功能:Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。所以连接器和容器可以说是 Tomcat 架构里最重要的两部分,Tomcat 支持的多种 I/O 模型和应用层协议。Tomcat 为了实现支持多种 I/O 模型和应用层协议,一个容器可能对接多个连接器,就好比一...

2020-04-17 13:15:14 148

原创 innodb 在 compact行格式下varchar类型的存储

varchar 类型的大小有三部分组成:1变长列表的大小(最大2个字节)2如果允许空值则需要在null值列表中占用一位,而且null值列表的必须为整数字节所以必须为一个字节,如果不允许为null,这一部分为空3实际数据大小下面在compact行格式下在mysql5.6 下做实验由于可以使用2个字节存储大小那么理论上可以创建一个字段为65535字节的列所以mysql> ...

2020-04-09 03:06:52 120

原创 InnoDB 行格式(ROW_FORMAT)

InnoDB表的数据存储在页(page)中,每个页可以存放多条记录。这些页以树形结构组织,这颗树称为B树索引。表中数据和辅助索引都是使用B+树结构。维护表中所有数据的这颗B+树索引称为聚簇索引,通过主键来组织的。聚簇索引的叶子节点包含行中所有字段的值,辅助索引的叶子节点包含索引列和主键列。变长字段是个例外,例如对于BLOB和VARCHAR类型的列,当页不能完全容纳此列的数据时,会将此列的数据存...

2020-04-09 02:00:20 686

原创 Java 内存模型(JMM)

Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与 Java 编程时所说的变量不一样,只包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。Java 内存模型中规定了所有的变量都存储在主内存中,每个线程还有自己的工作内存(类比缓存理解),线程的工作内存中保存了...

2020-04-09 00:51:01 158

原创 MESI CPU 缓存一致性协议

1 为什么需要cpu 缓存。cpu的频率要远远高于主存的频率,所以添加缓存,来缓解cpu和主存之间速度不匹配问题。2 缓存为什么可以起作用。因为程序访问数据具有时间局部性和空间局部性。所谓时间局部性就是说某个数据被访问,可能在短时间内再次被访问。空间局部性就是说某个数据被访问可能邻近的数据也会被访问。3 要保持多cpu缓存的数据的一致性那么有需要缓存一致性协议。MESIM: 被修改(M...

2020-04-08 23:57:28 66

原创 java序列化的安全问题

如果一个函数或者对象,不管它位于多么遥远的地方,都可以在本地直接被调用,那该有多好 呀!这是一个非常朴素、美好的想法。基于这个设想,诞生了很多伟大的技术和协议,比如远程 过程调用(RPC)、远程方法调用(RMI)、分布式对象(Distributed Object)、组件对象模 型(COM)、公共对象请求代理(CORBA)和简单对象访问协议(SOAP)等……这个列表还可 以很长很长。...

2020-03-27 14:10:31 1440

原创 JVM参数详解

java -XX:+PrintFlagsInitial查看JVM初始化默认参数。有:=修改过,没有:默认值java -XX:+PrintFlagsFinal 查看JVM最终运行时的默认参数。有:=修改过,没有:默认值java -XX:+PrintCommandLineFlags -version。偏重查看默认垃圾回收算法-Xms初始堆内存大小(1/64)-Xmx最大堆内存大小(1/4...

2020-02-10 18:54:46 62

原创 关于数字的二进制表示反码补码有符号数无符号数的一些认识

1 首先我们应该明白计算机对于数字的加减运算其实是一种运算,在计算机中只有加法运算,因为计算机只是实现了加法器。即计算机中是不区分加法和减法的,只有加法。基于这个观点我们来推导出一些基本的认识。计算机首先要处理的是0怎么表示。理论上在规定长度的内存里,你想怎么表示就怎么表示,只要你设计的机器可以自圆其说。于是规定所有位数上都是0的数字是0.16位的数16位都是0,32位的数字32位都是0....

2020-01-08 22:58:51 458

空空如也

空空如也

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

TA关注的人

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