自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一棵灬大树的博客

学生萌新一枚^[]^

  • 博客(133)
  • 资源 (5)
  • 收藏
  • 关注

原创 【Java】—JavaBean转换方法详解

在实际工程中对于一次请求可能涉及到多个对象转换过程,如果对于每一次转换都手动去维护一个转换方法工作量是非常大的,而且在后续业务拓展时,如果我们有增加字段的需求,对于每一层的转换方法都要去维护变更,这是一件很麻烦的事情,这篇文章推荐一些可以实现自动转换的方法

2024-10-19 23:08:48 931

原创 【Java】—一篇搞懂POJO和VO、BO、DTO、PO模型

POJO(Plain Old Java Object/Plain OrdinaryJava Object)是指普通的Java对象,它是一个简单的Java类,通常没有实现特定的接口或继承特定的类。POJO对象的设计原则是简单、普通、纯粹的Java对象,不依赖于特定的框架或技术。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

2024-10-19 23:00:06 1855

原创 【JVM】—深入理解ZGC回收器—关键技术详解

从ZGC的内存布局、着色指针和读屏障三个关键技术出发,详解解释ZGC性能高的原因

2024-10-18 23:14:35 1486

原创 【JVM】—深入理解ZGC回收器—背景概念&回收流程

ZGC初始化时会为堆分配内存,并将所有对象标记为“存活”状态。这个阶段主要识别哪些对象是不再使用的。ZGC使用了基于Card Table的追踪算法(G1中的CSet与RSet概念)来发现引用关系。标记过程是并发的,意味着它可以与应用程序的执行同时进行,以减少停顿时间。在这个过程中,ZGC会维护一个引用队列,用于跟踪新创建的对象或更新的引用。虽然ZGC的目标是最小化暂停时间,但仍然需要短暂的暂停来安全地重定位对象。

2024-10-18 22:58:40 1081

原创 【JVM】—G1 GC日志详解

G1 有两个阶段,它会在这两个阶段往返,分别是 Young-only,Space Reclamation.Young-only阶段包含一系列逐渐填满老年代Regin的 GC;Space Reclamation 阶段G1会递进地回收老年代Regin的空间,同时也处理新生代Region

2024-10-17 23:45:58 1859 1

原创 【JVM】—G1中的Young GC、Mixed GC、Full GC详解

G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。 Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。 Mixed GC:选定所有年轻代里的Region,外加根据Global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。

2024-10-17 23:35:50 2251

原创 【JVM】—深入理解G1回收器—回收过程详解

G1收集可以分为两大部分:全局并发标记(global concurrent marking);拷贝存活对象(evacuation),或者叫迁移;G1有两种GC模式:Young GC和Mixed GC,Young GC和Mixed GC都是STW。

2024-10-16 23:01:20 1026

原创 【JVM】—深入理解G1回收器——概念详解

G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。

2024-10-16 22:48:56 1631

原创 【JVM】—JVM垃圾回收详解

垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占用的内存,这种机制减少了内存泄漏和内存管理错误的可能性。垃圾回收可以通过多种方式触发

2024-10-15 23:24:59 1021

原创 【JVM】—Java内存区域详解

根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。

2024-10-15 23:18:25 909

原创 【gRPC】—gRPC底层详解&RPC系列

因为工作💼上使用RPC协议是gRPC,为了进一步深入理解gRPC协议,特意开了这个RPC系列的坑,这个系列详细介绍了gRPC底层的Protocol Buffer协议、Java对于gRPC的底层实现和工作中可能会遇到的异常类型和case分析,同时也介绍了RPC的大概生态,这里整理一个目录方便查阅,该系列也持续更新中~

2024-10-14 23:37:31 709

原创 【gRPC】5—gRPC常见异常类型与分析

本篇文章主要梳理gRPC常见异常类型与异常case分析

2024-10-14 23:14:32 2142

原创 【gRPC】4—gRPC与Netty

gRPC跟Netty的关系主要包括如下几方面的依赖:依赖Netty实现的HTTP/2协议的封装,通过Listener机制监听HTTP/2的数据报文事件,完成网络相关处理;Reactor IO模型的依赖,Nio/Epoll;依赖Netty的ByteBuf完成流数据在内部中的缓存与流转;

2024-10-10 23:11:16 1329

原创 【gRPC】3—gRPC API设计详解

gRPC整体设计思路依附于HTTP/2协议,而HTTP/2是一个双向流协议,因此gRPC在API设计上也采用了Stream的方式

2024-10-10 23:06:57 1037

原创 【gRPC】2—gRPC与PB&桩代码生成与扩展

PB即protobuf全名是ProtocolBuffers,是谷歌推出的二进制序列化协议,提供IDL文件来定义各种类型的数据。目前整体协议版本是proto3,protobuf提供了从proto文件编译生成各个语言文件的功能。与此同时protobuf提供了丰富的插件机制,用户可以扩展生成的对应语言的文件,俗称桩代码生成。gRPC正是通过插件式的扩展机制完成相关桩代码的生成。

2024-10-09 22:26:19 1340

原创 【gRPC】1—gRPC是什么

想要理解好gRPC必须了解HTTP/2协议,因为不论是日常看到的异常栈还是gRPC涉及的相关定义都跟HTTP/2存在强绑定的关系。关于HTTP/2详细介绍请参见:https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-CN。

2024-10-09 22:18:09 1130

原创 【中间件】—一篇说明白API网关&常用API网关推荐

计算机网络中,网关(Gateway)又称网间连接器、协议转化器。类比计算机网络中的网关来说,在微服务环境中,Api网关是所有服务的流量入口,网关在接收到请求后进行处理,再转发到对应的服务;服务处理请求并返回给网关数据后,网关再将数据返回给原始请求方。

2024-10-08 23:36:11 2564

原创 【微服务】—SpringBoot入门

SpringBoot是一个集成了Spring技术栈的一个大整合,是一个简化了Spring应用开发的框架,可以一站式解决J2EE的开发流程。Spring使用作为内部日志,但底层日志实现是开放的。可对接其他日志框架。spring5及以后 commons-logging被spring直接自己写了。支持jullog4j2logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。logback是默认使用的。虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的。

2024-10-08 23:28:51 1474

原创 【RPC】—RPC介绍一篇就够了&RPC的选择

RPC远程调用的概念最早可以追溯到20世纪80年代,当时Sun Microsystems公司提出了一种名为ONC RPC(Open Network Computing Remote Procedure Call)的协议,用于在NFS(Network File System)中进行远程过程调用。此后,RPC成为了分布式系统中的一种重要通信方式,被广泛应用于各种分布式系统和应用中

2024-10-07 19:31:52 3546

原创 【RPC】—Thrift协议 & VS Protobuf

Thrift是一套包含序列化功能和支持服务通信的RPC框架,主要包含三大部分:代码生成、序列化框架、RPC框架,大致相当于protoc + protobuffer + grpc,并且支持大量语言,保证常用功能在跨语言间功能一致,是一套全栈式的RPC解决方案。Thrift整体架构图如下:Thrift 本身是一个比较大的话题,本文不会涉及到全部内容,重点介绍其中的序列化协议。

2024-10-07 19:26:36 1452

原创 【Java多线程】8——CompletableFuture

在Future接口下,我们只能通过调用get()方法来获取任务计算结果,但是只要目标任务没有执行完,get()方法会被阻塞——阻塞方式又回到了同步调用,这就和异步操作的初衷相违背了。从实现类的版本情况能看出,

2024-03-30 19:19:46 511

原创 【Java多线程】7——阻塞队列&线程池

在《阿里巴巴Java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显式的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。同时线程池不允许使用Executors去创建,而要通过方式,这一方面是由于JDK 中 Executor 框架虽然提供了如等创建线程池的方法,但都有其局限性,不够灵活;使用有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。

2024-03-30 19:16:46 2088

原创 【Java多线程】6——集合线程安全

写时复制、锁分段技术

2024-03-29 16:16:43 502

原创 【Java多线程】5——Lock底层原理

根据类的名字抽象的队列式同步器。AQS 定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。它维护了一个(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里 volatile 是核心关键词。getState()setState()Exclusive(独占,只有一个线程能执行)Share(共享,多个线程可同时执行)不同的自定义同步器争用共享资源的方式也不同。

2024-03-29 16:12:39 1101

原创 【Java多线程】4——特定场景解决办法

使用 Fork Join 框架能够帮助我们把一个大型任务,根据一定规律,拆分成小任务执行。如果拆分后的任务还不够小,可以以递归模式继续拆分,直到拆分到可以执行的程度。然后再把各个子任务执行的结果汇总到一起。Fork:拆分:把大任务拆分成小任务。Join:合并:把小任务执行的结果合并到一起。我们使用 Fork Join 框架只需要继承 RecursiveTask,然后重写 compute() 方法即可。任务拆分的逻辑任务拆分的操作:调用 fork() 方法。

2024-03-28 14:54:30 950

原创 【Java多线程】3——Lock API控制多线程

在实际场景中,读操作不会改变数据,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,Java 的并发包提供了读写锁,它表示两个锁,一个是读操作相关的锁,称为读锁,这是一种共享锁;一个是写相关的锁,称为写锁,这是一种排他锁,也叫独占锁、互斥锁。

2024-03-28 14:37:51 982

原创 【Java多线程】2——synchronized底层原理

为了减少获得锁和释放锁带来的性能消耗,引入了『偏向锁』和『轻量级锁』的概念。升级后锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。

2024-03-27 19:40:37 1222

原创 【Java多线程】1——多线程知识回顾

在一个进程中,需要同时处理多个不同任务,每一个任务由一个线程来执行。从这个意义上来说,可以把进程看做是线程的容器。

2024-03-27 19:31:55 889

原创 【消息队列】——Kafka入门一篇就够了!

Kafka 是一种分布式的,基于发布 / 订阅的消息系统。以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能;高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输;支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输;同时支持离线数据处理和实时数据处理;Scale out:支持在线水平扩展;

2024-03-26 14:09:00 3831

原创 【分布式】——降级&熔断&限流

什么是熔断,什么是降级,熔断与降级是同一个意思吗?如上图所示,服务A接收客户端请求,服务B提供给内部服务调用,每个服务部署的节点数至少两个。在事发之前的近一周,服务B都一直运行正常,而事发的那晚请求量突增一倍,显然,此次事故与请求突增脱不了干系。因突增请求导致服务B高负荷运转,超出临界点的请求最后超出设定的接口超时时间,再由于服务B的一个隐藏性能问题导致内存消耗殆尽,进程开始频繁GC,但服务A还是不断地往服务B发送请求,导致服务B奔溃,服务B的奔溃又直接导致服务A。

2024-03-26 13:57:34 1154

原创 【分布式】——分布式事务

整个 2PC 的事务流程涉及到三个角色 AP、RM、TM。AP 指的是使用 2PC 分布式事务的应用程序;RM 指的是资源管理器,它控制着分支事务;TM 指的是事务管理器,它控制着整个全局事务。(1)在准备阶段RM 执行实际的业务操作,但不提交事务,资源锁定(2)在提交阶段TM 会接受 RM 在准备阶段的执行回复,只要有任一个RM执行失败,TM 会通知所有 RM 执行回滚操作,否则,TM 将会通知所有 RM 提交该事务。提交阶段结束资源锁释放。

2024-03-25 23:32:09 1369 1

原创 【分布式】——CAP&BASE理论

BASE 是Basically Available(基本可用)、**Soft state(软状态)**和 **Eventually consistent (最终一致性)**三个短语的缩写。BASE 理论是对 CAP 中 AP 的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为“柔性事务。

2024-03-25 23:24:06 1092

原创 【RPC】—Protobuf编码原理

Protobuf的编码是基于变种的Base128的,在学习Protobuf编码或者是Base128之前,先来了解下Base64编码。

2023-07-04 20:38:52 1436

原创 【RPC】—Protobuf入门

在IM应用中,优化数据流量消耗过多的基本方法就是使用高度压缩的通讯协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源。当前IM应用中最热门的通讯协议无疑就是Google的Protobuf了,基于它的优秀表现,微信和手机QQ这样的主流IM应用也早已在使用它。什么是 Google Protocol Buffer?

2023-07-04 20:35:31 1336

原创 Java新特性-Predicate

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用接口

2023-07-04 20:32:27 595

原创 缓存三击-缓存穿透、缓存雪崩、缓存击穿

Redis作为目前使用最广泛的缓存,但在实际开发中会面临缓存异常,分别是缓存雪崩、缓存击穿和缓存穿透,这三种异常会导致大量请求从缓存转移到数据库,如果请求的并发量很大就会导致数据库崩溃。

2023-06-30 17:50:36 1266

原创 缓存穿透-布隆过滤器

如果是网络恶意攻击(每次key不一样,且数据库不存在),缓存占用了更多的内存;缓存空对象要考虑到缓存时间的设置。这时候设置一个较短的过期时间(通常设定的缓存过期为60秒),就会自动剔除这些键。如果过期时间设置的过大,数据库在此期间正好添加了该数据,就会出现数据不一致场景;通过消息系统或者其它方式来清除缓存中的空对象。而另一种方式就是使用布隆缓存器!

2023-06-30 17:45:07 454

原创 Java新特性-Optional

从 Java 8 引入的一个很有趣的特性是Optional类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。Optional是 Java 语言的有益补充 —— 它旨在减少代码中的。

2023-06-30 17:41:32 497

原创 Java新特性-stream()

在JAVA中,涉及到对数组Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。在JAVA7及之前/*** 【常规方式】* 从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个* @param sentence 给定的句子,约定非空,且单词之间仅由一个空格分隔* @return 倒序输出符合条件的单词列表。

2023-06-30 17:40:15 272

原创 Java新特性-Functon接口

为了更好的将函数作为参数,Java遂引入了Function接口。super V ,?super R ,?} }有一个抽象方法,暗示可以使用λ\lambdaλ表达式;该接口会接收一个参数,且会产生结果;在使用这个接口前需要明确定义参数类型和返回的结果类型(Java的泛型就是这么回事);里面有一个apply方法将会对参数进行操作,并返回结果;因为是函数式接口(),可以通过lambda表达式实现该接口;总之,要分清当前function,也就是当前对象,判断执行顺序。

2023-06-30 17:38:49 258

python食物数据爬取及分析(源码、爬取数据、数据可视化图表、报告)

python课程学期期末大作业 爬取数据网站为http://db.foodmate.net/yingyang/ 详细介绍数据爬取过程及数据分析可视化 详细内容见博主博客

2022-01-08

数据结构-栈与队列.zip

1.栈定义 2.循环队列定义 3.一个迷宫问题 4.最短路径 5.中缀转后缀表达式 6.计算表达式

2021-10-21

利用Qt5实现学生选课管理系统(超详细附思路和代码).zip

项目完整工程文件 详情可见博主项目博客

2021-10-02

mainwindow.cpp

mainwindow.cpp文件 详细内容见博主项目博客

2021-10-02

数据结构-数组.zip

1.多项式(表示、加法、乘法完整代码); 2.稀疏矩阵(表示、转置、快转置、加法、乘法完整代码); 3.字符串匹配(KMP算法)。

2021-09-21

空空如也

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

TA关注的人

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