- 博客(42)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 springboot
文章目录创建ApplicationContextInitializer创建ApplicationListener创建SpringApplicationRunListener触发ApplicationStartingEvent事件,onApplicationEvent方法创建ApplicationContextInitializer创建ApplicationListener创建SpringApplicationRunListener触发ApplicationStartingEvent事件,onA
2021-10-03 08:59:40
496
原创 kafka集群内网穿透问题
kafkaserver*.properties中的配置listeners=PLAINTEXT://0.0.0.0:9092advertised.listeners=PLAINTEXT://外网代理ip:9092
2021-07-29 10:08:42
363
原创 实例化META-INF/spring.factories
实例化META-INF/spring.factoriesexampleorg.springframework.boot.SpringApplication#getSpringFactoriesInstances(java.lang.Class<T>, java.lang.Class<?>[], java.lang.Object...)加载spring.factories传入ClassLoader使得真正所有包下的META-INF/spring.factories
2021-07-02 11:00:12
276
原创 springboot优雅的配置跨域拦截
@Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.setMaxAge(18000L...
2021-07-02 10:55:38
194
原创 构建spring相关项目
文章目录github加速spring-frameworkspring-bootgithub加速使用gitee克隆github中的仓库,然后使用gitee克隆(不推荐, 如果需要和github保持一致需要一直复制)下载油猴插件, 安装链接脚本, 非广告spring-framework克隆代码到本地, githubgradle可以指定gradle版本编译,最好下载源工程指定的版本可修改maven仓库,找到目录下settings.gradle,在原有的基础上添加阿里仓库pluginMan
2021-03-27 20:01:29
130
原创 排查线上问题
文章目录背景arthas官网远程调试(代码要一致)resinjava ... -jar ***.jarIdea增加remote启动方式背景本地没问题,上线有问题支付、各种回调、没法调试arthasjad:支持jvm中类的查看watch:查看某次调用的入参、返回、异常抛出、成员变量热部署、反编译。。。。。官网官网远程调试(代码要一致)resin<jvm-arg>-Xdebug</jvm-arg><jvm-arg>-Xnoagent</
2021-03-24 18:06:00
81
原创 nacos
文章目录nacos安装官网主要功能注册中心配置中心控制台nacos安装传包解压tar -xvf nacos-server-1.4.1.tar.gz cd nacos/bin在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)如果默认的java_home不是java8或以上,在bin/startup.sh中添加本地java_home[ ! -e "$JAVA_HOME/bin/java" ]
2021-03-24 17:54:25
135
1
原创 jenkins介绍
文章目录背景后端前端问题CI/CD(持续集成)需求组实现上线流程问题简单配置为什么jenkins背景现在上线流程:后端叫上n个人拉代码(git checkout 。。。 )maven -> 指定环境 -> 打包(mvn clean package -Pdev)传包(ssh …)ssh 到服务器上。。。。。执行一堆命令(cd。。。stop。。。mv。。。start。。。)前端npm build 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。问
2021-03-24 17:40:01
133
原创 tcp
文章目录标志位说明三次握手问题四次挥手标志位说明SYN:携带这个标志的包表示正在发起连接请求。因为连接是双向的,所以建立连接时,双方都要发一个SYN。FIN:携带这个标志的包表示正在请求终止连接。因为连接是双向的,所以彻底关闭一个连接时,双方都要发一个FIN。RST:用于重置一个混乱的连接,或者拒绝一个无效的请求。Seq:当前报文开始的序号Len:当前报文长度ACK:确认号。确认目标报文的Seq+Len+1。即为发送方的下一个报文的Seq三次握手问题Q: 为什么采用三次握手,不是
2021-03-19 09:04:29
391
原创 docker
文章目录使用常见问题容器内时区问题docker rundocker-compose清理Docker系统中的无用数据安装docker安装docker-compose安装docker-machine安装docker swarm使用常见问题容器内时区问题docker rundocker run -v /etc/localtime:/etc/localtime:ro xxxxdocker-compose volume: - /etc/localtime:/etc/localtime:ro
2021-03-11 16:51:58
92
原创 安装kubernetes
这里写自定义目录标题欢迎使用Markdown编辑器新的改变kubeadm方式安装 runtime(docker)提前准备1. 设置仓库2. 设置阿里安装源3. 安装docker-ce4. 设置守护线程5. 将docker交给systemctl管理6. 设置阿里云镜像加速安装 kubeadm、kubelet 和 kubectl4. 部署 Kubernetes Master5.kubectl使用户可用6. 安装CNI7.验证8.检查组件健康状态8.1 controller-manager、scheduler组件
2021-03-11 16:48:28
78
原创 java.lang.IllegalStateException: Cannot get a text value from a numeric cell
原因Excel中数值类型值在程序中按字符串类型获取解决 /** * 拿到不同类型单元格中的值 * 1. 字符串: 字符串 * 2. 布尔: toString * 3. 数值(double): 格式化后的字符串 * @param cell 获取的单元格 * @return 单元格中的值 */ private static String getCellValue(Cell cell) { String
2020-07-02 11:45:43
3111
原创 B+Tree
演示地址https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html能减少树查询时的越级寻址每个树非叶子节点上,可能有多个数据, 并且有子节点地址可以指定每个树节点上最大的数据长度,如果根节点超过最大长度, 树会加深叶子节点维护了有序链表应用mysql的索引Innodb索引和数据都在一起(聚簇索引)的形式MyISAM 索引指向磁盘文件的地址, 索引和数据分开虽然hash索引不需要寻址(不考虑hash冲突), 但是在范围
2020-06-28 00:03:42
107
原创 哈希表
演示动画https://www.cs.usfca.edu/~galles/visualization/OpenHash.html哈希表由一个数组实现, 因为数组有下标, 而且连续 ,方便拿到哈希索引直接找到对应位置哈希算法java HashMap哈希表为特殊的哈希表,长度为2的整数幂每个value根据hashCode处理后,与哈希表长度按位&, 正好能得到0 -> 哈希表长度减一几种类型的数据除留余数(实现简单)根据固定的规则拿到代表value的数字除以哈希表的长度
2020-06-27 23:41:56
106
原创 线性表
栈后进先出应用函数执行模型任意树的深度遍历算法…队列先进先出应用有序的任务列表(消息队列, Lock线程执行队列, 线程池任务队列)任意树的广度遍历算法…数组可以对,栈,队列都可以进行实现内存连续, 能够根据首地址,计算指定下标处的值.查询效果好,频繁插入删除, 涉及挪动操作位置后所有元素的位置,性能差链表可以对,栈,队列都可以进行实现每个元素都是一个节点, 每个节点都有指向上一个或下一个元素的地址插入,删除时,只需把操作元素两侧的元素相关联即可
2020-06-27 23:19:10
73
原创 红黑树
红黑树的特征要求所有节点不是红色的就是黑色的.根节点是黑色的.所有叶子都是NUIL节点, 所有叶子都是黑色.每个红色节点的两个子节点都是黑色, 也就是不可能有两个相连的红色节点从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点.( 两个相连的黑色节点算一步, 一个节点...
2020-06-27 22:56:41
100
原创 线程池简单实现
线程池简单实现UML核心代码任务队列满时执行的拒绝策略核心线程池线程池中使用的任务模型任务队列其他一些接口的定义全部代码UML核心代码任务队列满时执行的拒绝策略枚举单例 + 策略(DenyPolicyStrategy.java)package com.example.executor.service.impl;import com.example.executor.exception.RunnableDenyException;/** * 任务数量达到上限时, 线程池处理的三种策略
2020-06-25 16:06:00
122
原创 设计模式(四) 模板模式
借用设计模式(二)中的案例问题分析拿AliSmsAdapter举例public class AliSmsAdapter implements SmsService { /** * 发送验证码类的短信方法 * 传递一些需要的参数 * * @param paramMap */ @Override public Map<String, String> sendCodeSMS(Map<String, String&
2020-06-22 00:28:52
96
原创 设计模式(三) 策略模式
借用设计模式(二)中的案例问题分析在Demo中部分代码 /** * 重置密码方法 */ public void resetPassword() { String smsType = "huawei"; sendCodeSMS(smsType, new HashMap<>()); } public Map sendCodeSMS(String smsType, Map<String, String&
2020-06-22 00:06:33
105
原创 设计模式(二) 适配器模式
业务场景制作一个发送短信的接口, 注册, 重置密码方法都要使用系统对接的短信平台有好多,阿里,腾讯,华为每个平台都有自己的sdk可以使用短信大致可分为几类如: 验证码短信,通知类短信UML类图调用者只依赖SmsService接口,当有平台的sdk有变化或者增加短信平台时,可避免大量修改调用者代码代码各个适配器中的代码看起来可能一样,但是不同平台都有自己处理参数和调用的方法,实际实现还是有区别的Demo.javapublic class Demo { SmsServ
2020-06-21 23:41:40
202
原创 ClassPathXmlApplicationContext加载过程
ClassPathXmlApplicationContext创建过程调用父类中的方法创建一个上下文对象org.springframework.context.support.AbstractApplicationContext#AbstractApplicationContext(org.springframework.context.ApplicationContext)加载applicationcontext.xml中的配置生成一个标准的环境,org.springframewor
2020-06-21 17:24:57
713
原创 设计模式(一) 单例
单例饿汉式懒汉式加锁双重校验为什么要判断两次instance是否为null为什么instance要添加volatile关键字静态内部类的方式枚举饿汉式优点: 不用考虑多线程问题,利用clinit机制实现单例对象缺点:类加载时,即使用不到当前对象也要创建对象,占用内存/** * 饿汉式 * 私有化静态空参构造器 * 初始化静态变量 * 添加getInstance方法 */public class SingleTon { private static SingleTon inst
2020-06-19 22:20:49
86
原创 synchronized锁
锁升级过程无锁状态偏向锁: 一旦有线程对该对象加锁,markword区前54位指向当前线程指针自旋锁(无锁,轻量级): CAS一旦有多个线程竞争锁,在每个线程栈帧内生成Lock Record, 前62位保存拿到当前执行权限的线程的Lock RecordLock Record中保存之前对象头中被替换掉的内容重量级: 自旋10次,升级为重量级锁, 其他线程不再自旋,进入队列等待状态, 借用操作系统资源加锁锁降级: gc时markdown头中的信息字节码命令monitorenter m
2020-06-16 23:12:56
3796
原创 object在内存
测试代码引入maven环境 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency>测试代码public class Obj
2020-06-16 22:46:20
223
原创 java中的引用类型
强引用(strong references)如果有该引用关系,gc就不会回收该对象.常见的赋值操作都是强引用软引用(soft reference)当内存不足时,会打破该引用,将对象回收可用于缓存弱引用(weak reference)下次gc时就会打破该引用,将对象回收虚引用(phantom reference)甚至不能算作一种引用, 因为从reference中不能拿到对象final引用(final reference)有默认实现...
2020-06-14 17:26:03
131
原创 redis一些学习笔记
redis一些学习笔记安装持久化快照 RDB手动快照后台异步打快照RDB特点优点:缺点操作过程 AOF备份时机:数据删除策略定时删除常见问题缓存预热缓存雪崩缓存击穿缓存穿透安装如果遇到环境没有安装,先安装环境下载安装包wget http://download.redis.io/releases/redis-4.0.0.tar.gz解压tar -xvf redis-4.0.0.tar.gz进入redis解压的目录,编译make 或 (make MALLOC=libc)安装make in
2020-06-14 16:34:19
106
原创 java8 + redis + springboot 分布式布隆过滤器实现
分布式BloomFilter实现BloomFilter选用redis实现的好处实现索引个数,bit数组长度hash算法initBloomFilter方法代码BloomFilter请求到达正式业务之前, 判断该请求是否有效维护一个大的bit数组, 把有效key的一次或多次的hash索引位置标志已存在. 当有请求进来时, 计算进来的key的hash索引, 判断每一个索引的值是否为true.常用于处理缓存穿透问题选用redis实现的好处部署高可用节点时, 减少每一个节点的开销redis可以持久
2020-06-14 11:15:03
994
原创 创建对象时的内存分配算法
判断空闲内存根据内存是否规整使用不同的方法内存规整:指针碰撞在空闲区域,按照分配顺序一个接着一个往后排。常用于自带内存整理的垃圾收集器。内存不规整:空闲列表虚拟机会维护一个空闲内存列表,会把对象分配到空闲的内存上。空闲列表的优化在CMS的实现里面,为了能在多数情况下分配得更快,设计了一个叫作Linear Allocation Buffer的分配缓冲区,通过空闲列表拿到一大块分配缓冲区之后,在它里面仍然可以使用指 针碰撞方式来分配。多个线程同时争抢一个内存位置CAS方式如果分配内存失败重试
2020-06-11 20:43:32
189
原创 判断对象是否存活算法
判断对象是否存活算法引用计数算法对象每当被引用一次在其头部计数器加一,引用失效,头部减一,计数器为0时代表该对象没有任何引用,视为垃圾。缺点:无法解决循环引用问题。可达性分析(java使用)通过GC Roots沿引用开始搜索,没有被扫描到的即视为垃圾。GC时常说的标记过程就是应用可达性分析算法进行标记;注,标记标记到的都是存活的对象。java中的GC Roots虚拟机栈中的引用的对象常量池中的引用(jdk7及以前中的String对象全部分配在StringPool中,jdk8开始的
2020-06-10 23:43:49
177
原创 垃圾收集器(五) G1收集器
特点优先处理回收价值收益最大的Region(Garbage First)逻辑分代,物理不分代既可以回收年轻代,又可以回收老年代保证低延迟的前提下,尽量提高吞吐量维护一个价值列表(价值:回收所获得的空间大小以及回收所需时间的加权值)jdk9默认收集器Region将堆内存划分为多个Region,每个Region大小在1MB~32MB,并且应为2的N次幂Region分为Eden,Surviver, Old, Humongous(存放大对象)一次GC,多个Region之间使用标记整理算法,
2020-06-09 22:28:08
207
原创 垃圾收集器(四) CMS收集器
常见组合Serial + CMS + SerialOld(jdk8废弃)ParNew + CMS + SerialOld ((jdk9不推荐使用,随着jdk14CMS的废弃,此方案废弃)特点第一款能和用户线程并发执行的垃圾收集器作用在老年代标记清除算法注重低延迟缺点会存在与用户线程竞争cpu运算资源的情况,导致用户线程执行变慢由于gc和用户线程并发执行,需要堆内存到达一定比例时就要开始gc,在并发标记过程中,如果与gc Root直接关联的对象成为了垃圾(也就是浮动垃圾),这个垃
2020-06-09 21:00:42
213
1
原创 垃圾收集器(三) Parallel收集器
常见组合Parallel Scanvege + ServialOld(jdk14废弃此方案)Parallel Scanvege + Parallel Old(jdk8默认方案,jdk14现役)特点多线程并行收集Parallel Scanvege标记复制算法 ,Parallel Old标记整理算法注重吞吐量的方案自适应策略PP组合运行图使用Parallel使用Parallel: -XX:+UseParallelGC, -XX:+UseParallelOldGC,默认相互激活并
2020-06-08 23:15:27
980
原创 垃圾收集器(二) ParNew收集器
常见组合ParNew + CMS(jdk9不推荐使用,随着jdk14CMS的废弃,此方案废弃)ParNew + SerialOld(jdk8废弃)特点Serial的多线程并行版本(在垃圾收集时间有多个线程进行垃圾收集)作用在新生代采用标记复制算法在单核心机器上效率低(涉及到多个线程争抢cpu,切换线程上下文降低效率)运行图使用ParNew使用ParNew: -XX:+UseParNewGC指定垃圾收集的线程数:-XX:ParallelGCThreads(默认为cpu核心数)
2020-06-08 22:42:55
345
原创 垃圾收集器(一) Serial收集器
常见组合Serial+SerialOld(jdk14现役)Serial+CMS(jdk8开始废弃)特点单线程(进行gc时只有gc线程运行,所有其他线程停在安全点,STW)java client模式下的默认垃圾收集器(windows 32位默认模式)对于单核处理 器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以 获得最高的单线程收集效率。管理空间在几十兆甚至一两百兆。Serial使用标记复制算法,SerialOld老年代使用标记整理算法
2020-06-08 22:28:50
378
原创 HashMap关键方法
这里写目录标题1. 类介绍二级目录三级目录1. 类介绍官方api地址该类是基于哈希表对Map接口进行的实现。该实现提供了所有可重写的map操作,并允许null值和null键。(HashMap与Hashtable大致相同,区别是Hashtable是同步的,并且Hashtable的key和value都不允许为null。)这个类不能保证map的顺序;不同时间相同的键值对也可能顺序不一样。二级目录三级目录...
2020-06-07 22:49:57
122
原创 HashMap中树的相关操作
树操作1.数据模型2.查找根节点3. 树节点查找4. hash索引相同时比较大小5.链表转为树6. 树put节点方法7.树删除节点操作8.扩容时,分散相同hash索引方法1.数据模型 /** * hashMap超长时的数据模型,红黑树 * 并且在树中维护了一个潜在的双向链表(原链表的关系) */ static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
2020-06-07 22:48:34
202
原创 双向链表LinkedList 关键方法源码解读
/** * Node节点,说明是双向链表 */ private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; th.
2020-06-05 23:42:45
111
原创 ArrayList常见方法解读(源码,以及对内存使用,gc的影响)
扩容方法 ensureCapacity, 普通扩容类似只是截取了此方法中的5,6,7步。MAX_ARRAY_SIZE = Integer.MAX_VALUE-8;Integer.MAX_VALUE = 0x7fffffff; /** * 对elementData扩容 * 1. 原elementData=[], minCapacity<=10,无效操作 * 2. 原elementData=[], MAX_ARRAY_SIZE>=minCapacity>10, .
2020-06-04 22:51:55
178
原创 java运行时数据区内存
程序计数器每一个线程独享一个程序计数器,在运行时数据区唯一不会发生内存溢出的区域。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地 址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。虚拟机栈每一个线程独占一个虚拟机栈。每当一个线程执行,jvm都会创建一个对应的栈帧。1)栈帧内部包含局部变量表、操作数栈、动态连接、方法出口等信息(因为虚拟机栈是线程独享的,对于局部变量表中的变量来说不会发生被多线程同时操作的数据安全...
2020-06-03 22:11:46
119
原创 类加载器,双亲委派模型java9之前之后的区别
jdk8以及以前的类的加载机制,主要依托双亲委派模型对类进行加载启动类加载器负责加载目录(<JAVA_HOME>\lib)下或者被-Xbootclasspath参数所指定的路径中存放的, 制定包名文件名的类(jdk内置的包名)。该加载器属于jvm,使用c语言编写,如果使用该加载器的类获取其加载器会出现null情况,如:2. 扩展类加载器负责加载载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所 指定的路径中所有的类库。该加载器使
2020-06-02 23:12:57
528
ArrayList.java
2020-06-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人