自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

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

原创 【一分钟搞懂】Maven依赖原则:最短路径和先声明优先 指的是啥?

你只需要在你的项目中以坐标的方式依赖一个 jar 包,Maven 就会自动从中央仓库进行下载,并同时下载这个 jar 包所依赖的其他 jar 包。项目中的jar包一般都不是独立的,会有互相依赖的情况,我们凭肉眼自己无法去判断某个jar包究竟依赖了哪些包,哪怕少一个jar包你的代码也跑不起来。而Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来,程序员不用去了解某个jar到底还是否依赖其他jar包。是直接依赖,路径最短,那么。的依赖坐标,那么导入的就是。

2023-08-15 21:40:20 454

原创 VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

hadoop集群搭建,完整详细。

2023-07-29 21:53:05 9086 6

原创 Spark SQL中的函数操作实例+Scala代码演示

scala代码

2023-07-22 21:17:11 946 1

原创 虚拟线程详解

虚拟线程又叫协程。JDK19 中引入了虚拟线程,这是一个重大的更新项,虚拟线程在Project Loom项目中已经孵化很久了。据官方阐述,引入的原因是。允许通过 java.lang.ThreadAPI 的现有代码来使用虚拟线程,并且只做最小的更改。(当然虚拟线程不是Java语言独有的,更不是Java发明的,只是JDK19时才引入,比如Go语言的goroutines和Erlang语言早就支持虚拟线程了)各种语言争相引入虚拟线程的原因就是它能以简单的方式来提高系统并发性能。那么虚拟线程是怎么做到的?

2023-04-09 21:27:28 1542 1

原创 SpringBoot 和 Vue前后端分离在线工具项目实战,源码+超详细讲解

一、前言主要通过SpringBoot和Vue来实现一个前后端分离的在线工具平台,包含PDF转换、图片处理、文本处理、图表展示、二维码工具等功能。为了更直观展示项目效果,也给大家提供了在线体验地址:http://49.234.28.149, 源码资源见文末。通过此项目大家可以了解和学习到以下知识,包括但不限于:springboot + mybatis + mysql 等后端知识基础的前后端增删改查交互流程前端如何请求后端接口前端如何请求三方接口前端请求拦截器实现前端组件的封装&amp.

2022-08-31 09:14:09 3323

原创 一看就懂:这就是机器学习过程!

一看就懂:这就是机器学习过程!

2022-08-29 22:12:38 378

原创 响应式编程将成主流?啥是响应式编程?

一、响应式编程解决什么问题?Spring framework 5 最大的变化就是引入了响应式编程(Reactive Programming)。Spring 为啥要引入这个特性?八个字:“逆水行舟,不进则废”!在2009 年,微软提出了响应式编程,旨在应对高并发服务器端开发场景。随后各语言很快跟进,都拥有了属于自己的响应式编程实现,比如Go、Node 等新语言。Java 作为服务器端开发语言老大的地位受到了不小的挑战,后有追兵,不得不进化啊。所以,响应式编程的初心,就是去满足高并发下的服务器端开.

2022-05-09 19:15:35 1737

原创 面试官:你知道 LRU算法 —— 缓存淘汰算法吗?

常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来。缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据。常用淘汰算法有 LRU,LFU,FIFO。这篇文章我们聊聊 LRU 算法。一、LRU 简介LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓存容量的满时候,优先淘汰最近很少使用的数据。假设

2021-10-03 12:56:53 13200

原创 Redis的基本数据类型及其底层实现原理

最近去面试,面试官都会先问:Redis中有哪些数据类型?接着就会问你知道某个类型的底层实现么?现在一块来了解下。​四、Redis支持的6种数据类型三种特殊数据类型:1.geospatial: Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。2.hyperloglog:基数:数学上集合的元素个数,是不能重复的。这个数据结构常用于统计网站的 UV。3.bitmap: bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状

2021-10-03 12:31:34 3189 2

原创 面试官:你了解一致性Hash算法吗?

面试官问这个问题不奇怪,可以说一致性Hash算法是分布式系统中的一个基石一样的算法,没有这个算法可能很多问题不太好解决。一、解决什么问题?先看看一致性Hash算法到底解决的是什么场景中的问题。假设有三台缓存服务器,用于缓存图片,这三台缓存服务器编号为0号、1号、2号。现在,有3万张图片需要缓存,这些图片被均匀随机的缓存到这3台服务器上,每台服务器能够缓存1万张左右的图片,以便它们能够分摊缓存的压力。但是如果这样做,当我们需要访问某个缓存项时,则需要遍历3台缓存服务器,从3万个缓存项中找到我们需要

2021-10-02 11:45:15 429 1

原创 备战大厂—— Leetcode 刷题(二叉树、三数和、回文子串、公共祖先、TOP K、栈与对列的互相实现等大厂常考算法 【56】 题)

最近面了京东(已拿offer)、百度(等待二面)、字节(二面挂)、蚂蚁金服(等待三面中),大厂都考了算法,一般算法占面试的20%,但是算法挂了希望就不大了(面试字节,面试官让手写代码的地方有两个:一个是手写静态内部类型的单例模式,这个写出来了,另一个就是全排列算法,没写出来,挂了),这里梳理总结下已经考到的算法以及常考的算法,不打无准备之仗!(给自己梳理的,就不对大家可见了,如果想看那就私信我!)

2021-10-01 23:26:40 178

原创 分布式限流方案

一、限流算法主要的限流算法包含:漏桶算法、令牌桶算法、计数器 。每种限流算法详细可以参考这里二、分布式限流方案一般也就分为三种:Gateway限流,redis+lua实现限流,nginx限流 。2.1 Gateway限流Spring Cloud Gateway 中提供了 RequestRateLimiterGatewayFilterFactory 类,这个是基于令牌桶实现的。它内置RedisReteLimiter,依赖于Redis存储限流配置和统计数据,也可以通过继承org.spri.

2021-09-24 18:09:03 834

原创 蓝绿发布?灰度发布?滚动发布?

一、概述应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布、灰度发布和滚动发布,目的是尽可能避免因发布导致的流量丢失或服务不可用问题。下面先大致介绍下三种发布形式。蓝绿发布项目逻辑上分为A、B组,在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。当A组升级完毕,负载均衡重新接入A组,再把B组从负载列表中摘除,进行新版本的部署。A组重新提供服务。最后,.

2021-09-23 11:15:08 402

原创 Spring Cloud 核心组件协作及原理

Spring Cloud不能只停留在使用的层面,其底层的很多原理也需要去知晓。业务举例:一、Eureka如上图所示,库存服务、仓储服务、积分服务中都有一个Eureka Client组件,这个组件专门负责将这个服务的信息注册到Eureka Server中。说白了,就是告诉Eureka Server,自己在哪台机器上,监听着哪个端口。而Eureka Server是一个注册中心,里面有一个注册表,保存了各服务所在的机器和端口号。比如订单服务里的Eureka Client组件,它会找Eureka S

2021-09-14 21:39:31 428

原创 分库分表方案

不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。1、IO瓶颈第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表 。第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库 。2、CPU瓶颈第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引

2021-08-08 21:10:30 301

原创 k8s相关

一、k8s是什么?请说出你的了解?Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。K8S是Google公司推出的,它来源于由Google公司内部使用了15年的Borg系统,集结了Borg的精华。二、K8s架构的组成是什么?和大多数分布式系统一样,K8S集群至少需要一个主节点(Master)和多个计算节点(Node)。主节点主要用于暴露API,调度部署和节点的管理;计算节点运行一个容器运行环境,一般是docker环境(类似do.

2021-08-08 11:05:48 200

原创 SQL优化

1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及 order by 涉及的列上建立索引。3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t

2021-08-05 23:03:49 148

原创 从源码角度讲讲ReentrantLock及队列同步器(AQS)

JDK 独占锁(排他锁)的实现除了使用关键字 synchronized 外,还可以使用ReentrantLock。虽然在性能上 ReentrantLock 和 synchronized 没有什么大区别,但 ReentrantLock 相比 synchronized 而且功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。ReentrantLock 与 synchronized 的区别:synchronized 是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock 也

2021-08-04 22:27:39 266

原创 【八】多线程 —— AQS原理、ReentrantLock原理

一、AQS 框架简介AQS即AbstractQueuedSynchronizer是JUC(java.util .concurrent工具包的简称)里是一个用于构建锁和同步器的工具框架。Ok,它定性为一种框架,且是工具框架。那就是说,通过这个工具框架我们可以更方便的更便捷的去实现我们想要的功能,这里当然指的是多线程相关的功能。可以想想其他的框架Spring,Mybatis等是什么作用,类比一下。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可.

2021-08-03 22:55:03 353

原创 【七】多线程 —— 线程池

池化技术有很多, 比如线程池、数据库连接池、HTTP连接池等等。线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(创建的线程,实际最后要和操作系统的线程做映射,很消耗资源)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。一、自定义一个简单的线程池阻塞队列中维护了由主线程(或者其他线程)所产生的的

2021-08-03 19:33:43 360

原创 【六】多线程 —— 共享模型之不可变

如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改。比如类用 final 修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性。一、日期转换的问题SimpleDateFormat 不是线程安全的,可能出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果,例如:public class SimpleDateFormatTest { public static void main(String[] arg

2021-08-03 14:47:51 184

原创 【五】多线程 —— 共享模型之无锁

Java中 synchronized 和 ReentrantLock 等 独占锁 就是 悲观锁 思想的实现。管程即monitor是阻塞式的悲观锁实现并发控制。AtomicInteger 的内部并没有用锁来保护共享变量的线程安全,这是一种乐观锁的思想,说是锁实际没有锁,是一种无锁的实现。最重要的无锁方式就是CAS(还有volatile,适用于一写多读的场景),它使用原子操作来保证线程访问共享资源的安全性,相对于悲观锁思想的synchronized,reentrantLock来说, CAS的方式效率会更好!

2021-08-03 12:52:19 265

原创 【四】多线程 —— 内存模型

一、Java内存模型JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受线程上下文切换的影响可见性 - 保证指令不会受cpu 缓存的影响有序性 - 保证指令不会受cpu 指令并行优化的影响主要是从Java的层面进行了抽象和封装,使得开发人员不用直接面对底层操作。1.1 可见性保证指令不会受cpu 缓存的影响。【退不出的循环】先来看一个现象,m.

2021-08-02 23:00:32 688 1

原创 【三】多线程 —— 设计模式

基本概念

2021-08-02 14:43:57 282

原创 【一】多线程 —— 基础概念

一、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)线程一个进程之内可以分为一到多个线程。一个线.

2021-08-01 23:24:05 311

原创 【二】多线程 —— 共享模型

引子两个线程对初始值为 0 的同一个变量分别做自增和自减,各执行5000次,这个变量结果还是不是0?public class AddMinus5000TimeEach { static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i =

2021-08-01 20:16:05 496

原创 【十五】不要问我JVM —— OOM及性能优化案例与解决

一、内存泄漏案例分析(一)public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } // 入栈 pu.

2021-07-31 21:50:47 605

原创 【十四】不要问我JVM !—— 性能调优工具

使用上述命令行工具或组合能帮您获取目标 Java 应用性能相关的基础信息,但它们存在下列局限:无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconsole、jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多

2021-07-31 20:54:57 848 5

原创 【十三】不要问我JVM !—— 性能调优

一、背景说明1.1、生产环境中的问题生产环境发生内存溢出该如何处理?生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?1.2、为什么要调优?防止出现OOM解决OOM减少Full GC出现的频率1.3、不同阶段的考虑上线前项目运行阶段线上出现OOM二、调优的概述2.1、监控.

2021-07-31 19:50:02 319

原创 【十二】不要问我JVM !—— 字节码

一、Java的前端编译器前端编译器的主要任务就是负责将符合Java语法规范的Java代码(. java)转换为符合JVM规范的字节码文件(.class)。javac是一种能够将Java源码编译为字节码的前端编译器。javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤分别是:词法解析语法解析语义解析生成字节码二、字节码2.1 字节码文件里是什么?源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVM的指令,而不像.

2021-07-31 18:15:51 484 1

原创 【十一】不要问我JVM !—— GC日志

通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略。一、GC日志命令-XX:+PrintGC 输出GC日志(这个只会显示总的GC堆的变化)。类似: -verbose:gc-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamp 输出GC的时间戳(以日期的形式,如:2020-08-13T22:17:35.354+0800-XX:+PrintHeapAtGC

2021-07-31 13:11:12 171

原创 【十】不要问我JVM !—— 垃圾回收器

一、GC分类按垃圾回收器的线程数分分为串行并行垃圾回收器。串行垃圾回收器只有一个垃圾回收线程,并行垃圾回收器有多个垃圾回收线程。需要注意的是:串行以及并行垃圾回收器在回收垃圾的时候,都会Stop the World。(这里的线程指的是垃圾回收的线程)串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以,串行.

2021-07-31 12:54:20 324

原创 【九】不要问我JVM !—— 引用

Reference 子类中只有终结器引用是包内可见的,其他3中引用类型均是public,可以在应用程序中直接使用。强引用(Strong Reference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj = new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用(Soft Reference):在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有

2021-07-30 22:01:55 124

原创 【八】不要问我JVM !—— 垃圾!对不起我不是针对你,而是在座的各位!

一、什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。二、为什么需要GC?1.如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。2.除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。3.随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又.

2021-07-30 18:14:03 208

原创 【七】不要问我JVM !—— 执行引擎 + 编译过程 + 解释器 + JIT编译器 + 热点代码探测

执行引擎是Java虚拟机的核心组成部分之一。虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM识别的字节码指令、符号表和.

2021-07-30 14:59:37 304

原创 【六】不要问我JVM !—— 对象实例化 + 内存布局 + 对象的访问定位 + 直接内存

一、对象的实例化字节码反编译后如下:1.1 创建对象的方式1. new:最常见的方式、Xxx 的静态方法,XxxBuilder/XxxFactory 的静态方法2. Class 的 newInstance 方法:反射的方式,只能调用空参的构造器,权限必须是 public3. Constructor 的 newInstance(XXX):反射的方式,可以调用空参、带参的构造器,权限没有要求4. 使用 clone():不调用任何的构造器,要求当前的类需要实现 Cloneable 接口,实.

2021-07-30 12:32:01 209

原创 【五】不要问我JVM !—— 方法区

一、栈、堆、方法区的交互关系 public class AppMain { //运行时,JVM把AppMain的信息都放入方法区 public static void main(String[] args) { //main成员方法本身放入方法区。 Sample test1 = new Sample( " 测试1 " );//test1是引用,所以放到栈区里,Sample是自定义对象应该放到堆里面 .

2021-07-30 11:36:28 175

原创 【四】不要问我JVM !—— 逃逸分析

一、堆是分配对象的唯一选择吗?在JVM中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis) 后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。...

2021-07-29 22:14:30 247

原创 【三】不要问我JVM !—— 堆

一、堆(Heap)的核心概述一个进程就对应一个JVM实例,一个JVM实例就只有一个运行时数据区,只对应一个堆及一个方法区。

2021-07-28 23:26:05 320 1

原创 【二】不要问我JVM !—— 虚拟机栈 + 本地方法栈 + 本地方法接口

JVM定义了若干运行时数据区,其中一些随着JVM的启动而创建,退出而销毁。还有一些数据区域和线程一一对应,随着线程的开始而创建、结束而销毁。上图中,红色为线程共享区域(堆、元空间),灰色是线程私有(计数器、栈、本地栈)。一、JVM中的线程每个JVM只有一个RunTime实例,即运行时环境。JVM中,每个线程都和操作系统的线程一一对应,当一个Java线程准备执行时,此时操作系统本地线程也会对应创建。Java线程执行结束之后,操作系统本地线程也会回收。操作系统把所有线程安排到一个可用的CPU.

2021-07-26 22:53:53 300

springboot项目linux系统下 通用 启动脚本

springboot项目linux系统下 通用 启动脚本 支持日志输出、远程调试开启 支持start、stop、restart命令 通用启动脚本,只需将服务名改成自己的服务名即可! 保证可用!

2022-07-10

spring boot + Vue 实现汽车销售管理系统

本项目基于spring boot以及Vue开发。 idea(推荐)、jdk1.8、mysql5.X(不能为8驱动不匹配)、maven 功能完整,可以运行 脚本、说明文档等完整 可借鉴学习,可二次开发

2022-07-10

spring boot + Vue 实现汽车销售管理系统

本项目基于spring boot以及Vue开发。 idea(推荐)、jdk1.8、mysql5.X(不能为8驱动不匹配)、maven 功能完整,可以运行 脚本、说明文档等完整 可借鉴学习,可二次开发

2022-07-10

课程管理系统源码+数据库sql+文档 (前端 + 后端 源码)

功能完整,可运行 启动文档、数据库脚本、启动脚本等说明文档齐全 可以学习借鉴,可以二次开发

2022-07-10

空空如也

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

TA关注的人

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