自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 资源 (1)
  • 收藏
  • 关注

原创 brew更新提示:fatal: not in a git directory 如何解决

brew无法更新,提示问题

2022-08-15 10:46:45 7422 1

原创 InstantiationAwareBeanPostProcessor使用注意事项

注意 sprin bean的初始化跟jvm类加载不同sprin bean 是先实例化,在去初始化bean的属性,jvm是先初始化再去实例化(spring生命周期可以百度很多讲解)概念Bean创建过程中的“实例化”与“初始化”名词● 实例化(Instantiation): 要生成对象, 对象还未生成.● 初始化(Initialization): 对象已经生成.,赋值操作。BeanPostProcessor :发生在 BeanDefiniton 加工Bean 阶段. 具有拦截器的含义. 可以拦截.

2021-11-20 23:35:43 660

原创 模仿Autowired生成一个自定义接口代理对象的后处理器

1.编写代理类package com.cx.test.demo.spring.proxy;import org.apache.commons.collections4.CollectionUtils;import org.apache.commons.collections4.MapUtils;import org.apache.commons.lang3.ArrayUtils;import org.springframework.beans.factory.NoSuchBeanDefiniti

2021-11-20 22:46:38 632

原创 并发场景多个线程统一全局超时时间

业务场景我需要请求算法那边获取多业务场景的的数据每个业务场景的数据都不相同但是由于是主链路的接口不想等待太长时间想共用500毫秒(可动态配置) 此时想到的解决方案。方法1自定义超时时间List<CompletableFuture<Integer>> list = new ArrayList<>(); //最大等待时间 long maxTime = 500L; //开始时间 long startTime

2021-11-20 22:28:54 789 2

原创 AQS原理以及ReentrantLock如何应用AQS

AbstractQueuedSynchronizer (AQS)抽象的队列同步器提供一个框架,用于实现依赖于先进先出 first-in-first-out (FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。这个类被设计成是大多数依赖单个原子整型来表示状态的同步器的有用基础形式(不同场景该整型值代表含义不同 具体通过子类来定义)。子类必须定义更改此状态的受保护(protected)方法,并定义该状态对于获取或释放此对象意味着什么。考虑到这些,这个类中的其他方法执行所有的排队和阻塞机制。子类可以维

2021-11-04 14:54:30 186

原创 G1收集器概念,三色标记算法

G1垃圾两种回收模式Mixed GC:会同时对年轻代和部分的老年代进行收集全局并发标记(global concurrent marking)类似阈值当global concurrent marking 超过了这个比例 下次GC就会发生Mixed GC 当全局并发标记完其实此时就知道old区域的垃圾占比 超过改值就会发生Mixed GC也就是说当前老年代区域中的存活对象所占内存小于这个值(垃圾多于存活对象),超过了就说明改区域对象引用多于设置值就不用回收意思就是说最多能回收

2021-11-04 14:46:02 749

转载 当程序员具备了抽象思维

若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇前言抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维的“游戏”,虽然我们在使用键盘、显示器,打开电脑可以看到主板、硬盘等硬件。但我们即看不到程序如何被执行,也看不到 0101 是如何被 CPU 处理的。我们工程师每天都要动用抽象思维,对问题域进行分析、归纳、综合、判断、推理。从而抽象出各种概念,挖掘概念和概念之间的关系,对问题域进行建模,然后通过编程语言实现业务功

2021-10-23 19:39:55 202

原创 关于git提交代码报错:Push to origin/master was rejected

水深火热的艰苦奋斗以后,Push to origin/master was rejected推到主分支时被拒绝了原因是因为本地仓库和远程仓库的代码不一样。简单来说就是代码冲突了,复杂来说就是你动了不该动的代码。找到了问题所在,接下来就是解决bug的时间了,欢迎收听你的月亮,我的心…解决方案No.1一般代码冲突的问题,是你在代码里随手敲了个空格,tab,或者脸滚了一下键盘,导致代码中出现了原本不该有的东西。此时,你需要做的就是 Ctrl + z 一直撤销,将代码恢复,注意不要把你自己修改的代码也撤回了。

2021-01-20 16:32:04 305 2

原创 ForkJoinPool和ForkJoinTask联用,示例解析

ForkJoinPoolForkJoin算法执行大概流程任务的拆分 fork,直到判断任务已经足够细粒度(原子任务),底层用到递归 类似微服务项目此时开始执行任务 当前被分解的任务不需要返回值那么任务完成则执行结束,当需要返回值时就会有下面的join操作:每个细粒度join完会和同层被fork的任务进行join得到返回的结果由此我们可以看出对于ForkJoinPool来说一个大任务会细分多个子任务,每个子任务可以继续划分多个子任务直到不能划分为主,当各个阶段的任务都执行完此时会合并各个阶段返回的

2020-12-26 21:13:12 1039

原创 声明式事务不回滚@Transactional的避坑正确使用

在我们开发中很多时候都要用到事务,例如转账等等的操作,这些我就不多BB了,哈哈。下面我来说下关于Spring的声明式事务@Transaction的坑,我想最大的坑应该还是代理事务不生效的问题,下面放个链接,以免别人问。链接下面我要说的又是一个坑,也是声明式事务不回滚的问题。重点来了 来了。。。。@Transactional(rollbackFor = Exception.class) //一定要加 rollbackFor = Exception.class 参数,下面会说明原因: //一定要加 ro

2020-12-25 14:42:29 490

原创 线程池execute,shutdown,shutdownNow方法源码解析,分析线程池执行策略,运行状态

ExecutorServicesubmit重载方法线程池有有两种提交任务的方法一种是execute由根接口Executor提供,第二种是ExecutorService提供的submit方法 该方法有三种重载方法,我们完全可以拿submit方法替代execute方法;本质上这四种方法最后都殊途同归都是调用execute方法submit执行的任务都是异步执行返回值为Future我们可以通过Future .get();获取异步任务执行的结果具体实现在AbstractExecutorService当值

2020-12-20 15:36:11 985

原创 线程池ThreadPoolExecutor详解,Executor,拒绝策略对应使用规则源码解析

目录线程池ExecutorThreadPoolExecutor线程池参数int corePoolSize 核心线程数int maximumPoolSize 最大线程数long keepAliveTimeBlockingQueue workQueue 阻塞队列ThreadFactory threadFactory 线程工厂Executors.DefaultThreadFactory 线程池默认使用的线程工厂RejectedExecutionHandler handler 拒绝执行处理器(4种拒绝策略根接口)R

2020-12-15 16:46:23 1090 1

原创 ThreadLocal的使用规则和底层源码解析,以及造成OOM的原因和解决方案

目录ThreadLocalThreadLocalMapThreadLocal.setThreadLocalMap.getMapThreadLocal.getThreadLocalMap.getEntryThreadLocal使用规范ThreadLocal此类提供线程局部变量。这些变量不同于普通的对应变量,因为每个访问一个(通过其get或set方法)的线程都有自己独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态(private static (在java当中可以理解static就是全局

2020-12-06 21:54:45 536 4

原创 Lock和Condition方法解析,有界缓冲区如何通过Lock,Condition实现

LockdocLock实现提供了比使用synchronized 同步方法和语句块获得的更广泛的锁操作。它们允许更灵活的结构,可能具有完全不同的属性,并且可能支持多个关联的条件(Condition)对象。锁(Lock)是一种工具,用于控制多个线程对共享资源的访问。通常,Lock提供对共享资源的独占访问:一次只有一个线程可以获取锁,而对共享资源的所有访问都需要先获取锁。但是,有些锁可能允许并发访问共享资源,例如读写锁的读锁(ReadWriteLock)。synchronized 同步方法和语句块的使用

2020-11-28 11:43:37 439 2

原创 synchronized关键字偏向锁,轻量级锁,自旋锁详解,JVM底层提供的锁优化策略

在JDK1.5之前,我们若想实现线程同步,只能通过synchronized关键字这一方式来达成;底层Java也是通过synchronized关键字来做到数据的 原子性维护的:synchronized关键字是JVM实现的一种内置锁,从底层角度来说,这种锁的获取与释放都是由JVM帮助我们隐式实现的。从JDK1.5开始,并发包引入了Lock锁,Lock同步锁是基于Java来实现,因此锁的获取与释放都是通过Java代码来实现与控制的;然而,synchronized 是基于底层操作系统的Mutex_Lock来实现的

2020-11-17 17:58:02 470 3

原创 synchronized详解,同步锁互斥锁自旋锁分析。MonitorJVM底层实现原理

目录状态对象synchronized修饰代码块synchronized修饰方法synchronized修饰静态方法Monitor设计的概念互斥与同步定义synchronized底层原理用户态和内核态资源调度存在问题解决方案互斥锁属性MonitorMonitor对象是啥?状态对象如果一个对象有被修改的成员变量 被称为有状态的对象相反如果没有可被修改的成员变量 称为无状态的对象示例public class MyThreadTest { public static void main(Stri

2020-11-10 15:15:37 727 10

原创 wait和notify方法详解

wait()使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。换句话说,这个方法的行为就像它只是执行wait(0)一样(如果没有当前对象notify()唤醒就会一直等待)。1.当前线程必须拥有此对象的monitor监视器(锁)。2.当前线程调用wait()方法,线程就会释放此锁的所有权,并等待,3.直到另一个线程通过调用notify方法或notifyAll方法通知在该对象的监视器(锁)上等待的线程唤醒。4.然后线程等待,直到它可以重新获得监视器(锁)的所有权然

2020-11-06 14:51:51 2541 5

原创 G1垃圾收集器堆内存划分,垃圾收集各个阶段解析

评价系统指标重要的的两个因素意思就是说传统收集器只能在吞吐量(parallel scanvenge 收集器) 和 用户线程卡顿(CMS 收集器)取其一。而G1收集器在短时间满足最小化卡顿的同时满足高吞吐量传统垃圾收集器内存布局非G1的垃圾收集器G1垃圾收集器内存布局也就是说上图中每个颜色都是一个regions,region之间不一定连续,每个region的可能的角色有三种 eden survivor old。...

2020-10-28 15:04:29 2525 3

原创 CMS收集器详解

也就是说当业务线程在执行的时如创建对象只有在线程处于安全点和安全区域时才能触发GC 当线程没有处于安全点和安全区域 hostpot虚拟机采用的是主动式中断 。

2020-10-25 12:39:21 1349 4

原创 垃圾回收器常见参数使用以及日志分析

/** * -verbose:gc 在控制台输出GC日志 * -Xms20m JVM堆空间初始容量20m * -Xmx20m 堆空间最大20m * -Xmn10m 堆新生代最大内存空间10m * -XX:+PrintGCDetails 在控制台输出GC详细日志 * -XX:+SurvivorRatio=8 幸存者 比率=8 * 当咱们设置新生代最大内存我饿10m 幸存者比例为8时,fromsurvivor 和ToSurvivor 比例相同为1:1(如果不能整除就取近似值) 三者比例为8:

2020-10-22 16:18:29 404

原创 jvisualvm解决线上数据涌入出现的内存溢出(OOM)

最近在项目交付测试的过程中,经常有应用在一顿操作之后界面就一直在转,最后报了无法获取数据的错误,查看日志发现有报错,其中关键点在于java.lang.OutOfMemoryError:Java heap space,jvm内存溢出,如下图经过网上一顿搜索,发现有很多可以监测定位的方法,但是由于和自己的业务场景不合,都以失败而告终。最终尝试出一条可以解决自己问题的路径,记录下来以供下次复查。内容提纲环境和工具操作系统:centos7部署环境:docker/k8sjdk:1.8.0_191开发

2020-10-16 17:58:20 952

原创 垃圾回收器原理内容解析

上述三种条件满足其一就会被回收掉方法区回收注意:系统,扩展,根类加载器全局唯一实例 也就是说 这三种加载类加载是无法被GC ,其加载的类永远不会被卸载。自定义的类加载器才会被回收,所以方法区中的类被回收条件很苛刻但是还是可能被回收...

2020-10-14 11:17:07 319

原创 Mysql忘记本地密码如何重置密码【ERROR 1820 (HY000)】

忘记本地MySQL数据库密码,解决方案,分以下10个步骤:参考链接: https://blog.csdn.net/weidong_y/article/details/80493743; https://blog.csdn.net/anzhen0429/article/details/78296814;数据库版本:5.7.21平台:win71、打开cmd窗口,进入 MySQL的安装目录。2、停止MySQL的服务。已经停止了。右键MySQL

2020-09-30 08:42:30 1805 3

原创 JVM运行时内存模型详解,元空间优化,new关键字详解,堆栈溢出详解

这里写目录标题jvm运行时数据分区new 关键字创建对象的3个步骤:指针碰撞,空闲列表对象内存的布局对象的访问定位OutOfMemoryError 堆内存溢出异常StackOverflowError 虚拟机栈溢出监控工具死锁jvm运行时数据分区虚拟机栈:Stack Frame 存储栈帧程序计数器(Program Counter) 记录行号方便定位本地方法栈:主要用于处理本地方法 (c++ c 执行的内部方法)堆(Heep): JVM管理的最大一块内存空间 与堆相关的重要概念:垃圾回收器。现代几乎

2020-09-26 11:22:06 711

原创 解释执行与编译执行区别,栈的入栈出栈详解,寄存器与栈指令区别,透过字节码审视动态代理

解释执行与编译执行现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。所谓解释执行,就是通过解释器(类似流)来读取字节码,遇到相应的指令就去执行该指令。所谓编译执行,就是通过即时编译器(Just In Time,JIT)将字节码转换为本地机器码;现代JVM会根据代码热点来生成相应的本地机器码。栈的指令集与基于寄存器的指令集之间的关系1.JVM执行指令时所采取的方式是基于栈的指令集。2.基于栈的指令集主要的操作有入栈和出栈两种。3.基于栈的指令集的优势在于它可

2020-09-22 16:23:48 418

原创 字节码栈帧,方法分派,方法的overload与overwrite的区别,虚方法表注意事项

目录栈帧(stack frame)定义符号引用,直接引用五种方法调用类型非虚方法栈帧储存方法方法的分派静态分派方法的重载动态分派结论方法的重写(overWrite)重写和重载的区别虚拟机动态分派的实现静态分派和动态分派的区别虚方法表方法查看问题栈帧(stack frame)定义栈帧(stack frame):(每个栈帧都是由特定的线程执行的 不存在并发情况)栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构栈帧本身是一种数据结构,封装了方法的局部变量表,动态链接信息,方法的返回地址以及操作

2020-09-20 18:45:09 284 2

原创 Class文件与字节码,机器码的关系,字节码整体结构 常量池表 字段表,方法表等详解

目录class字节码示例字节码整体结构魔数(Magic Number)版本(Version)常量池(Constant Pool)例如总结Mytest1常量池对应的内容访问标志(Access Flags)当前Class名(This Class Name )父类名(super Class)接口(Interface)变量(Feilds)field countfields方法(Methods)方法表(方法数组)Code结构class字节码示例public class MyTest1 { privat

2020-09-13 21:34:09 2286

原创 Java8使用Lambda将一个List均分成指定n个List

public class Test { /** * 计算切分次数 */ private static Integer countStep(Integer size, int input) { return (size + input - 1) / input; } /** * @param list 需要分隔的 集合 * @param input 指定分隔size * @return */

2020-09-11 10:20:22 3289 2

原创 Spring 缓存,创建实例流程分析

目录问题beanDefinitionReader.loadBeanDefinitions(resource);在加载bean定义时有没有创建对象?何时创建bean对象?工厂实例对象分析doGetBeangetSingletonmarkBeanAsCreated(beanName);getSingleton(String beanName, ObjectFactory<?> singletonFactory)createBeandocreateBeancreateBeanInstance bean

2020-09-07 10:43:13 182

原创 Spring源码分析,资源文件Rsource,工厂BeanFactory,读取器BeanDefinitionReader 执行流程解读

示例新增一个Student类/** * POJO: Plain Old Java Object */public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; }

2020-09-01 17:16:11 509 1

转载 深入理解工厂模式

目录一 工厂模式介绍1.1 工厂模式的定义1.2 工厂模式的分类:1.3 在开源框架中的使用1.4 为什么要用工厂模式二 简单工厂模式2.1 介绍2.2 适用场景2.3 简单工厂模式角色分配:2.4 简单工厂实例3 工厂方法模式3.1 介绍3.2 适用场景3.3 工厂方法模式角色分配:3.4 工厂方法模式实例4 抽象工厂模式4.1 介绍4.2 适用场景4.3 抽象工厂方法模式角色分配:4.4 抽象工厂的工厂和工厂方法中的工厂有什么区别呢?4.5 抽象工厂模式实例一 工厂模式介绍1.1 工厂模式的定义

2020-08-31 14:39:58 147

原创 Config原理解析,项目搭建以及如何获取不同环境下的配置文件信息(一)

这里写目录标题原理搭建config项目新增github仓库spring-cloud-config-serverspring-cloud-config-client如何获取的不同环境下的配置文件了?gitHub和config-client客户端yml对应规则原理搭建config项目需要两个项目和github仓库新增github仓库spring-cloud-config-serverpom.xml<?xml version="1.0" encoding="UTF-8"?&gt

2020-08-30 14:18:41 404

原创 Zuul自定义过滤器,ZuulProxyAutoConfiguration 如何生效,以及zuul底层源码过滤器初始化流程

目录自定义ZuulFilter@EnableZuulProxyZuulProxyAutoConfigurationZuulProperties内置过滤器过滤器执行流程ZuulServletFilterProcessorrunFilters筛选器processZuulFilter总结自定义ZuulFilterpublic class MyZuulFliter extends ZuulFilter { /** * 过滤类型 * * @return 过滤类型字符串

2020-08-29 22:31:00 862

原创 Zuul端点详解与过滤器分析(二)

端点如何查看断点映射关系?当我们门为了能看到端点的映射信息可以在zuul中导入actuator <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>我们可以访问http:

2020-08-23 21:27:35 379

原创 Zuul概念原理以及项目的简单搭建(一)

由上图可知 当没有使用网管时每个模块都得去考虑权限控制,限流,网路访问一系列问题,影响性能此时我们可以将这些问题统一的集成到网关当中,由网关统一处理处理完毕在把请求转发对应模块我们在使用网关的时候需要做一个反向代理由于zuul并发量大,此时必须给zuul配置集群一同注册到eureka server上此时nginx就可以通过反向代理得到使用zuul网关由于某些微服务涉及到权限等鉴权问题我们可以将鉴权auth(非业务逻辑)打包到一起生成一个项目放到server上,此时zuul网关在..

2020-08-23 15:17:04 447

原创 hystrix原理以及基本构建,feign和ribbon如何使用熔断器

传统服务中当用户在请求c时 c请求b b请求a时 当多个用户(线程)同时请求c此时由于a迟迟不响应造成线程大面积堵塞 此时a就会发生雪崩(一台机器出现问题导致与其关联的机器也出现问题),同时影响cbHystrix 项目搭建基于ribbon项目进行搭建1.引入Hystrix maven依赖 <dependency> <groupId>org.springframework.cloud</groupId> .

2020-08-22 20:35:49 330

原创 Feign拦截器,底层Feign运行流程核心代码解读(三)

目录RequestInterceptorFeign流程解析FeignClientsRegistrarregisterFeignClientFeignClientFactoryBean.class (重要)ReflectiveFeign总结RequestInterceptordoc可以配置零个或多个requestinterceptor,以便将头添加到所有请求。对于拦截器的使用顺序,不作任何保证。一旦使用了拦截器,目标.apply调用(RequestTemplate)来创建通过客户端.execute(请求

2020-08-22 17:13:20 910

原创 feign重试器与自定义日志级别详解以及日常开发复杂使用场景(二)

重试器如何配置重试器?新建一个EurekaClientFeign 配置类 Feign为我们封装了重试器我们使用只需将其注入到IOC当中@Configurationpublic class FeignClientConfig { /** * 创建重试器 (重试周期(50毫秒),最大重试周期(2000毫秒),最多尝试次数 6次 ) * feign没有采用线性的重试机制而是采用的是一种指数级(乘法)的重试机制 每次重试时间 当前重试时间*= 1.5 * @retu

2020-08-22 14:40:41 377

原创 浅复制与深复制区别以及使用场景和案例

浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。深复制(深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。如何进行类复制?object类当中提供了浅复制的具体方法注意事项由doc我们可以得出以下几点主要事项

2020-08-18 17:36:51 1575 1

原创 Feign项目搭建以及Feign简单使用(一)

创建一个Feign项目yml配置文件server: port: 8888spring: application: name: feign-clienteureka: ## 表示为Erureka客户端 client: ## 单台server为服务器不需要注册到服务器上 register-with-eureka: true ## 获取注册列表的信息 道理同上 基本两者参数是一样的 fetch-registry: t...

2020-08-16 20:49:07 793

java会议室管理系统源码+原型+数据库

java会议室管理系统+原型+数据库 使用jsp servlet jdbc css+html等技术适合新手练手

2019-01-11

空空如也

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

TA关注的人

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