自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

没头脑遇到不高兴

好好学习,天天向上!

  • 博客(88)
  • 资源 (4)
  • 收藏
  • 关注

原创 3.亿级积分数据分库分表:ShardingSphere官方提供的平滑数据迁移方案介绍,有什么缺点呢?

ShardingSphere官方提供了平滑数据迁移的方案,这节就简单介绍一下官方方案的操作步骤及原理,以及官方的方案有哪些优缺点,适不适合自己的业务场景

2024-03-29 14:02:42 842

原创 2.亿级积分数据分库分表:增量数据同步之代码双写,为什么没用Canal?

上一篇博客中写了一下积分数据分库分表的总体方案设计,里面说了采用应用程序代码双写的方式实现的增量数据同步,本篇就对这一块进行一些细化的介绍,包括:为什么不用Canal监听数据库binlog,有哪些优缺点吗?为什么要用代码双写,有哪些优缺点吗?代码双写怎么实现的?

2024-03-17 16:23:47 936

原创 1.亿级积分数据分库分表:总体方案设计

本篇博客从整体上介绍了一个完整的积分明细分表的实施方案,包括分表数量、分片键选择、分片算法、分布式ID、历史存量数据迁移、新老数据双向核对校验、灰度切流验证等

2024-03-02 14:03:47 1005

原创 (18)不重启服务动态停止、启动RabbitMQ消费者

我们在消费RabbitMQ消息的过程中,有时候可能会想先暂停消费一段时间,然后过段时间再启动消费者,这个需求怎么实现呢?我们可以借助RabbitListenerEndpointRegistry这个类来实现,它的全类名是org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry,通过这个类可以实现全部队列消息的启动、停止消费,也可以实现指定队列消息的启动、停止消费。

2023-09-04 19:56:17 1587

原创 雪花算法生成分布式ID源码分析及低频场景下全是偶数的解决办法

介绍了雪花算法生成分布式ID的原理以及在低频场景下生成的都是偶数的问题及其解决办法

2023-07-14 16:02:41 908 2

原创 准实时刷新集群中各节点本地缓存的解决方案

为了减少数据库和redis缓存的查询以提升接口性能,有时候会把一些常用的、变动不是很频繁的数据放到本地缓存,本篇主要介绍了准实时刷新集群中各节点本地缓存的解决方案

2023-06-06 16:00:05 1838

原创 借助Nacos配置中心实现一个动态线程池

借助Nacos配置中心实现一个自定义的动态线程池,可以在运行过程中动态调整线程池参数配置,对线程池的运行情况进行监控预警等

2023-04-13 19:41:52 1642

原创 (17)不重启服务动态调整RabbitMQ消费者数量

不重启服务动态调整RabbitMQ消费者数量

2022-09-21 16:42:30 3910 6

原创 从源码角度分析RabbitMQ重启后,消费者停止消费怎么解决

前段时间的RabbitMQ broker服务端由于某个队列一直积压消息,运维在凌晨对mq服务端机器pod进行了扩容,重启了RabbitMQ,然后早上发现自己的服务在mq重启之后一直报异常,停止消费了,导致影响了业务的运行,虽然mq重启成功了但是消费者却没有重连成功。本节会通过分析spring-rabbit的源码,来分析问题出现的原因以及解决办法。先看下报了什么异常,这里挑了一些主要的异常堆栈贴出来o.s.a.r.l.BlockingQueueConsumer - Q...

2022-01-18 12:36:35 10882 5

原创 Java中的魔法类Unsafe介绍

一、Unsafe类简介Unsafe是位于sun.misc包下的一个类,不属于 Java 标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如 Netty 、Hadoop 、 Kafka 等;Unsafe可认为是Java中留下的后门,提供了一些低层次操作,如直接内存访问、线程的挂起和恢复、CAS 、线程同步、内存屏障。CAS 就是 Unsafe 类中提供的一个原子操作,第一个参数为需要改变的对象,第二个为偏移量 即之前求出来的 headOffset 的

2021-01-23 15:12:44 725

原创 Atomic原子操作与ABA问题

一、原子操作原子(atomic )本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在java中可以通过锁和循环CAS(Compare and Swap即比较和交换)的方式来实现原子操作。JVM中的CAS操作正是利用了上文中提到的处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止,具体的类可以参见juc下的atomic包内的原子类。CAS操作属于乐观锁,CAS有3个操作数,内存

2021-01-21 13:16:54 1473 1

原创 Semaphore、CountDownLatch和CyclicBarrier原理及源码分析

前面《JUC并发核心AQS同步队列原理详解》介绍了AQS的同步等待队列的实现原理及源码分析,《ReentrantLock实现原理及源码分析》中介绍了AQS的同步队列独占模式实现的ReentranLock,这节将会介绍一下Semaphore、CountDownLatch和CyclicBarrier,并将会对源码进行分析。一、Semaphore使用及源码分析1、Semaphore的使用介绍Semaphore也就是我们常说的信号量, Semaphore可以控制同时访问的线程个数,通过 acquire

2021-01-16 18:37:19 566

原创 ReentrantLock实现原理及源码分析

前面《JUC并发核心AQS同步队列原理详解》介绍了AQS的同步等待队列的实现原理及源码分析,这节我们将介绍一下基于AQS实现的ReentranLock的应用、特性、实现原理及源码分析。一、ReentrantLock简介ReentrantLock位于Java的juc包里面,从JDK1.5开始出现,是基于AQS同步队列的独占模式实现的一种锁。ReentrantLock使用起来比synchronized更加灵活,可以自己控制加锁、解锁的逻辑。ReentrantLock跟synchronized一样也是可重

2021-01-16 12:00:43 590

原创 JUC并发核心AQS同步队列原理详解

一、AQS介绍队列同步器AbstractQueuedSynchronizer(简称AQS),AQS定义了一套多线程访问共享资源的同步器框架,是用来构建锁或者其他同步组件的基础框架,是一个依赖状态(state)的同步器。Java并发编程的核心在java.util.concurrent(简称juc)包,而juc包的大部分工具都是以AQS为基础进行构建的,例如Semaphore、ReentranLock、CountDownLatch、CyclicBarrier等,它的作者是鼎鼎大名的Doug Lea。AQ

2021-01-09 18:23:33 1258 2

原创 synchronized(下)锁优化和锁升级过程

一、synchronized锁优化高效并发是从JDK 5升级到JDK 6后一项重要的改进项,HotSpot虚拟机开发团队在这个版本上花费了大量的资源去实现各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)、偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据及解决竞争问题,从而提高程序的执行效率。1、自旋锁与自适应自

2021-01-05 13:47:03 630

原创 synchronized(上)使用及底层原理详解

一、线程安全问题1、临界资源多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。 共享:资源可以由多个线程同时访问 可变:资源可以在其生命周期内被修改 2、线程安全问题当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的,否则就是非线程安全

2021-01-03 15:01:29 318

原创 原子性、可见性、有序性与happen-before原则

1.原子性(Atomicity)原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个,我们大致可以认为,基本数据类型的访问、读写都是具备原子性的(例外就是long和double的非原子性协定)。如果应用场景需要一个更大范围的原子性保证(经常会遇到),Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机未把lock和unlo

2020-12-29 21:28:23 724 2

原创 volatile内存语义、原理详解、内存屏障

volatile

2020-12-25 20:59:45 6265 6

原创 JMM内存模型介绍

一、JMM的定义1.什么是JMM《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model简称JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM是围绕原子性,有序性、可见性展开。2.主内存与工作内存Java内存模型的主要目的是定义程

2020-12-17 13:20:12 558

原创 计算机多级缓存架构和MESI缓存一致性协议

本节将介绍一下计算机的多级缓存(L1、L2、L3)架构、多级缓存与主存怎么进行数据交互的,另外会对MESI(缓存一致性协议)做下介绍,为后面的JMM模型、volatile关键字的学习打下基础。一,现代计算机硬件基本结构1.总线上面图中大部分都比较好理解(如果想详细了解的话可以看下计算机操作系统相关的书籍,了解一下冯诺依曼计算机模型等基础知识。),这里先介绍一下总线:贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递,计算机的各个组件如CPU、内存、磁盘等通过总线进行

2020-12-13 17:12:45 929 1

原创 Java中的线程基本概念

二、什么是线程现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度CPU的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。线程的实现可以分为两类:1、用户级线程(User-Level Thread)2、内核线线程(Kern

2020-12-04 20:59:26 672

原创 JVM垃圾收集器GC调优

本节将会介绍一下GC调优的目标,GC调优的准则,GC调优按照什么步骤进行,以及常用的Parallel GC、CMS GC、G1 GC的调优准则及调优案例。目录GC调优概述GC调优的目标:GC调优准则GC调优步骤Parallel收集器GC调优CMS收集器GC调优G1收集器GC调优GC调优概述对JVM垃圾收集器进行调优之前,一定要先了解JVM内存结构、各个垃圾...

2019-11-15 00:13:43 855

原创 GC日志可视化分析工具GCeasy和GCViewer

上节介绍了GC日志的打印及含义,但是GC日志看起来比较麻烦,本节将会介绍一下GC日志可视化分析工具GCeasy和GCviewer。通过GC日志可视化分析工具,我们可以很方便的看到JVM各个分代的内存使用情况、垃圾回收次数、垃圾回收的原因、垃圾回收占用的时间、吞吐量等,这些指标在我们进行JVM调优的时候是很有用的。GCeasy介绍官网地址:https://gceasy.io/,GCeasy是...

2019-10-30 17:59:44 25846 7

原创 GC日志介绍

本节将会介绍一下JVM常用的GC日志相关的参数,然后会对各个收集器的GC日志的各个部分做个详细的介绍。JVM的GC日志参数在我的前面的博客《JVM常用参数选项介绍》中,已经介绍了很多的GC日志相关的JVM参数,我们这里就用了下面几个参数,设置JVM参数的方式里面也有介绍,如果想了解更多可以看下那篇博客。-XX:+PrintGCDetails在发生垃圾回收时打印内存回收详细的日志,并在...

2019-10-30 16:34:13 1465

原创 jvisualvm配合Visual GC插件监控Java应用程序

本节将会介绍一下jvisualvm的特性及作用、各个功能是如何使用的、最后会介绍jvisualvm的插件Visual GC的安装及使用。目录jvisualvm介绍jvisualvm使用介绍Visual GC插件安装及使用jvisualvm介绍VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行...

2019-10-16 11:22:35 1964

原创 jstack配合top命令分析CPU飙高、程序死锁问题

jstack:Java堆栈跟踪工具jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿...

2019-09-25 14:03:56 1814

原创 使用jmap和MAT进行堆内存溢出分析

jmap:Java内存映像工具jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。另外,还有几种方式获取dump文件:使用JVM参数选项-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:HeapDumpPath=path 设置dump文件路径(有时...

2019-09-19 16:50:27 3163

原创 JDK常用命令jps、jinfo、jstat的使用介绍

概述JDK的bin目录下提供了很多命令工具,比如java.exe,javap.exe,javac.exe。。。。。。这些命令由jdk/lib/tools.jar类库中提供的,是对tools.jar中的类的封装。我们主要介绍一下JVM中处理运行日志、异常堆栈、GC日志、线程快照(threaddump / javacore文件)、堆转储快照(heapdump/hprof文件)等信息的相关常用命令(...

2019-09-16 23:29:21 1349

原创 JVM常用参数选项介绍

目录JVM参数选项类型介绍标准参数选项-X参数选项-XX参数选项JVM参数选项如何设置打印设置的XX选项及值堆、栈、方法区等内存大小设置OutofMemory相关的选项垃圾收集器相关选项GC日志相关选项其他参数通过Java代码获取JVM参数JVM参数选项类型介绍关于JDK8的选项参数可以参考官网:https://docs.oracle.co...

2019-09-13 22:58:50 1270

原创 内存分配与回收策略及MinorGC、MajorGC、FullGC介绍

本节将会介绍一下:对象的内存分配与回收策略;对象何时进入新生代、老年代;MinorGC、MajorGC、FullGC的定义区别和触发条件;还有通过图示展示了GC的过程。目录对象内存分配与回收策略对象何时进入新生代、老年代三种GC介绍MinorGCMajor GC/Full GC:图示GC过程对象内存分配与回收策略对象的内存分配,往大方向讲,就是在堆上分配〔但也可...

2019-09-10 13:56:26 3370

原创 常用垃圾收集器介绍

本节将会介绍一下HotSpot虚拟机中的常用垃圾收集器:Serial,ParNew,Parallel Scavenge,Serial Old,Parallel Old,CMS,G1,会对每个垃圾收集器的概念和常用参数做下介绍。目录概述Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old收集器...

2019-09-07 17:23:30 1654 1

原创 判断对象是否可回收、垃圾回收算法

本节将会介绍下判断对象是否都能回收的两种方式:引用计数法、可达性分析,另外会介绍一下常用的垃圾回收算法:标记清除算法,复制算法,标记整理算法,分代回收算法。目录对象是否可回收引用计数算法可达性分析算法对象从生存到死亡回收方法区垃圾回收算法标记-清除算法复制算法标记-整理算法分代收集算法对象是否可回收我们谈论的垃圾收集(Garbage Collec...

2019-08-29 22:00:00 2987

原创 Java对象的创建、内存布局及访问定位

对象的创建虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符号引用,并检查符号引用代表的类是否被加载、解析、初始化,若没有则先进行类加载。如果没有加载,需要先进行类加载。对象内存分配:类加载检查通过后,虚拟机为新生对象分配内存,对象所需内存大小在类加载完成后便可完全确定。分配内存的任务等同于从堆中分出一块确定大小的内存。根据Java堆是否规整,分配内存的方式分为如下两种:指...

2019-08-27 23:02:26 514 1

原创 深入理解Java虚拟机栈的栈帧

本节将会介绍一下Java虚拟机栈中的栈帧,会对栈帧的组成部分(局部变量表、操作数栈、动态链接、方法出口)分别进行介绍,最后还会通过javap命令反解析编译后的.class文件,进行分析方法执行时的局部变量表、操作数栈等。目录Java虚拟机栈概述局部变量表操作数栈动态连接方法的返回地址结合javap命令理解栈帧Java虚拟机栈概述Java虚拟机栈(Java Vir...

2019-08-25 00:05:48 16553 12

原创 JVM字节码指令集大全及其介绍

本节将会着重介绍一下JVM中的指令集、Java是如何跨平台的、JVM指令集参考手册等内容。目录Java是怎么跨平台的平台无关的基石JVM字节码指令介绍字节码与数据类型加载和存储指令算术指令类型转换指令对象创建与访问指令操作数栈管理指令控制转移指令方法调用和返回指令异常处理指令同步指令JVM指令集大全Java是怎么跨平台的我们上计算...

2019-08-22 23:39:48 9347 5

原创 设计模式之策略模式

策略模式概述策略模式(Strategy Pattern)定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。该模式中一个类的行为或其算法可以在运行时更改,属于行为型模式。比如在超市进行收银时,有时候会有活动例如:全部打八折、满100减10块,满300打九折。。。。。。在收银的时候收银员选择相应的结算方式进行计算最终结算金额,如果用if ...

2019-08-21 21:17:52 243

原创 JVM内存结构概述

本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。目录前言JVM是什么JVM内存结构概览运行时数据区程序计数器Java虚拟机栈本地方法栈方法区运行时常量池Java堆直接内存前言JVM是Java中比较难理解和掌握的一部分,也是面试...

2019-08-20 23:32:58 4735

原创 死磕JDK1.8动态代理原理及源码分析

上一节《设计模式之代理模式》中我们已经对设计模式中的代理模式做了一个简单的介绍,这一节将会对Java的动态的代理原理、源码进行深入的分析(注意:这里分析的是JDK1.8中的动态代理的源码)。篇幅有点长,花了好几天的时间才写完,感觉身体被掏空。。。。。。一、概述上节介绍过,Java的动态代理是在运行时动态产生的,其底层是通过反射实现的。Java的动态代理要求目标类必须实现接口,否则无法被代理...

2019-08-13 21:57:20 931 1

转载 Java四种引用类型: 强引用、弱引用、软引用、虚引用

1、强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o=new Object(); // 强引用当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:...

2019-08-12 17:59:23 2999 1

原创 设计模式之代理模式

代理模式概述代理模式(Proxy Pattern)属于结构型模式,为其他对象提供一种代理以控制对这个对象的访问。我们生活中也有很多事情符合代理的,比如:媒婆给小伙子、小姑娘介绍对象;我们通过火车票代售点购买火车票;租房找链家的中介;明星经纪人。。。。。。这里以自己租房找中介为例,自己属于被代理人,中介属于代理人,中介帮助我们找租房信息,我们通过中介找的信息挑选、租房子,最后我们付给中介一定...

2019-08-11 00:03:47 182

dubbo面试题

dubbo常见的面试题,序列化,注册中心,原理,核心配置......

2018-09-27

java面试题合集

本文档是一个java面试题的合集,其中包括java的基础,javaweb部分,java多线程,框架部分(springMvc,Spring,mybatis...),数据库部分,源码解析,算法......

2018-09-27

jstl-1.2.jar

jstl-1.2.jar

2014-05-31

计算机网络课后答案

计算机网络第四版课后答案

2013-12-24

空空如也

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

TA关注的人

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