自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty 内存池(三)内存释放流程

Netty 内存池(三)内存释放流程

2022-06-18 15:50:11 813 1

原创 Netty 内存池(二)内存申请流程

Netty 内存池(二)内存申请流程

2022-06-18 15:49:29 401

原创 Netty 内存池(一)内部结构分析

Netty 内存池(一)内部结构分析

2022-06-18 15:48:20 648

原创 Netty ChannelOutboundBuffer出站缓冲区分析

Netty ChannelOutboundBuffer出站缓冲区分析

2022-06-18 15:46:57 406

原创 Netty LengthFieldBasedFrameDecoder源码分析

Netty LengthFieldBasedFrameDecoder源码分析

2022-06-18 15:45:12 882

原创 Netty pipeline & handler详解

Netty pipeline & handler详解

2022-06-18 15:43:16 425

原创 记录一次日志采集工具fluentd踩坑

先展示下配置信息,通过http协议将数据传入fluentd,然后match根据后面的tag: debug.** 进行匹配,最后将数据存入path中。<source> @type http @id input_http port 8888</source><match debug.**> @type file path /var/log/fluent/test</match>在运行td-agent时,遇到了一个异常按报错提示输

2022-02-22 18:01:00 1064 1

原创 布隆过滤器原理及简单实现

原理布隆过滤器,英文BloomFilter,是一个时间复杂度和空间复杂度很低,并用来检测元素是否存在的一种数据结构。它本质上是一个位图,把元素通过多次的hash计算出来的值当作索引,如果索引对应的位图的二进制位为0,说明该元素不存在,如果都为1,该元素可能存在。“可能存在"我们称为布隆过滤器的误判率,这是由于hash冲突导致的。从这可以看出来,布隆过滤器适用与对大数据集进行去重、检验是否存在等场景,但由于它的误判率,并不适用"零错误的场景”。下面我们来看看它的原理。上图就是布隆过滤器的原理,中间就是b

2022-01-15 16:32:04 874

原创 OracleVM安装centos7(附带静态ip配置)

centos7安装1.新建2.创建3.设置内存4.设置硬盘5.设置虚拟机相关配置5.1网络配置网卡1设置网卡2设置5.2虚拟机镜像设置到这一步配置就完成了,接下来是安装centos7的流程。6.安装centos7在启动后,光标定位到了虚拟机里,OracleVM默认是按键盘右边的Ctrl切换到主Windows系统,可以在这一步进行设置自定义按键。安装centos7步骤接下来有些步骤需要等待一段时间选择安装语言,下面可以选择中文选择安装

2021-12-29 12:43:48 1725

原创 SpringCloud openfeign源码分析

在分析源码前,还是先介绍一下简单的使用流程。首先引入依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>开启自动Feign客户端功能@SpringBootApplication//可以配置扫描的Feign客户端包路径,

2021-12-11 19:03:34 710

原创 Spring 事务源码分析

在前面一期我们分析过Spring AOP的原理,并且在结尾自定义了一个AOP的拦截器简单实现,如果没有弄明白AOP原理的朋友,还是先弄清楚AOP再来看本文,因为Spring事务就是以AOP为基础实现的。提到事务,我们最早学习JDBC的时候,如果要进行数据库操作,通常可以把方法抽象成这样try{ //关闭自动提交,开启事务 con.setAutoCommit(false); //..... //DML、DQL操作 //提交事务 con.commit();}catc

2021-12-10 17:27:25 1060

原创 Netty RecvByteBufAllocator源码分析

在前面Netty系列的文章中,我们在客户端消息处理的时候埋下了一个问题,就是#NioByteUnsafe的read()方法中,有一个预测内存分配大小的组件还没有分析#NioByteUnsafepublic final void read() { //...... //缓冲区分配器 final ByteBufAllocator allocator = config.getAllocator(); //预测分配多大内存 final RecvByteBufAllocator.Handle

2021-12-07 20:10:11 1481

原创 线程池ThreadPoolExecutor源码分析

本期带大家来分析线程池ThreadPoolExecutor的源码,在看本文之前最好要知道线程池的执行逻辑和核心参数,这样更方便从源码入手分析流程。重要的属性//高3位表示线程池运行状态,除去高3位后的低位,表示当前线程池中线程的数量private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));//表示在ctl中存放线程数量的位数private static final int COUNT_BITS = Integer

2021-12-07 14:13:37 2124

原创 Spring AOP源码分析

在前面我们分析过IOC的大致流程,这期就带大家来分析Spring中另外一大特性AOP的实现原理。建议阅读本文前,懂得IOC的原理,AOP的使用以及基础的概念问题,因为AOP的实现是基于IOC之上的。在学习AOP的时候,大家或多或少都听过AOP的原理是动态代理,但是大家有想过动态代理的前提是什么吗?不管是JDK还是CGlib代理,你都要给代理类传入被代理的对象,那说明这时候目标对象已经被创建出来了。把这一点带入到IOC的流程,大致可以猜到,AOP的实现一定是在bean被实例化之后。那么在bean的生命周期里

2021-12-06 13:39:55 426

原创 ReentrantLock源码分析

在分析ReentrantLock前,还是需要直到AQS是什么的。AbstractQueuedSynchronizer队列同步器,简称AQS,是用来构建锁或者其他同步组件的基础框架,常用的ReentrantLock、ConuntDownLatch、Semaphore等JUC包下的组件都是基于AQS来实现的。AQS使用了一个int的成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。AQS定义了两种资源共享方式,独占和共享。本文说是分析ReentrantLock,实际上是借着它来分析AQ

2021-12-05 10:46:09 261

原创 ThreadLocal源码分析(jdk1.8)

ThreadLocal,从名字上可以知道和线程本地有关系,这个类会为每个线程提供属于线程自己的局部变量。ThreadLocal可以通过initialValue()为每个线程赋值,也可以由线程自己调用ThreadLocal的set()进行赋值。每个线程操作对应的变量时,与其他线程不会发生冲突,改动仅对自己可见。总的来说,ThreadLocal适用于变量在线程间隔离的场景,这里也可以看出ThreadLocal采用了空间换时间的策略保证并发安全。在jdk1.7和1.8中,ThreadLocal原理并不相同,本文

2021-12-04 15:33:15 715

原创 ConcurrentHashMap源码分析(jdk1.8)

本文适用于了解过ConcurrentHashMap部分原理,但又没仔细研究过源码的同学!并且本文不涉及红黑树相关的操作,能力有限,掌握的不是很好。在看源码时,可以注意到Doug lea的编码风格,就是喜欢在if判断里进行一些属性的赋值,这一点一定要记清楚了,不然有些局部变量在哪赋值的都搞不清。重要属性//散列表数组最大限制private static final int MAXIMUM_CAPACITY = 1 << 30;//散列表默认大小private static final

2021-12-03 22:09:05 400

原创 NioEventLoop源码分析

前面几期带大家分析了Netty的服务端启动,客户端连接,客户端消息处理的流程,本期就来讲解Netty中一个极其重要的组件,事件循环器EventLoop。NioEventLoopGroup分析我们平常使用Netty的时候,一般都是用NioEventLoopGroup进行操作,所以我们从NioEventLoopGroup开始分析。首先来看一下NioEventLoopGroup的继承体系从上图可以看出NioEventLoopGroup是一个线程池,所以有一个execute()方法,并且实现了Schedul

2021-12-01 11:36:46 894 1

原创 Netty客户端消息处理流程

本期算是上一篇章的续篇,分析的是客户端连接上服务端后,向服务端发送消息,服务端是如何处理的。由于客户端通道是用来处理业务的,所以下面展示一个小demo,方便后面对客户端pipeline有个具体的实例分析。Netty服务端启动代码 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try {

2021-11-29 15:53:41 1414

原创 Netty服务端处理客户端连接流程

在前面一期我们讲了Netty服务端启动流程,本期就带大家看看服务端是如何处理客户端连接的流程。我们直接从#NioEventLoop的processSelectedKeys()方法开始,此方法的被调用处在#NioEventLoop的run()方法中,熟悉NioEvetnLoop的朋友应该知道,所有的Io事件和任务队列中的任务,都是在run()方法中被执行到,所以run()是NioEvent Loop的核心方法,不熟悉的朋友也没事,后面会有单独篇章进行讲解,在这里只需要知道run()里面处理了什么即可。#N

2021-11-28 16:09:25 2371

原创 Spring IOC源码分析

阅读前建议读者先掌握Spring中的基本概念,本文从源码角度分析IOC容器的创建过程,大体涉及两个重要部分,一个是Bean容器的创建,一个是Bean的生命周期,建议在阅读时自己跟着源码一起走一遍流程。注意:因为版本的不同,源码小部分会有一定变化,不过不影响大体流程,核心部分都还是相同的。然后本文不对Spring中涉及的一些概念做解释,仅分析启动流程。让我们先来看一下最基本的Spring容器的demopublic static void main(String[] args){ Application

2021-11-26 17:43:37 415

原创 Netty服务端启动流程源码分析

Netty服务端启动代码模板 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); //设置线程组 b.group(bossGroup, worke

2021-11-25 18:07:52 451

原创 Zookeeper分布式锁测试

环境准备:windows:jdk8+nginx+ab压测centos7: redis+zookeeper3.3.6ab下载链接:https://www.apachelounge.com/download/测试思路:windows下使用springboot编写秒杀接口,商品数据存在redis,运行三个服务,利用nginx做代理,使用ab分别测试单机锁,自实现zookeeper分布式锁和Curator框架提供的分布式锁区别。代码如下:pom.xml<?xml version="1.0"

2021-07-05 15:17:29 386

原创 Zookeeper实现简单分布式锁

实现步骤:使用zk的临时节点和有序节点,每个线程获取锁就是在zk创建一个临时有序的节点,比如在/locks目录下。创建节点成功后,获取/locks目录下的所有临时节点,再判断当前线程创建的节点是否是所有的节点的序号最小的节点如果当前线程创建的节点是所有节点序号最小的节点,则认为获取锁成功。如果当前线程创建的节点不是所有节点序号最小的节点,则对节点序号的前一个节点添加一个事件监听。比如当前线程获取到的节点序号为/locks/seq-00000003,然后所有的节点列表为[/locks

2021-07-05 14:48:09 189

原创 ojbdc14jar报NullPointerException

oracle 10g版本使用ojdbc14.jar,会引发空指针异常,这是该jar包的bug,请改用ojdbc6.jar

2021-06-26 16:36:02 118

原创 Job for tomcat.service failed because the control process exited with error code. See “systemctl sta

centos 7配置tomcat自启动时报以下错误Job for tomcat.service failed because the control process exited with error code. See "systemctl status tomcat.service" and "journalctl -xe" for details.使用systemctl status tomcat.service命令查看报错信息报错提示说是缺少JAVA_HOME或JRE_HOME环境变量,就

2021-05-20 21:08:54 5052 2

原创 centos7 nginx配置开机自启动

vi /etc/init.d/nginx添加以下配置#!/bin/bash# chkconfig: - 85 15# description: nginx is a World Wide Web server. It is used to serve set -ePATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binDESC="nginx daemon"NAME=nginxDAEMON=/usr/local/n

2021-05-10 21:00:10 168

原创 super()和this()为什么不能同时出现在一个构造中

java语言规定,在执行该类构造前必须先执行父类的构造,直到Object类的构造。因此任何构造的第一句,必须执行父类的构造,如果没有添加super(),那么编译器会为该构造默认添加一个super()。如果使用super显示的调用父类构造,就用指定的那个父类构造,否则使用默认的无参构造。但该类构造中出现了this()时,会在该构造中调用本类的其他构造,但最终还是会在调用链的底端调用到父类的构造。所以如果super()和this()同时存在,那么就会出现两次初始化父类。第一次是super()调用父类构造,第

2021-05-10 16:46:41 3619 4

原创 单例模式双重检查锁问题分析

public class Singleton { private Singleton(){} private static Singleton instance; public static Singleton getInstance(){ //第一次判断,如果instance的值不为null,不需要抢占锁直接返回对象 if(instance==null){ synchronized (Singleton.class){

2021-05-06 14:15:33 332 2

原创 SpringBoot整合Mongodb去掉_class字段

今天在做springboot整合mongodb时,发现添加文档会自动添加一个_class的字段,看了很多篇文章,版本都比较老,通过官网的描述,再手动修改了一点,终于成功了。springboot版本<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

2021-04-25 22:20:24 2183

原创 axios发送请求时params和data的区别

今天在写一个小案例时,前端使用axios和后端交互,踩了一个坑。后端图片前端图片然后就一直报错,说请求参数“content”不存在然后查看了请求信息,发现参数又确实存在结果将axios中的data改为params,后端就能获取参数了。查找资料还有翻阅以前的代码之后,发现如果使用data,后端请求参数需要使用@RequestBody注解,而params则对应@RequestParam注解。...

2021-04-09 16:06:44 246 3

原创 JVM(八)运行时数据区之方法区

JVM(八)运行时数据区之方法区方法区同堆一样,也是线程共享,并且具有垃圾回收动作的一块区域,用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据。(上图根据jdk不同版本,有细微区别)方法区可以说只是一个逻辑区域,而实际上不同的虚拟机有着对方法区不同的实现。对于Hotspot来说,随着Jdk版本的演进,方法区的落地实现也有很大的区别,主要还是体现在jdk6,7,8三个版本中。首先还是说说方法区主要存放了哪些信息吧。1.类型信息这里说的类型包括class、inte

2021-04-08 17:29:58 196

原创 JVM(七)运行时数据区之堆

堆栈,对于刚学习java的同学来说都不陌生,都知道堆管内存,栈管引用。例如:Person p=new Person();这句代码,p是一个Person类型的变量,存在栈中,而new Person()则是在堆中开辟了一块内存空间,用来存储p的实际数据信息。在前面讲完栈之后,我们知道p是存在栈中的局部变量表里,那么学习完堆之后,大家应该会有更深的理解。堆是虚拟机所管理的内存中最大的一块,堆不同于前面说的程序计数器、本地方法栈、虚拟机栈,堆是被线程共享的,在虚拟机启动时被创建。堆内存的唯一目的就是存放对象实例,

2021-04-06 15:14:30 100

原创 JVM(六)方法调用(补充知识)

方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还未涉及方法内部的具体运行过程。一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(也就是直接引用)。这个特性给Java带来了更强的动态扩展能力,但也使得Java方法调用过程变得相对复杂,这些调用需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。1.解析所有方法调用的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段

2021-04-05 16:48:28 169 2

原创 JVM(五)运行时数据区之虚拟机栈(Java栈)

Java栈示意图Java虚拟机栈与程序计数器、本地方法栈一样,也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行时,虚拟机都会同步创建一个栈帧(Stack Frame,下面讲解)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用到执行完毕的过程,就对应着一个栈帧的入栈和出栈。栈帧栈中的元素称为栈帧,栈帧中存储了方法的局部变量表、操作数栈、动态连接、方法返回地址和一些附加信息。一个栈帧需要分配多少内存,并不会收到程序运行期变量

2021-04-02 11:44:59 161

原创 JVM(四)运行时数据区之程序计数器和本地方法栈

运行时数据区(概念模型,各款虚拟机具体实现有所不同)由于程序计数器和本地方法栈比较简单,就放在一个篇章进行讲解。1.程序计数器程序计数器是一块比较小的内存空间,它可以看作是当前线程所执行的字节码的行号提示器。由于Java虚拟机的多线程是通过线程轮流切换、分配处理器时间片来实现的,所以一个处理器(或一个内核)都只会执行一条线程中的指令,因此每条线程都会有一个独立的程序计数器用来保存程序执行情况。各线程互不影响,独立存储,我们称这类内存区域为“线程私有”。如果线程正在执行的是一个Java方法,这个计数

2021-04-02 10:17:32 175 1

原创 JVM(三)类加载子系统之类加载过程

1.加载加载(Loading)阶段是整个类加载(Class Loading)过程中的一个阶段,Java虚拟机需完成以下三件事情:​ 1)通过一个类的全限定名来获取定义此类的二进制字节流​ 2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构​ 3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问入口第一条规则并没有指明二进制字节流必须从某个Class文件中获取,例如:从zip包读取,Jar、War等;网络中获取,Web Applet;运.

2021-04-01 14:28:23 166 1

原创 JVM(二)类加载子系统之类加载时机

类加载子系统示意图Java代码执行流程类加载时机​ 一个类型从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析统称为连接。​ 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言地运行时绑定特性(也称为动态绑定或晚期绑定)。这些阶段通常都是互

2021-04-01 09:59:37 120 1

原创 JVM(一)Java虚拟机基本结构

JVM(一)Java虚拟机基本结构java虚拟机结构示意图1.类加载子系统​ 负责从文件系统或网络中加载class文件,classLoader只负责class文件加载,是否可以运行由执行引擎决定。加载的类信息存放于方法区,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)2.运行时数据区​ Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。其中包含程序计数器(Pr

2021-03-31 22:58:43 206 4

空空如也

空空如也

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

TA关注的人

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