![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaEE
文章平均质量分 82
纵横千里,捭阖四方
弱小,是最大的罪过;没有行动,梦想终究是想一想
展开
-
【征服redis1】基础数据类型详解和应用案例
以mysql为代表的数据库,相信很多人都非常熟悉,这是数据持久化存储的最佳方式。但是在更新频繁或者访问强度高的场景下,数据库的性能捉襟见肘,这时候我们使用Redis作为缓存更加合适。缓存是redis最主要的功能,此外,redis还在分布式锁、异步消息队列等方面有重要应用。Redis 是一个开源的在内存中存储数据的结构化键值数据库,它支持多种类型的数据结构,如字符串、列表、集合、哈希、有序集合等。此外,Redis还支持事务、持久化、LUA脚本、LRU清除、自动故障转移等功能。Redis特点。原创 2024-01-14 22:49:35 · 1134 阅读 · 0 评论 -
一文搞定垃圾回收的三色标记法
我们之前介绍了各种常见垃圾回收器的基本原理,本小节我们讨论一个更深入的问题——垃圾回收器的底层是如何做的。在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。这就好比你在拖地,但是你的孩子却在跑来跑去,结果你一直拖不干净。主流的垃圾收集器基本上都是基于可达性分析算法来判定对象是否存活的,也就是”三色标记法“。根据对象是否被垃圾收集器扫描过而用白、灰、黑三种颜色来标记对象的状态的一种方法。而其中白色:表示对象尚未被垃圾收集器访问过。原创 2023-01-01 10:06:28 · 936 阅读 · 0 评论 -
一文搞懂G1垃圾回收器
G1是从JDK9之后的默认垃圾回收器,其功能强大,性能优异,不过目前市面的材料不算多,很多都是抄来抄去,讲得也不太清楚。经过仔细阅读oracle官网以及相关的材料,从整体上梳理了G1的过程,希望这一文能帮你真正搞懂G1垃圾回收器。原创 2022-12-31 18:13:52 · 3035 阅读 · 2 评论 -
携程Apollo配置中心架构介绍
Apollo(阿波罗)是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,可以说Apollo是目前配置中心产品领域Number1的产品,其成熟度和企业级特性要远远强于Spring Cloud体系中的Spring Cloud Config产品。原创 2022-12-19 11:32:42 · 2590 阅读 · 0 评论 -
opcj1——mac下如何快速搭建Java开发环境
这是我们OPCJ的第一篇,搭建基础的开发环境。我们的服务会不断增加新组件,我们这里先介绍如何快速搭建开发环境。一般来说Java程序员的电脑上总是会有一些已经配置好的idea、git、maven或者其他的,Docker是一个虚拟化容器技术,Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间相互隔离。先启动docker桌面端,然后执行如下命令:拉取最新的镜像然后用该镜像创建mysql实例,使用下面的命令来创建:这里对上面的参数做下简单的介绍,如果不想了解这一块直接原创 2022-12-08 00:03:52 · 884 阅读 · 0 评论 -
Java使用Excel的问题:自动跳过空字段、中文加拼音和时间处理错误的解决方法
在Java中解析Excel是很多管理类系统的重要功能, 目前主要有阿里的easyExcel和HSSF两种开源工具,如何使用网上有大量的例子,不再赘述,我们这里看三个我亲身经历的问题:自动跳过空字段中文内容自动给加了拼音时间处理错误。本文首先分析故障现象或者原因,之后给出解决方案。原创 2022-11-08 19:46:06 · 4840 阅读 · 0 评论 -
谈谈Java对象的生命周期
经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段。原创 2022-10-30 16:07:59 · 705 阅读 · 0 评论 -
JVM的堆工作过程原来就是收拾房间
当Eden的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃圾回收(MinorGC),Eden区中不再被其他对象引用的对象就是要被清理的,但是此时仍然有仍然在使用的,此时会将活的对象整理都移动到Survivor0区,之后Eden区就完全清空,可以继续存放新的对象了。另外,虽然不同对象的周期不同,但是70%-99%的对象是临时对象,也就是很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。原创 2022-10-30 15:01:35 · 251 阅读 · 0 评论 -
一文理解JVM的方法区
常量池可以看做是一张表,常量池内部的内容比较多,例如数量值、字符串值、类引用、字段引用、方法引用等等,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。域的相关信息包括:域名称,域类型,域修饰符例如public,private,protected,static,final,volatile,transient等等。方法的修饰符(public,private,protected,static,final,synchronized,native,abstract的一个子集)原创 2022-10-30 11:41:29 · 283 阅读 · 1 评论 -
一文理解虚拟机栈
在JVM中,将符号转换为调用方法的直接引用与方法的绑定机制相关。绑定时参考的一个重要信息来源就是常量池,根据常量池的信息将这些内容转换为实际的地址。//一个方法对应一块栈帧内存区域int a = 1;int b = 2;return c;}}}我们通过javap -v Math.class 查看其字节码中main()方法的内容根据上图的信息我们可以推断出,new对应的就是new Math()原创 2022-10-30 11:29:13 · 634 阅读 · 0 评论 -
一文理解JVM的程序计数器(PC)
本文我们将介绍PC计数器是如何工作的,如何表示跳转和循环等操作的,以及线程安全相关的问题。JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的信息。CPU只有把数据装载到寄存器才能够运行。但是这里并非是广义上所指的物理寄存器,在JVM中只是对PC寄存器的一种模拟,用来处理当前线程相关指令的计数器。有一点与CPU的寄存器是类似的,那就是占用空间小,但运行速度最快。原创 2022-10-30 11:10:41 · 1419 阅读 · 0 评论 -
从源码理解双亲委派机制,原来如此简单
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式。简单来说,双亲委派机制,就是app加载器先向上交由父类加载器进行加载,父类中找不到,再由子类加载器自行加载。具体来说:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;原创 2022-10-26 20:12:39 · 643 阅读 · 0 评论 -
从源码透彻理解JVM类加载机制
接下来,我们就逐个介绍一下几种类加载器。第一种:启动类加载器启动类加载器(引导类加载器,Bootstrap ClassLoader)这个类加载使用C/C++语言实现的,嵌套在JVM内部它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类万物之祖,不继承其他类,没有父加载器加载扩展类和应用程序类加载器,并作为他们的父类加载器。原创 2022-10-26 20:02:54 · 621 阅读 · 0 评论 -
19.Lock锁介绍与应用案例
在JUC中,Lock是一个接口,其作用与synchronized类似,都是为了保证线程安全而提前加锁,不同的是Lock只定义了与抢锁和释放锁相关的操作,没有具体实现,而且要用lock()和unlock()将要保护的代码给包起来才可以。其中常用的接口有三个:lock():抢占锁资源方法,如果当前线程没有抢占到锁,则阻塞。trylock():尝试抢占锁资源,如果抢占成功则返回true,否则返回false。unlock():释放锁。原创 2022-09-05 22:39:09 · 974 阅读 · 0 评论 -
18.透彻理解死锁
synchronized同步锁,虽然能解决线程安全的问题,但是如果使用不当,就可能导致死锁,也即请求被阻塞而一直无法返回。除了死锁,还有个活锁的情况,我们看一下概念的区别:死锁: 一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。活锁: 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。也就是“生不如死”的状态,不过处于活锁的实体是在不断的改变状态,活锁有可能自行解开。这四个条件同时满足,就会产生死锁。原创 2022-09-04 17:15:11 · 197 阅读 · 0 评论 -
17.Thread.join的用法和原理
在应用程序中,如果某段程序希望等待前面的线程执行结束后再执行,并发编程里有很多工具可以做,其中Join()就可以。join的作用就是让线程的执行结果对后续线程的访问可见。为什么会这样呢?这就是因为正常情况下,子线程还没执行,main线程已经完了,而加了thread.Join就会让主线程等待,直到子线程的任务都完成之后再继续进行Join()之后的内容。原创 2022-09-04 16:44:42 · 265 阅读 · 0 评论 -
16.线程通信1:生产者/消费者问题
线程之间的通信又称为线程同步,是指当某个线程修改了一个对象的值时,另外一个线程能感知到该值的变化并进行相应的操作。实现线程之间通信的方法有:1.基于volatile修饰的共享变量2.通过wait和notify机制3.Thread.Join方法4.使用synchronized同步关键字5.Condition.await/signal方法Java提供了(wait/notify)等待/通知机制来实现多个线程之间的协同处理,也就是控制线程之间的等待和唤醒。原创 2022-09-04 15:43:03 · 250 阅读 · 0 评论 -
org.apache.curator.framework.listen.ListenerContainer.addListener的解决方法
org/apache/curator/framework/listen/这个路径下找类ListenerContainer.class,没找到,然后后面提示com/google/guava/guava/26.0-android/guava-26.0-android里有这个类,此时试图修改exclude等来将类定向到guava,或者排除掉curator2.9.1,但是均已失败告终。之后将curator升级到4.0.1,还是不解决问题,有些基础包还是依赖2.9.1,所以必须手动将其都升到4.0.1。原创 2022-09-02 16:35:38 · 1102 阅读 · 0 评论 -
idea编译Spring5源码的完整过程
环境:mac10.15.7,idea版本2019,JVM1.8,编译Spring5.0.2源码。目前spring已经出5.3甚至更高版本了,但是要依赖JDK17,我不想搞两个JDK,所以安装Spring5.0.2版本就够了,高级特性以后再说。原创 2022-06-10 09:55:47 · 740 阅读 · 2 评论 -
mac基于SpringBoot2+prometheus+ Grafana搭建监控系统的完整过程
在mac上,搭建SpringBoot2+prometheus+ Grafana搭建监控系统的完整过程原创 2022-05-31 18:16:03 · 594 阅读 · 0 评论 -
搭建配置Spring的gradle编译环境
要学习Spring,看源码是必不可少的,如果习惯了maven,那需要配置gradle环境才行。该如何搭建呢?我整理几个要点:1.不是哪个版本的grale都可以的。如果搞不清楚,可以看一下这个文件:spring-framework\gradle\wrapper\gradle-wrapper.properties里面标记的就是当前spring版本要求的,下载该版本能免去很多未知的错误。下载版本在这里:https://gradle.org/releases/,下载需要的bin文件压缩包就行了。2.打原创 2021-06-13 22:37:14 · 297 阅读 · 0 评论 -
如何在IDEA中排除多处调用产生的依赖冲突
在maven中不同的包会产生复杂的依赖关系,没有冲突万事大吉,一旦出现冲突或者执行有错误,就必须解决,如果依赖关系很多,例如log4j可能很多地方都调用,例如我的工程里缩小之后就这么密集,那该怎么准确排除掉呢?这里涉及到两个问题,一个是找到关联的模块,第二是在每个模块分别排除掉。上的图是在idea中对一个module分析的结果。我的方法不一定是最优的,但是能靠谱得解决问题。例如我的工程里slf4j有两个产生了冲突,需要干掉一个。具体操作如下:1. 找到调用的模块使用命令mvn dependen原创 2021-05-20 12:07:41 · 2035 阅读 · 1 评论 -
Dubbo系列5:Dubbo协议
1. 回顾Dubbo调用过程我们先回顾一次调用过程经历了哪些处理步骤。如果我们动手写简单的RPC调用, 则需要把服务调用信息传递到服务端, 每次服务调用的一些公用的信息包括服务调用接口、 方法名、 方法参数类型和方法参数值等, 在传递方法参数值时需要先序列化对象并经过网络传输到服务端, 在服务端需要按照客户端序列化顺序再做一次反序列化来读取信息, 然后拼装成请求对象进行服务反射调用, 最终将调用结果再传给客户端。在Dubbo中实现调用也是基于相同的原理, 下面看一下Dubbo在一次完整的RPC调用流程中原创 2021-04-12 23:03:35 · 442 阅读 · 0 评论 -
Dubbo系列4:SPI原理
1.什么是Java的SPI就是将接口的实现类都写在一个默认的配置文件里,然后Java会自动加载该文件,然后创建出对应的对象,和Spring的bean配置实现了一样的功能。其实这个也是IOC和AOP一样的功能。不过这个是由Java的类装载器来做的,而Spring是自己做的。装逼点说法是 :SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。一个服务(Service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按原创 2021-04-12 22:55:07 · 121 阅读 · 0 评论 -
Dubbo系列3:配置系统
配置不是研究Dubbo代码的重点,多协议、RPC、容错等才是Dubbo的重要内容,但是配置是基础,是将这些内容串起来的线,如果不梳理一下,不易形成完整的体系。而且很多配置的内容也是我们在实际工作中经常要用到的,所以就简单捋一捋配置吧。1.配置的种类根据驱动方式的不同(比如Spring或裸API编程)配置形式上肯定会有所差异,具体包括XML配置、Annotation配置、API配置三种。除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:Dubbo 支持了多层级的配置,并按预定优先原创 2021-04-12 22:48:09 · 300 阅读 · 0 评论 -
Dubbo系列2:源代码结构和整体调用过程
【注】:本文比较清晰的大图都来自Dubbo官网这里我们先直观浏览一下Dubbo的代码结构和功能划分情况,具体后面逐步展开。Dubbo有效代码大约9.8万,其结构和模块比较复杂,大致结构是:dubbo-common 公共逻辑模块:包括 Util 类和通用模型。dubbo-remoting 远程通讯模块:相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。dubbo-rpc 远程调用模块:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。在回过头看上面的图,我原创 2021-04-12 22:42:00 · 171 阅读 · 0 评论 -
Kafka系列5: 拦截器的设计方法
我们可以对某些信息进行拦截,类似于切面的功能,这样可以便于我们进行多种功能。现在写一个例子:先自定义一个拦截器:package com.lqc.interceptor;import org.apache.kafka.clients.producer.ProducerInterceptor;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMe原创 2021-04-12 21:51:23 · 116 阅读 · 0 评论 -
kafka系列4:消息幂等性
1.kafka提供的幂等功能RabbitMQ中没有对消息重复做处理,而Kafka在Broker上实现了消息的重复性判断。enable.idempotence设置成true之后,Producer自动升级成为幂等性Producer,Kafka会自动去重。有两个重要机制:PID:幂等性的生产者每个客户端都有一个唯一的编号。sequence number:幂等性的生产者发送的每条消息都会带有相应的sequence number,server端根据这个来判断重复性。不过由于这个number不是全局有序的,原创 2021-04-12 20:49:34 · 939 阅读 · 0 评论 -
kafka系列3:用Java操作kafka的方法
1. 基于java API 开发首先新建pom工程,除了kafka,还需要引入序列化的坐标: <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.6.0<原创 2021-04-12 20:30:14 · 896 阅读 · 0 评论 -
kafka系列2:工作模型
1. kafka的整体模型1.1 相关概念1.BrokerBroker:kafka服务器,与RabbitMQ里的Broker基本一样,默认端口是9092。生产者和消费者都需要根据这个Broker建立连接。2.消息客户端之间传输的数据叫做消息,或者记录。客户端代码中,Record可以是一个键值对。消息在传输过程中需要序列化,所以代码里要指定序列化工具。3.生产者和消费者这是个相对的概念,发送方叫生产者,接收方叫消费者。为了提高效率,生产者不一定一条条发送,可以批量发送,这个由参数batch_原创 2021-04-12 20:10:49 · 554 阅读 · 0 评论 -
kafka系列1:概述和安装使用
1. kafka——拥有更广阔的大海Kafka 起初是由 Linkedin 公司采用 Scala 语言开发的 一个多分区、多副本且基于 ZooKeeper协调的分布式消息系统。不过kafka不只是一个简单的mq,在大数据领域也是重要的玩家,现在已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera 、 Storm、 Spark、 Flink 等都支持与 Kafka 集成 。Kafka 之所以受到越来越原创 2021-04-12 16:03:49 · 86 阅读 · 0 评论 -
RabbitMQ系列6:可靠性投递:完整分析消息丢失,幂等,顺序性问题
可靠性投递原创 2021-04-11 15:51:50 · 249 阅读 · 0 评论 -
RabbitMQ系列5:服务端和消费端流控
服务端和消费端流控原创 2021-04-11 15:50:32 · 306 阅读 · 0 评论 -
RabbitMQ系列4:延迟订单的实现和死信队列
延迟队列与死信队列原创 2021-04-11 15:49:48 · 260 阅读 · 0 评论 -
RabbitMQ3:RabbitMQ的使用方法
使用方法——从java API到SpringBoo原创 2021-04-11 15:47:41 · 287 阅读 · 0 评论 -
rabbitMq系列2:AMPQ协议与RabbitMQ执行过程
AMPQ原创 2021-04-11 15:47:06 · 426 阅读 · 0 评论 -
RabbitMQ系列1:RabbitMQ的模型
1. 消息队列概述1.1 定义消息队列,又叫消息中间件,是指高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。1.2 MQ的主要特点或者作用1.是一个独立运行的服务,生产者和消费者需要先跟服务器建立连接2.采用队列作为数据结构,有先进先出的特点3.具有发布订阅的模型,消费者和生产者异步通信。4.因为异步通信和独立运行的特点,所以具有了新的特点:系统解耦,减少不同的业务模块之间的相互作用和相互依原创 2021-04-11 11:34:40 · 219 阅读 · 0 评论 -
设计模式收关:重建火神山-理解7大设计原则
重建火神山-理解7大设计原则原创 2021-04-10 17:27:58 · 215 阅读 · 0 评论 -
Mybatis系列15:Mybatis总结收关
Mybatis常见问题总结和梳理原创 2021-04-10 17:25:22 · 101 阅读 · 0 评论 -
Mybatis系列10:代理模式在延迟加载中的应用
Mybatis如何处理循环引用的原创 2021-04-09 18:50:52 · 262 阅读 · 0 评论