自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 资源 (5)
  • 收藏
  • 关注

原创 Jsoup爬虫注解版_简单好用

文章目录介绍涉及技术地址安装教程使用说明1、爬取单一对象2、爬取List集合3、爬取并保存图片所有API详细Api说明介绍原始的Jsoup爬虫框架使用起来可能比较繁琐,特别是在进行封装对象、级联封装对象(表中表)的时候,常见的做法是针对每个对象编写解决方法。该框架的作用是减少公共代码,简化操作,不重复造轮子,只需要在类和字段上添加一个的注解,就可以把爬取的内容封装成一个对象,并提供常用的功能,可以基本满足日常的需求。框架功能:1、支持爬取文本、HTML、任意标签的属性。2、提供完全匹配、包含、字

2020-08-10 20:11:06 550

原创 prometheus + alterManager + 飞书通知,实现服务宕机监控告警;实测可用

项目监控告警

2023-02-24 14:36:44 3065 1

原创 上传文件提示:java.nio.file.NoSuchFileException: /tmp/undertow.xxxx.xxxxx,解决方案

上传文件报错

2022-12-20 18:57:32 4003

原创 亲测可用,SpringBoot项目打印接口请求信息日志,CommonsRequestLoggingFilter实现方式

打印接口请求日志

2022-11-30 15:29:25 5575 2

原创 动画版通俗易懂讲解Java SPI机制

推荐一个不错的b站视频,动画版讲解Java SPI机制:https://www.bilibili.com/video/BV1E44y1N7Nk

2022-03-21 22:49:14 393

原创 RabbitMQ使用插件实现延迟消息,常见问题解决方案

文章目录安装插件代码注册交换机和Queue消息发送者消息消费者常见问题安装插件下载rabbitmq_delayed_message_exchange插件地址(尽量与rabbitMQ版本一致):https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases将 rabbitmq_delayed_message_exchange 插件拷贝到 rabbitMQ 安装目录下的 plugins 目录中进入RabbitMQ安装目录中的

2022-03-05 01:04:50 2651

原创 @ConditionalOnMissingBean注解简洁说明、使用场景分析

文章目录概括作用使用场景测试概括作用首先你得知道:在spring中,只要beanId不相同,是允许注入两个相同类型的bean的。加了这个注解后,当你注册两个相同类型的bean时,会抛出异常,它会保证同一个类型的bean只有一个。使用场景在项目中,只允许某个bean注入一次的时候使用,即保证在ioc中这个bean的实例只有一个1。一般来说,对于自定义的配置类,可以加上@ConditionalOnMissingBean注解,以避免多个配置同时注入的风险。测试@Configuration

2022-02-23 11:03:54 1378

原创 JVM方法区的基本概念&方法区的演进

文章目录栈、堆、方法区的交互关系方法区概述方法区在哪?方法区的理解方法区内存大小的设置常见解决方法区OOM的方案方法区里面存储什么运行时常量池方法区有GC吗?方法区的垃圾是什么?对常量池的回收对不再使用的类型的回收方法区的演进细节永久代为什么要被替换成元空间?StringTable为什么要调整?栈、堆、方法区的交互关系方法区概述方法区在哪?《Java虚拟机规范》中明确说明:"尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotspotJ

2021-05-17 21:03:36 326 1

原创 Java中的逃逸分析技术

对象内存分配过程在了解逃逸分析前,先大概的看一下逃逸分析技术在对象分配过程中的应用针对不同年龄段的对象分配原则优先分配到Eden区大对象(过长的字符串、数组)直接分配到老年代,尽量避免程序中出现过多的大对象长期存活的对象分配到老年代动态对象年龄判断如果survivor区中相同年龄的所有对象所占内存大小的总和大于survivor空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。空间分配担保:-XX:Handl

2021-04-08 15:08:13 393

原创 Java中String面试难题

文章目录前置知识`String str = "xxx"`到底new了几个对象?思考?new String("xxx")到底new了几个对象?`new String("ab") + new String("c")` 到底new了几个对象?思考?`string.intern()`在不同jdk版本的变化?面试题前置知识String str = "xxx"到底new了几个对象?new String("xxx")到底new了几个对象?new String("xxx") + new String("xx")

2021-03-31 14:22:49 213

原创 JS中浅拷贝和深拷贝的实现方式

文章目录浅拷贝: Object.assign(obj1)深拷贝方式一: Object.assign({}, obj1)方式二:利用json.stringify方式三:循环递归浅拷贝: Object.assign(obj1)方法:var obj2 = Object.assign(obj1)注意点:只对字符串类型有效,Number类型无效Object.assign(obj1)只能传递一个参数,如果使用Object.assign({}, obj1)就是深拷贝了,深拷贝方式一: Object.a

2021-03-10 16:25:16 113

原创 字符串常量池的基本特征

文章目录String的基本特性String的不可变性字符串常量池的理解字符串拼接操作验证关于StringBuilder的拼接操作经典面试题关于intern()的效率问题1. 从时间的角度2. 从空间的角度G1垃圾收集器对String的去重操作String的基本特性在了解字符串常量池之前,先看一下String的一些基本特性String:字符串,使用一对""引起来表示。 // 字面量的定义方式 string sl = "hello"; // new的方式 Strin

2021-03-08 22:27:28 258

原创 JVM之【堆】的基本概念

文章目录堆的核心概念堆内存结构细分新生代与老年代对象分配的正常过程堆的核心概念Java堆区在JVM启动的时候即被创建。是JVM管理的最大一块内存空间,是GC执行垃圾回收的重点区域。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域,GC和OOM都存在。《Java虚拟机规范》规定,堆可以处于物理上可以为不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,但并不是共享堆的全部,内部同样存在每个线程私有的缓冲区(如:ThreadLocal Alloc

2021-02-20 18:10:10 252

原创 JVM栈(5)-----方法返回地址&一些附加信息

方法返回地址存放调用该方法的方法pc寄存器的值。一个方法的结束,有两种方式:正常执行完成出现未处理的异常,非正常退出无论通过哪种方式退出,在方法退出后都返回该方法被调用的字节码指令位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。异常退出时,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。当一个方法开始执行后,只有两种方式可以退出这个方法:执行引擎遇到任意一个方法返回的字节码指令(return),会有返回值传递给

2021-01-29 09:55:02 361

原创 JVM栈(4)-----动态链接

动态链接每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如: invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里,比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。运行时常量池存储在方法区方法的调用方法的调用就是将符号

2021-01-29 09:53:33 1980 2

原创 JVM栈(3)-----操作数栈

是什么我们平常说的Java栈/JVM的执行引擎是基于栈的执行引擎,其实指的栈都是操作数栈用于在方法执行过程中,根据字节码指令往栈中写入数据或提取数据,即入栈和出栈,主要用于作为变量的临时存储空间,同时保存计算过程中的中间结果。某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用它们后再把结果压入栈,比如: 执行复制、交换、求和等操作。操作数栈是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,会创建一个新的栈帧,这时候栈帧中的操作数栈是空的(空的不代表没有长度)

2021-01-29 09:52:02 659

原创 JVM栈(2)-----局部变量表

局部变量表 Local Variables局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(引用类型)。局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。每一个方法的执行都对应着一个栈帧的入栈。一般来说,栈越大,方法嵌套调用次数越多。对一个函数而言,它的参数和局部变量越多,会使得局部变量表越大,所

2021-01-29 09:49:40 356

原创 JVM栈(1)-----栈的作用是什么?

文章目录虚拟机栈出现背景内存中的栈与堆Java虚拟机栈基本内容栈中可能出现的异常设置栈的内存大小栈中存储什么?栈帧的内部结构虚拟机栈出现背景由于Java跨平台的设计,Java指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能设计为基于寄存器的。优点:指令集小,编译器容易实现缺点:性能较低,实现同样的功能需要更多的指令。内存中的栈与堆栈是运行时的单位,而堆是存储的单位栈解决程序运行时的问题,即程序如何去执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放、放在哪儿对于

2021-01-29 09:48:07 882

原创 Java对象内存分配流程

内存分配流程针对不同年龄段的对象分配原则优先分配到Eden区大对象(过长的字符串、数组)直接分配到老年代,尽量避免程序中出现过多的大对象长期存活的对象分配到老年代动态对象年龄判断如果survivor区中相同年龄的所有对象所占内存大小的总和大于survivor空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。空间分配担保:-XX:HandlePromotionFailure对象分配过程:TLABTLAB,全称

2021-01-29 09:42:32 1267

原创 No primary or default constructor found for interface java.util.List&Invalid character found in the

错误描述最近在工作有个功能,希望能在接口中接收List</Long/>类型的数据,遇到一个问题,试了两种方式,分别报了如下错误:No primary or default constructor found for interface java.util.ListInvalid character found in the request target [/xxx/xxx/query?packageIds[]=1349693322573后面分析了原因都是因为参数传递不正确导致,特此来记录

2021-01-19 23:33:40 1386

原创 对JVM执行引擎的理解

文章目录概述执行引擎的工作过程Java代码编译和执行的过程解释器&编译器Why???JVM如何选择的?热点代码及探测方式编译方式编译器的分类其他编译器(了解)概述“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但

2021-01-09 16:49:49 145

原创 JVM程序计数器的基本理解

概述PC寄存器(程序计数器)用来存储指向下一条字节码指令的地址,也就是即将要执行的字节码指令,由存储引擎读取下一条指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。PC寄存器是一块非常小的内存空间,是运行速度最快的存储区域。在JVM规范中,每个线程都有自己独立的程序计数器,生命周期与线程的生命周期保持一致。任何时间一个线程只能有一个方法在执行,也就是所谓的当前方法,程序计数器会存储当前线程正在执行的Java方法的JVM指令地址,如果正在执行的方法为native方法,

2021-01-08 15:51:38 708 1

原创 java堆核心概念

文章目录堆的核心概念堆内存结构细分新生代与老年代堆的核心概念Java堆区在JVM启动的时候即被创建。是JVM管理的最大一块内存空间,是GC执行垃圾回收的重点区域。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域,GC和OOM都存在。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,但并不是共享堆的全部,内部同样存在每个线程私有的缓冲区(如:ThreadLocal Allocation Buffer

2021-01-08 10:08:56 138

原创 Java中直接内存的理解和基本使用

概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。I来源于NIO(jdk1.4),通过DirectByteBuffer对象操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存Java的NIO库允许Java程序使用直接内存,用于数据缓冲区可能导致OOM:java.lang.OutOfMemoryError: Dire

2021-01-07 20:31:43 1855

原创 Nacos集群搭建和持久化配置

架构模型官网:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.htmlVIP(Virtual IP):一般由Nginx提供实际架构图如下具体搭建过程1、上传到linux从官网下载tar包上传到linux并解压2、更改持久化方式Nacos默认是使用自带的是嵌入式数据库derby将/conf/nacos-mysql.sql文件在数据库中执行更改方式如下:修改 /conf/application.properti

2020-12-17 19:30:22 163

原创 Nacos作为配置中心基本使用

基础配置在nacos上添加配置pom <dependencies> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactI

2020-12-17 19:27:22 550

原创 Nacos单机版基本使用&一消费者二提供者负载均衡配置

两个生产者的搭建新建项目:cloud-alibaba-provider-payment9001ymlserver: port: 9001spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址main@EnableDiscoveryClient@Spr

2020-12-17 19:24:24 319

原创 Nacos简介及安装

简介为什么叫nacos:前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service是什么:一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心,在CAP理论中保AP,等价于:Nacos = eureka + config + bus官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos的CAPNacos支持CP和AP模式的切换何时选用何种模式?一般来说,如果不需要存储服务级别的信息且服务实

2020-12-17 19:22:16 391

原创 window查看端口占用程序并终止

# 1. 根据端口找到进程netstat -aon|findstr "6800"# 2. 根据进程找到程序tasklist|findstr "10124"# 3. 杀死程序taskkill /f /t /im java.exe

2020-12-12 15:53:56 97

原创 SpringCloud整和Consul注册中心基本操作

概述及安装什么是Consul作用:服务发现:提供Http和DNS两种服务发现模式健康检查:支持多种协议,如HTTP、TCP、Docker、shell脚本定制化KV存储多数据中心提供自带的Web可视化界面下载和安装下载地址:https://www.consul.io/downloads.html中文文档:https://www.springcloud.cc/spring-cloud-consul.html下载解压后只有一个exe文件启动注意:不是双击exe文件打开

2020-11-23 23:08:57 122

原创 SpringCloud整和Zookeeper注册中心基本操作

文章目录问题?服务端配置1、依赖2、yml3、主启动类4、controller相关信息的查看客户端配置1、依赖2、yml3、启动类4、配置RestTemplate5、Controller问题?Zookeeper中注册的是临时节点还是持久节点?肯定是临时节点啊,当这个服务出现故障,这个节点自动消失,就可以通知到客户端,不然你搞个持久节点,怎么知道你服务还能不能用服务端配置1、依赖导入相关架包,注意版本对应注意:org.apache.zookeeper的版本要和服务器上的版本一致,不然会

2020-11-23 23:00:31 172 1

原创 Eureka注册中心基本操作&集群搭建

基本架构Eureka 采用 C-S 架构设计,EurekaServer 作为服务注册功能的服务器。其他模块通过Eureka 的客户端连接到 EurekaServer 并维持心跳连接,这样就可以很方便的监控其他微服务是否正常运行,如 SpringCloud 的一些其他模块(比如 Zuul)就可以通过 Eureka 来发现系统中的各个微服务是否正常运行。Eureka 包含两个组件,Eureka Server 和 Eureka Client。Eureka Server 提供服务注册服务,各个

2020-11-23 22:53:57 204

原创 IDEA配置强制显示Run Dashboard

在使用IDEA开发多个项目的时候,开启Run Dashboard可以提高我们的开发效率,一般情况下启动多个项目,Run Dashboard会自动开启,但有的时候就没有开启,在低版本的idea中可能就不会开启,下面就说下怎么强制开启该配置:第一步:打开项目所在位置可以看到一个.idea的文件夹第二步:进入.idea目录,编辑workspace.xml文件,在<component name="RunDashboard">节点下添加如下配置即可 <option name="co

2020-11-08 21:14:34 144

原创 IDEA中热部署配置

前言通常我们在进行Web应用开发或微服务开发时,改了代码就需要重新启动项目进行编译,有时候会影响我们的开发效率,特别是在开发微服务项目的时候,多个项目重启真的是有点拖慢开发效率,开发一上午,一半时间都是在重启项目。在springBoot中提供了一个热部署的jar包,只要引入这个jar包,并对idea进行简单的配置就可以使用。两种功能如下 :代码有任何改变就会重新编译项目。手动编译,当写完之后点击编译(比重启微快)怎么选择:如果你在开发新功能的时候,把项目停止再进行的开发,开发完成后只要进行

2020-11-08 21:04:38 616

原创 JVM中的类加载器子系统

文章目录总览类加载阶段概述类加载器的分类双亲委派机制用户自定义类加载器链接阶段的三个过程初始化阶段概述总览类加载器负责从文件或网络中加载class文件,在class文件的开头必须有特定的标识才可以被识别。类加载器只负责class文件的加载,至于它是否可以运行,取决于ExecutionEngine决定Class File 加载到JVM中被称为DNA元数据模板,存放在方法区。方法区除了存放类的基本信息外,还可以存放运行时常量池信息,可能还包括字符串字面量和数据常量(这部分常量信息是class文件中常

2020-10-31 21:54:23 319 3

原创 SpringBoot整合WebSocket

WebSocket介绍WebSocket是一种网络通讯协议,从Html5开始支持的一种在单个 TCP 连接上进行双向通信的协议。HTTP协议是一种无状态的、无连接的、单向的应用层协议,通信请求只能由客户端发起,服务端对请求作出应答处理,http协议无法实现服务器主动向客户端发送消息。这种单向请求的特点,如果服务器有连续的转态发生变化,客户端要获知就非常的麻烦,在以前的解决方案是通过频繁的异步ajax请求实现长轮询,但轮询的效率低,而且非常浪费性能(因为必须不停的连接)http协议:WebSock

2020-10-31 21:46:19 367

原创 java多线程:19、J.U.C之并发容器

介绍HashMap是我们用得非常频繁的一个集合,但是它是线程不安全的。并且在多线程环境下,JDK1.7下put操作是有可能产生死循环,不过在JDK1.8的版本中更换了数据插入的顺序,已经解决了这个问题。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式。一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。而J.U.C给我们提供了高性能的线程安全HashMap:ConcurrentHas

2020-10-20 09:21:33 169

原创 java多线程:18、J.U.C之Semaphore

介绍Semaphore([三迫否])是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore维护了一个信号量许可集。线程可以获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。线程可以释放它所持有的信号量许可,被释放的许可归还到许可集中,可以被其他线程再次获取。举个例子:假设停车场仅有5个停车位,一开始停车场没有车辆,先后到来三辆车,停车场车位够,安排进去停车,然后又来三辆,这

2020-10-20 09:19:11 115

原创 java多线程:17、J.U.C之CountDownLatch

介绍CountDownLatch是一个计数的闭锁,作用与CyclicBarrier有点儿相似。在API中是这样描述的:用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,调用await 方法的线程会一直受阻塞。当计数到达零时,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。CountDownLatch:一个或者多个线程等

2020-10-20 09:17:36 122

原创 java多线程:16、J.U.C之CyclicBarrier

介绍CyclicBarrier([赛可理可白瑞]):同步屏障,在JDK1.5被引入的一个同步辅助类,在API中是这么介绍的:允许一组线程全部等待彼此达到共同屏障点的同步辅助。 **循环阻塞**在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环,因为它可以在等待的线程被释放之后重新使用。CyclicBarrier好比一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过。实现分析CyclicBarrier的内部是使用重入锁

2020-10-20 09:16:30 85

SSM整和Oracle实现简单CRUD

使用SSM整个Oracle,并实现简单CRUD操作,详细步骤查看博客:https://blog.csdn.net/qq_43332570/article/details/108784511

2020-09-24

畅购商城数据库脚本完整版+docker镜像截图.zip

包含畅购商城项目的数据库的所有脚本和docker镜像的截图,都是我从虚拟机上再导出的,主要包括changgou_all、changgou_content、changgou_oauth、changgou_business、changgou_config、changgou_goods、changgou_order、changgou_seckill、changgou_system、changgou_user 10个数据库和其他的一些数据库。

2020-08-26

tinydemo-springMvc.zip

这个Demo主要演示了tiny富文本编辑器在SpringMvc中进行文件上传,图片的上传、还有一个基本使用。

2020-08-26

Fiddler_3.8.5_中文版.zip

Fiddler_3.8.5_中文版安装包,Fiddler是现在常用的一款Http抓包工具,在PC端、Android、IOS端都可以使用。

2020-08-26

fastdfs5.11相关安装包.zip

fastdfs5.11 Linux下 相关安装包,分别有fastdfs-nginx-module,fastdfs,nginx,libfastcommon模块

2020-05-07

空空如也

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

TA关注的人

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