自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 内存溢出原因(发现问题)

但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。Java中的内存溢出(Memory Overflow)通常指的是Java虚拟机(JVM)在运行时耗尽了可用内存资源,无法再分配足够的内存来满足程序的需求。一般springBoot应用,同一时间的最大量是有限的,默认情况下tomcat的线程池中的线程最多只有200个,所以同一时间最多只能处理两百个请求。2、每一个请求,内存中加载的数据比较多,比如说一个用户请求了几千条,几万条数据。

2024-05-20 20:55:47 1501 2

原创 ThreadLocal详解

这就意味着使用完ThreadLocal,CurrentThread依然运行的前提下,就算忘记调用remove方法,弱引用比强引用可以多一层保障:弱引用的ThreadLocal会被回收,对应的value在下一次ThreadLocalMap调用set,get,remove中的任一方法的时候会被清除,从而避免内存泄漏。我们可以得知 ThreadLocal 的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。

2024-05-19 22:38:25 1092

原创 JVM—>内存调优(发现问题)

内存泄漏(memoryleak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没有特别说明则讨论的都是堆内存泄漏。内存泄漏(memoryleak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。

2024-05-15 20:55:01 1372

原创 垃圾回收器

首先先来回答一下上篇文章中最后留给大家的问题:为什么分代GC算法要把堆分为年轻代和老年代?所以分代GC算法将堆分成年轻代和老年代的比例来适应不同类型的应用程序,提高内存的利用率和性能1、可以通过调整年轻代和老年代的比例来适应不同类型的应用程序,提高内存的利用率和性能。2、新生代和老年代使用不同的垃圾回收算法,新生代一般选择复制算法,老年代可以选择标记-清除和标记-整理算法,由程序员来选择灵活度较高。

2024-05-13 20:35:03 1097 1

原创 JVM之垃圾回收算法

最大暂停时间指的是所有在垃圾回收过程中的STW时间的最大值,比如下图中,黄色部分的STW就是最大暂停时间,显而易见上面的图比下面的图拥有更少的最大暂停时间。1、吞吐量高:复制算法只需要遍历一次存活对象复制到To空间即可,比标记-整理算法少了一次遍历的过程,因而性能较好,但是不如标记-清除算法,因为标记清除算法不需要进行对象的移动。随着对象在Eden区越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,成为Minor GC或者Young GC。1、标记阶段,将所有存活的对象进行标记。

2024-05-13 10:53:45 1211

原创 java反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。反射是一种强大的特性,允许程序在运行时检查和修改类、方法、字段等的信息,以及动态创建对象、调用方法和访问属性。1、反射第一步:加载类,获取类的字节码:class对象。1、获取类的全部构造器(只能获取public修饰的)3、获取某个构造器(只能获取public修饰的)class通过了从类中获取成员变量的方法。Class提供了从类中获取构造器的方法。获取到成员变量的作用:赋值、取值。3、获取类的成员变量。4、获取类的成员方法。

2024-05-06 19:40:37 681 2

原创 分布式事务—> seata

分布式事务是一种特殊类型的事务,它涉及多个分布式系统中的节点,包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。在分布式事务中,一次大型操作通常由多个小操作组成,这些小操作分布在不同的服务器上,并且属于不同的应用。分布式事务的关键在于确保这些小操作要么全部成功,要么全部失败,以保持数据的一致性。这种事务模型主要用于确保不同数据库或系统之间的数据一致性。分布式事务管理通常面临一些独特的挑战,例如确保所有参与系统的事务日志之间的一致性,以及处理网络延迟或断连的情况。

2024-05-03 11:02:00 3562 1

原创 数据库和缓存一致性问题

一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。

2024-05-02 16:14:09 1422 1

原创 类的生命周期

1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。程序员可以使用Java代码拓展的不同的渠道。2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。3、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

2024-04-26 18:47:19 1376

原创 MySQL锁详解

行级锁是MVSQL中的一种锁定机制,它可以对数据库表中的单独一行进行锁定。相比于表级锁和页锁,行级锁的粒度更小,因此在处理高并发事务时,能提供更好的并发性能和更少的锁冲突。然而,行级锁也需要更多的内存和CPU资源,因为需要对每一行都进行管理。在MVSQL中,行级锁主要由InnoDB存储引擎提供。InnoDB支持两种类型的行级锁:共享锁(S锁)和排他锁(X锁)1、共享锁(S锁):共享锁也称为读锁,它允许一个事务读取一行数据。

2024-04-25 22:23:30 1056

原创 redis分布式锁

分布式锁,就是在分布式系统中使用的锁。在单体应用中,我们通过锁解决的是控制共享资源访问的问题分布式锁,就是解决了分布式系统中控制共享资源访问的问题与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。

2024-04-21 22:37:38 1008

原创 java的各种锁

我们先来看看有什么锁。

2024-04-20 19:21:34 1162

原创 JMM与内存屏障

只靠sychronized和volatile关键字来保证原子性、可见性以及有序性,那么编写并发程序可能会显得十分麻烦,幸运的是,从JDK 5开始, Java使用新的JSR-133内存模型,提供了happens-before原则来辅助保证程序执行的原子性、可见性以及有序性的问题,它是判断数据是否存在竞争、线程是否安全的依据,happensbefore 原则内容如下。多个cpu从主内存读取同一个数据到各自的高速缓存,当其中某个cpu修改了缓存里的数据,该数据会。指令重排序三大特性:可见性,有序性,原子性。

2024-04-19 10:59:25 1065

原创 redis热key问题如何解决?

热键通常是被频繁访问的数据,如果这些数据量很大,可能会导致 Redis 内存占用过高,造成内存压力。当 Redis 内存使用超过物理内存限制时,可能会触发内存淘汰策略,导致热键数据被驱逐,影响系统性能。在Redis中,热键问题是指那些经常被访问的键,它们会消耗大量的Redis服务器资源,当大量的请求集中在一个key上,会导致这个节点的cpu,内存等资源被大量占用,影响着redis集群的性能和稳定性。:这个热key突然在查询的时候过期了,那么大量的请求就会进入数据库中,会造成缓存击穿的问题。

2024-04-17 22:06:25 939 1

原创 MySQL Explan执行计划详解

首先我们采用explan执行计划 执行一条sql,发现返回了12个列,下面会详细解释每一列。

2024-04-17 20:56:23 1306 1

原创 短信防刷之滑动验证码

请完成下列验证后继续

2024-04-16 18:56:56 1588 2

原创 http协议详解

HTTP请求流程通常涉及以下步骤:此外,在HTTP请求过程中,浏览器还会检查是否有缓存的资源可以使用,以减少对服务器的请求和提高页面加载速度超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任

2024-04-15 17:02:25 1075 1

原创 String类为什么是不可变类

在Java中将String设计成不可变的是综合考虑到各种因素的结果,需要综合考虑内存、同步、数据结构以安全方面的考虑。String被设计成不可变的主要目的是为了安全和高效(效率)。

2024-04-14 22:39:50 1239 2

原创 线程池参数如何设置

内部是通过队列+线程实现的,当我们利用线程池执行任务时,如果此时线程池中的线程数量小于corePoolSize(核心线程数),即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务,如果此时线程池中的线程数量等于corePoolSize,但是阻塞队列(LinkedBlockingQueue)未满,那么任务被放入阻塞队列。如果此时线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolize,建新的线程来处理被添加的任务。

2024-04-11 22:24:37 4704 1

原创 多线程与线程池

线程是系统能够调度的最小单元,在一个进程里面可以有多个线程,进程中负责程序执行的执行单元。一个进程中至少有一个线程。当多个线程访问某个类时,不管运行时环境采用何种类、调度方式或者这些线程将如何交替执行,并且在主要调用代码中不需要任何额外的同步和协同,这个类能表现出正确的行为,那么这个类就是线程安全的那么怎么保证线程安全嘞就是把对象封闭到一个线程里,只有这一个线程能够看到此对象。那么就算是这个对象不是线程安全的也不会出现不安全的问题,这就是线程封闭。

2024-04-04 21:00:48 1178 1

原创 数据库读写分离(主从复制)和分库分表详解

读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。这样的话,就能够小幅提升写性能,大幅提升读性能。其实分库分表是牵扯到高并发的,因为分库分表无非来说就是为了支撑高并发、数据量大的问题。尤其进入稍微大一点的公司或者互联网公司,这些都是必须掌握的!分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。分表:从单张表拆分成多张表的过程,将数据散落在多张表内。数据分片指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果。

2024-03-31 11:52:13 4620 5

原创 为什么要使用MQ?

MQ(message queue),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。

2024-03-30 11:35:45 2005

原创 websocket

答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,说白了就是他允许服务器主动给客户端主动发送消息,客户端也可以给服务器发消息为什么需要?疑问?我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?答:因为 HTTP 协议有一个缺陷:通信只能由客户端发起。并且websocket是一种持久协议,htpp是非持久协议现在很多网站都有实时推送的需求,比如聊天,客服咨询等http能不能实现聊天的效果?

2024-03-29 22:40:24 1240 1

原创 Redis

大家好,我又又又又又来啦!今天给大家介绍一下redis一、redis介绍redis全称:Remote Dictionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BSD协议。是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

2024-03-29 18:54:36 1540 1

原创 jenkins进行自动化部署

运行一个 Docker 容器,映射主机端口 8686 到容器内部的端口 8080,设置时区为 Asia/Shanghai,容器的名称为。hello,大家好,前文我们已经下载好我们的jenkins了,下面我们用jenkins来实现自动化部署啦!将下载好maven中的/maven/apache-maven-3.9.6/conf/settings中的。然后我们点击保存,点击开始构建,就成功啦,等到构建完成之后,我们可以看看自己的容器有没有启动成功哦~并赋值为 'yanshuling',用于指定应用程序的名称。

2024-03-26 20:16:28 1667

原创 Docker 安装Jenkins

这款软件可以供我们安装,安装成功以后在浏览器中输入 http://localhost:8080(或者是输入http://安装Jenkins电脑的IP:8080)会出现一个界面,在这个界面上进行一些配置,我们就可以通过这个软件来管理我们正在开发的项目,可以让它来减少我们软件开发的时候的出错率,替我们把软件合到一起,并且将有问题的部分检测出来。是基于java开发的一种持续集成工具,用于自动化软件项目的构建、测试和部署流程,监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。

2024-03-22 20:30:13 1532 1

原创 RabbitMQ之“延时队列”

延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费

2024-03-21 22:34:23 3188 1

原创 过滤器和拦截器

第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。第二步:在配置文件中注册定义的拦截器。第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

2024-03-20 11:52:11 752 1

原创 常见js功能

/处理选中的id})

2024-03-19 20:35:40 608 1

原创 SpringBoot项目 使用Dockerfile创建镜像与容器

DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本DockerFile内容基础知识1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数2、指令按照从上向下,顺序执行3、#表示注释每个指令都会创建一个新的镜像层并且对于镜像进行提交1、Docker执行DockerFile的大致流程2、Docker从基础镜像运行一个容器3、执行一条指令并且对于容器做出修改4、执行类似docker commit的操作提交一个新的镜像层。

2024-03-17 11:24:54 5276 5

原创 java环境变量配置

在下载页面中根据自己的系统选择对应的版本,本文以JDK1.8(8)系统为例:下载后直接安装就好,尽量放在C盘,可以自己在c盘创建一个文件夹存放。

2024-03-17 09:47:43 473 1

原创 JDK1.8新特性

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。JDK1.8除了新增了lambda表达式、stream流之外,它还新增了全新的日期时间API。

2024-03-16 12:52:31 1240 1

原创 配置MAVEN环境

配置Maven环境先来介绍一下mavenMaven 是一个流行的构建工具和依赖管理工具,用于管理 Java 项目的构建、发布和依赖。它提供了一个标准化的项目结构、构建生命周期和插件体系,使开发人员能够更轻松地构建和管理复杂的 Java 项目。下面是 Maven 的一些关键概念:项目对象模型(Project Object Model,POM):Maven 项目的核心是一个名为 POM 的 XML 文件。POM 文件描述了项目的元数据、依赖关系、构建配置和插件等信息。

2024-03-15 20:54:29 8625 7

空空如也

空空如也

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

TA关注的人

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