
java
文章平均质量分 57
qq_489366879
这个作者很懒,什么都没留下…
展开
-
JAVA GC - STW
我们先假设GC拥有独立的线程, 与用户的逻辑并行的运行, 看看会有哪些不符合预期的情况.情况一: 该回收的没回收在标记的过程中, 在对象被标记之后, 用户的线程做了一些操作, 所有对象都不再依赖这个对象了, 那么这个对象应该被回收, 但是在这次遍历中不会被回收了情况二: 不该回收的回收了在标记的过程中, 用户的线程又创建一些新对象, 并且与旧的对象存在一些依赖关系, 但是依赖这些对象的旧对象在这次标记中都已经被遍历过了, 也就是说这些新产生的对象在这次的遍历过程中不会被标记了, 那么它们应该原创 2022-04-25 18:45:32 · 409 阅读 · 0 评论 -
浅谈如何解决MQ消息堆积的问题
MQ消息堆积是指生产者发送的消息短时间内在Broker端大量堆积,无法被消费者及时消费,从而导致业务功能无法正常使用。 消息堆积常见于以下几种情况:(1)新上线的消费者功能有BUG,消息无法被消费。(2)消费者实例宕机或因网络问题暂时无法同Broker建立连接。(3)生产者短时间内推送大量消息至Broker,消费者消费能力不足。(4)生产者未感知Broker消费堆积持续向Broker推送消息。 解决上述问题就要做到:(1)解决问题一,要做好 ...原创 2022-04-21 11:06:46 · 10332 阅读 · 0 评论 -
springboot -RestControllerAdvice
1.RestControllerAdvice来捕获全局异常@RestControllerAdvice都是对Controller进行增强的,可以全局捕获spring mvc抛的异常。@ExceptionHandler(value = Exception.class)ExceptionHandler的作用是用来捕获指定的异常。@RestControllerAdvice(annotations = RestController.class)public class UniformReponseHa原创 2022-04-19 09:55:41 · 640 阅读 · 0 评论 -
Rabbitmq 的正常安装流程
安装相关依赖yum updateyum install epel-releaseyum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git wget wxBase.x86_64安装ErLangwget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.r原创 2021-11-22 17:34:53 · 1233 阅读 · 0 评论 -
Canal原理及在缓存上的使用
1 什么是canal canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。(数据库同步需要阿里的otter中间件,基于canal)2 canal使用场景-更新缓存 如果有大量的请求发送到mysql的话,mysql查询速度慢,QPS上不去,光查mysql可能会瘫痪,那就可以在前面加个缓存,这个缓存有2个主要的问题...原创 2021-11-18 16:55:15 · 1138 阅读 · 0 评论 -
RocketMQ定时(延迟)消息
ocketMQ 不支持任意时间自定义的延迟消息,仅支持内置预设值的延迟时间间隔的延迟消息。预设值的延迟时间间隔为:1s、 5s、 10s、 30s、 1m、 2m、 3m、 4m、 5m、 6m、 7m、 8m、 9m、 10m、 20m、 30m、 1h、 2h延时消息的使用场景比如电商里,提交了一个订单就可以发送一个延时消息,1h后去检查这个订单的状态,如果还是未付款就取消订单释放库存。生产package com.xin.rocketmq.demo.testrun;import原创 2021-08-31 15:22:44 · 613 阅读 · 0 评论 -
Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节
readSlice返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。另请注意,此方法将不会调用retain(),因此不会增加引用计数。跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加@Overridepublic ByteBuf readSlice(int length) { checkReadableBytes(length); ByteBuf slice = sl原创 2021-08-10 11:01:38 · 1445 阅读 · 0 评论 -
Zipkin — 微服务链路跟踪
一、Zipkin 介绍Zipkin 是什么? Zipkin的官方介绍:https://zipkin.apache.org/ Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。分布式跟踪系统还有其他比较成熟的实现,例如:Naver的Pinpoint、Apache的HTrace、阿里的鹰眼Tracing、京东的Hyd原创 2021-08-05 17:20:45 · 230 阅读 · 0 评论 -
Java 性能诊断利器 -JProfiler
Java 性能诊断工具简介在 Java 的世界里,有许多诊断工具可供选择,既包括像 jmap、jstat 这样的简单命令行工具,又包括 JVisualvm、JProfiler 等图形化综合诊断工具,同时还有 SkyWalking、ARMS 这样的针对分布式应用的性能监控系统。下面分别对其进行介绍。简单命令行工具JDK 内置了许多命令行工具,它们可用来获取目标 JVM 不同方面、不同层次的信息。jinfo - 用于实时查看和调整目标 JVM 的各项参数。 jstack - 用于获取目标 Ja原创 2021-08-05 16:36:06 · 460 阅读 · 0 评论 -
LRU算法 原理及实现
LRU原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。最常见的实现是使用一个链表保存缓存数据,详细算法实现如下新数据插入到链表头部; 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 当链表满的时候,将链表尾部的数据丢弃。 【命中率】 当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。.原创 2021-07-15 15:10:57 · 1036 阅读 · 0 评论 -
Java-阻塞队列(BlockingQueue)
1.阻塞队列(BlockingQueue)BlockingQueue 继承了 Queue 接口,是队列的一种。Queue 和 BlockingQueue 都是在 Java 5 中加入的。java.util.concurrent.BlockingQueuepublic interface BlockingQueue<E> extends Queue<E> {...}BlockingQueue 有 6 种最主要的实现如下ArrayBlockingQueueLink原创 2021-07-09 11:40:35 · 606 阅读 · 2 评论 -
Java-@interface 自定义注解
@interface使用1.@interface自定义注解 <1>@interface自定义注解自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。 <2>在定义注解时,不能继承其他的注解或接口。 <3>使用@interface来声明一个注解,1>.每一个方法实际上是声明了一个配置参数,2>.方法的名称就是参数的名称,3>.返回值类型就是参数的类型,(返回值类型只能是基本类型...原创 2021-07-08 17:43:51 · 423 阅读 · 0 评论 -
Java--ReentrantReadWriteLock
概述 ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。 读写锁内部维护了两个锁,一个用原创 2021-07-05 19:41:28 · 127 阅读 · 0 评论 -
Java-CyclicBarrier(循环栅栏)
1. CyclicBarrier 是什么?从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。2. 怎么使用 CyclicBarrier2.1 构造方法public Cyclic原创 2021-07-05 18:21:08 · 144 阅读 · 0 评论 -
Java-countDownLatch
1.背景:countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。2.概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待原创 2021-07-05 17:17:07 · 89 阅读 · 0 评论 -
Java-Semaphore(信号量)
Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问。如果线程要访问一个资源就必须先获得信号量。如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源;否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0.当信号量使用完时,必须释放。实例代码: final Semaphore semaphore = new Semaphore(2); ExecutorService executorService = Executors...原创 2021-07-05 16:48:50 · 122 阅读 · 0 评论 -
Java-CLH锁
锁值:我把自旋条件定义为锁值 locked。locked == true 表示节点的处于加锁状态或者等待加锁状态,locked == false 表示节点处于解锁状态。原创 2021-07-02 16:44:24 · 168 阅读 · 0 评论 -
Java - Hystrix 原理与实战
背景分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。雪崩效应常见场景硬件故障:如服务器宕机,机房断电,光纤被挖断等。 流量激增:如异常流量,重试加大流量等。 缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中原创 2021-06-23 11:33:26 · 600 阅读 · 1 评论 -
Java - sharding-jdbc
核心概念一、 背景在互联网海量数据时代的今天,我们需要存储的数据也越来越多,在使用关系型数据库例如mysql等时,单表所需要存储的数据也越来越多,但是关系型数据库在单表数据库量较大的情况下,单表性能会急剧下降,面对这个问题,常见的做法就是进行分表,但是单纯的分表只能减少单表的压力,不能减轻数据库的压力,所以在分表的同时往往也会进行分库操作。二、分库分表分库分表主要是为了解决互联网应用的大数据量存储问题,分表通常分为:垂直划分、水平划分;垂直划分通常是根据业务场景将一个多字段大表拆分成多个多个少字原创 2021-06-22 21:20:35 · 652 阅读 · 0 评论 -
Java - 雪花算法的原理和实现
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字:第一个..原创 2021-06-22 19:45:57 · 111 阅读 · 0 评论 -
Java - Seata分布式事务XA与AT 对比
AT与XA的关系无论是AT还是XA,他们都是有利用到数据库自带的事务特性,来保证数据一致性和隔离性比如AT一阶段提交和二阶段回滚,都是执行了本地事务。比如XA的一阶段和二阶段,也都是利用了数据库本身的事务特性那么这样一样我们是否应该在数据库层面进行挖掘,AT与XA的关系呢?首先这个时候,我们肯定要从中找相同,与找不同。AT首当其冲,他有个必须品,也就是undolog表,undolog,相信了解数据库的同学肯定是知道。数据库有六种日志分别是:重做日志(redo log)、回滚日志(und原创 2021-06-22 18:38:23 · 949 阅读 · 2 评论 -
java-分布式事务
1、什么是分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。2、分布式事务的产生的原因2.1、数据库分库分表当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理原创 2021-06-22 14:55:51 · 2023 阅读 · 0 评论 -
java -池化技术
java性能优化,通常要考虑GC, 线程上下文切换,网络IO操作的影响;池化技术可在一定场景下很好的规避这些问题,如对象(内存)池,线程池,连接池等; 本文讲几个典型案例;一. 规避GC--对象池 apache common-pool对象池,对象复用,完整的状态管理;二. 规避线程上下文切换损失---线程池1 线程池主要类型:newCachedThreadPool如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程; newFixedThreadPo...原创 2021-06-22 10:42:39 · 591 阅读 · 0 评论 -
Java - ThreadLocal
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。 ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每原创 2021-06-16 11:41:46 · 132 阅读 · 0 评论 -
Java-自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。Java如何实现自旋锁?下面是个简单的例子:...原创 2021-06-15 18:58:34 · 148 阅读 · 0 评论 -
Java-CompareAndSet(CAS)
先要说一下,AtomicInteger类compareAndSet通过原子操作实现了CAS操作,最底层基于汇编语言实现。简单说一下原子操作的概念,“原子”代表最小的单位,所以原子操作可以看做最小的执行单位,该操作在执行完毕前不会被任何其他任务或事件打断。CAS是Compare And Set的一个简称,如下理解:1,已知当前内存里面的值current和预期要修改成的值new传入2,内存中AtomicInteger对象地址对应的真实值(因为有可能别修改)real与current对比,...原创 2021-06-15 17:09:48 · 1391 阅读 · 1 评论 -
Java-Thread.Sleep(0)作用
Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。...原创 2021-06-11 13:44:53 · 402 阅读 · 0 评论 -
Java-异步 I/O (AIO)
AIONIO2.0引入了新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取操作结果.通过java.util.concurrent.Future类來表示异步操作的结果;在执行异步操作的时候传入一个java.nio.channels。CompletionHandler接口的实现类作为操作完成的回调。NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它对应UNIX网络编程中的事件驱动I/O (AIO),它不需要通过多路复用器(Selector)对注册的通道进..原创 2021-06-09 14:34:31 · 443 阅读 · 0 评论 -
Java - I/O 多路复用(NIO)
NIONIO,有人解释为new I/O,有人解释为Non-block I/O(我更倾向后者)。正是由于Java传统BIO的拙劣表现,才使得Java支持非阻塞I/O的呼声日渐高涨,最终,JDK1.4版本提供了新的NIO类库,Java终于也可以支持非阻塞I/O 了。NIO主要的类和接口如下:进行异步I/O操作的缓冲区ByteBuffer等; 进行异步I/O操作的管道Pipe; 进行各种I/O操作(异步或者同步)的Channel,包括ServerSocketChannel和SocketChanne原创 2021-06-09 13:32:46 · 728 阅读 · 5 评论 -
Java - 伪异步I/O编程
伪异步I/O编程为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源, 设置线程的最大值, 防止由于海量并发接入导致线程耗尽。...原创 2021-06-09 10:20:23 · 165 阅读 · 0 评论 -
Java - 同步阻塞模式(BIO)
BIO在JDK1.4之前,基于Java的所有Socket通信都采用同步阻塞模式(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。当并发量增大,响应时间延迟增大之后,采用Java BIO开发的服务端只有通过硬件的不断扩容来满足高并发和低延迟,它极大的增加了企业的成本,随着集群规模的不断膨胀,系统的可维护性也面临巨大的挑战。...原创 2021-06-09 10:14:21 · 261 阅读 · 0 评论 -
设计模式 - 代理模式
意图:为其他对象提供一种代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。何时使用:想在访问一个类时做一些控制。如何解决:增加中间层。关键代码:实现与被代理类组合。public interface Image { void di原创 2021-04-26 19:14:06 · 65 阅读 · 0 评论 -
设计模式 - 单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject();原创 2021-04-26 13:52:13 · 87 阅读 · 0 评论 -
设计模式 - 工厂模式
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。关键代码:创建过程在其子类执行。应用实例:1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂.原创 2021-04-26 13:40:41 · 95 阅读 · 0 评论 -
lombok 注解 @Getter @Setter 详解
1.为什么强大?项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,尽管IDE工具都会帮我们生成。但自动生成这些代码后,如果bean中的属性一旦有修改、删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担。而使用了lombok之后,就不需要编写或生成setter或getter等方法...原创 2020-02-14 16:20:25 · 862 阅读 · 0 评论 -
linux java 配置
一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车。之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下。 二. 需要配置的环境变量 1. PATH环境变原创 2017-04-28 02:40:24 · 174 阅读 · 0 评论 -
java Servlet
一、Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1、编写一个Java类,实现servlet接口。 2、把开发好的Java类部署到web服务器中。 按照一种约定俗成的称呼原创 2017-04-28 04:46:20 · 203 阅读 · 0 评论 -
java Servlet 二
一、ServletConfig讲解1.1、配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个标签为servlet配置一些初始化参数。例如: 2 ServletConfigDemo1 3 gacl.servlet.study.ServletConfigDemo1 4 5 6原创 2017-04-30 00:04:05 · 227 阅读 · 0 评论 -
java Servlet3.0 使用注解标注Servlet @WebServlet
在Servlet3.0中,可以使用标注(Annotation)来告诉容器哪些Servlet会提供服务以及额外的信息写个例子package cn.my.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet原创 2017-04-30 02:08:08 · 600 阅读 · 0 评论 -
HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。一、HttpServletResponse对象介绍HttpSer原创 2017-04-30 02:44:13 · 264 阅读 · 0 评论