自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分库分表及ShardingShpere-proxy数据分片

因为索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,高度越高,磁盘IO次数越多,查询就变慢。随着单表数据量的增加,对于数据的查询和更新,即使在数据库底层有一定的优化,但是随着量变必定会引起质变,导致性能急剧下降。这时可以通过分表的方法,将单表数据按一定规则水平拆分到多个表中,减小单表的数据量,提升系统性能。随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。

2023-12-14 01:23:08 140

原创 面向对象、设计原则、编程规范、重构技巧

读王争《设计模式之美》有感,进行一些理论知识总结。

2022-07-31 18:31:40 574

原创 Go并发陷阱之i的到底等于几?

今天写bug时碰到一个Go并发陷阱,是一道很经典的面试题,那就是:func main() { for i := 0; i < 5; i++ { go func() { fmt.Println("current value: ", i) }() } time.Sleep(time.Second)}这段代码看起来会顺序输出0-4,但是其实打印出来的结果却是:当然结果也不一定就是图片的结果,为什么会这样?因为此时协程中读取的i和main中循环的i是相同的地址空间,这就有可能

2022-03-28 23:13:58 282

原创 GoWeb搭建简单服务器

多路复用器ServeMux和DefaultServeMux当一个Http请求发送到服务端后,首先要做的就是多路复用器进行请求转发到相应的处理器。在Go中内置了ServeMux这个结构体,它会将每一个接收的请求的URL与一个注册模式的列表进行匹配,并调用和URL最匹配的模式的处理器。而DefaultServeMux是net/http包中默认提供的一个多路复用器,本质是ServeMux的一个实例。HandleFunc()函数func (mux *ServeMux) HandleFunc(patte..

2021-11-15 15:30:21 541

原创 GoWeb基础

Web基本原理打开浏览器输入网址按下回车后浏览器的运行过程:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的

2021-11-15 11:45:58 2743

原创 引用类型和基本类型在方法传递中的不同行为

今天在刷lc时,又发现了个小问题。描述如下:红色部分是最开始写的代码,得到满足sum==target的结果后,就将list加入到AllSets这个Arraylist中,一开始觉得没有什么问题,但是运行过后出现了下面的结果:可以看到最终传入allSets中的竟然是两个空列表!这是为什么?发现问题根源:可以看出,这个list 是由其他函数传入的参数,是一个引用类型,所以当我们只是单纯的进行allSets.add(list)时,只是把list的地址传递给了allSets,而list在深度优先搜索的最后,其

2021-07-31 21:52:52 110

原创 静态变量和实例变量的存放位置区别问题

昨天在lc平台做算法时,遇到了一个加不加static的问题,即静态变量和实例变量的问题。首先是正确代码及运行结果:上面代码运行击败100%,完全正确,但是将红色部分添加上static修饰之后,会出现以下问题:运行结果在第一个样例即 n = 1 时就报错,且结果中还叠加了 n = 3 的结果,实在是对以下2个问题不解:为什么在第一个样例中会出现了n = 3的运行结果?如果错误,应该也是能通过第一个样例。为什么将brackets修饰成static后,就会出现以上的问题?后台代码的逻辑是什么?在经

2021-07-31 15:45:45 186

原创 Netty-架构之道

Netty逻辑架构Reactor通信调度层由一系列辅助类完成,包括Reactor线程NioEventLoop及其父类,NioSocketChannel/NioServerSocketChannel,ByteBuf等。主要的职责是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,如连接创建,读写事件,再将这些事件触发到PipeLine中,由Pipeline管理的职责链进行处理。职责链ChannelPipeline:负责事件在职责链中的有序传播,同时负责动态编排职.

2021-07-07 16:01:39 95

原创 Netty-Reactor和NioEventLoop

Reactor线程模型Reactor单线程模型:所有的I/O操作都在同一个NIO线程中完成。例如,通过Acceptor 类接收客户端的TCP连接请求消息,当链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上,进行消息解码。用户线程消息编码后通过NIO线程将消息发送给客户端。适合小容量场景,对于高负载、大并发的应用场景不适合。会产生的问题如下:* 一个NIO线程同时处理成百上千的链路,性能上无法支撑。* 线程负载过重后,处理速度变慢,导致大量客户端连

2021-07-07 11:47:55 140

原创 Netty- 服务端和客户端的创建

Netty私有协议栈Netty协议栈用于内部各模块之间的通信,它基于TCP/IP协议栈,是一个类HTTP协议的应用层协议栈,相比于传统的标准协议栈,它更加轻巧、灵活和实用。Netty节点并没有服务端和客户端的区分,谁先发起连接,谁就作为客户端,另一方作为服务端。一个Netty节点即可以作为客户端连接另一个Netty节点,又可以作为服务端被其他节点连接。协议族的功能:用于业务内部各模块之间的消息交互和服务调用。基于Netty的NIO通信框架,提供高性能的异步通信能力:提供消息的编解码框架,可以实

2021-07-06 21:04:10 552

原创 Netty-TCP粘包/拆包和编解码

TCP是”流“协议,无消息保护边界,所以一个完整的包可能会被TCP划分成多个包进行发送,也可能把多个包封装成一个大的数据包发送。所以我们需要在接收端处理消息边界问题。当服务端一次收到两个数据包,D1和D2粘合在一起,就是TCP粘包当服务端分两次读取到了两个数据包,第一次读取完整的D1包和D2的部分内容,第二次读取了D2的剩余内容,就是TCP拆包。TCP粘包/拆包的原因应用程序写入的字节大小大于套接口发送缓冲区的大小,会导致拆包。进行MSS大小的TCP分段,会导致拆包。以太网帧的pay

2021-07-06 14:46:32 467

原创 Netty-NIO

I/O模型: https://blog.csdn.net/qq_45126604/article/details/118407048I/O多路复用I/O多路复用通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。I/O多路复用的优势:系统开销小,不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低系统的维护工作量,节省资源。I/O多路复用的主要应用场景:1. 服务器需要同时处理多个监听状态或者多个连接状态的套接字..

2021-07-06 11:39:05 78

原创 UNIX网络编程

OSI计算机通信开放系统互连(open system interconnection)模型,是一个七层模型应用层:应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层的协议定义了应用进程间通信和交互的基本规则。(DNS析协议、HTTP协议)表示层:用于表示信息的语法语义和他们之间的关联,如加密解密,压缩解压。 会话层:不同机器上的用户之间建立及管理会话。传输层:负责向两台主机之间的进程通信提供通用的数据传输服务。(TCP协议、UDP协议)网络层:负责为分组交换网上的不同主机提供通信服务

2021-07-02 17:16:41 1475 1

原创 Redis-集群

一个Redis集群通常由多个节点组成,当节点node发送CLUSTER MEET ip Port进行握手(节点连接的方式),握手成功,则节点将ip和Port所指定的节点添加到当前所在的集群中。集群的数据结构:每个clusterNode结构保存着一个节点的当前状态,节点的创建时间、名字等。每个节点同时还会为集群中的其他节点创建一个相应的clusterNode来记录其他节点的状态。同时每个接待你还保存一个clusterState记录当前节点视角的集群所处状态。Cluster Meet 命令的实现

2021-06-22 23:40:06 114

原创 Redis-sentinel哨兵模式

Sentinel模式由一个或多个Sentinel实例组成,可以监视任意多个主服务器和主服务器属下的从服务器,并且在被监视的主服务器下线超过设定时长时,自动将其属下的从服务器升级成新的主服务器进行处理命令请求,在下线的主服务器重新上线时,只能成为从服务器。Sentinel启动和初始化的步骤初始化服务器Sentinel本质是一个运行在特殊模式在的Redis服务器,所以首先启动一个普通的Redis服务器,但Sentinel不实用数据库,所以不进行RDB文件和AOF文件的载入。将普通Redis服务器使用

2021-06-22 21:44:36 75

原创 Redis-复制

复制用户通过SLAVEOF host port或者slaveof选项,让一个服务器去复制另一个服务器,被复制的服务器即主服务器,对主服务器进行复制的为从服务器。数据库状态一致:复制中的主从服务器都保存相同的数据。旧版复制功能的实现(Redis2.8以前)复制功能分为同步和命令传播同步:同步用于将从服务器的数据库状态更新至主服务器所处的数据库状态。通过向主服务器发送*SYNC命令*来完成。同步的步骤:* 从服务器向主服务器发送SYNC命令。* 主服务器收到SYNC命令后执行BGSAVE

2021-06-22 20:19:10 93

原创 Redis-客户端和服务器

事件文件事件:Redis服务器通过套接字与客户端进行连接,文件事件就是服务器对套接字的抽象操作。文件事件处理器:使用I/O多路复用程序同时监听多个套接字,并根据套接字执行的任务关联不同的事件处理器。以单线程的方式运行,即实现了高性能的网络通信模型,也很好的与Redis服务器中其他单线程运行的模块进行对接,保持Redis内部单线程设计的简单性。文件事件处理器的构成:套接字、I/O多路复用程序、文件事件分派器、事件处理器。套接字负责准备好执行通信的操作。I/O多路复用程序负责监听多个套接字

2021-06-22 16:48:21 676

原创 Redis-持久化机制

RDB【问题】Redis是内存数据库,它首先将自己的数据库状态储存在内存里面,如果没有采取措施将数据库状态保存到磁盘中,一旦服务器进程退出,数据库状态也会消失导致数据丢失。RDB持久化能解决这个问题,RDB文件时一个经过压缩的二进制文件,保存在硬盘中,即使服务器故障,只要RDB文件存在就能用它进行数据库状态还原。RDB(保存的是dump.Rdb文件):在指定的时间间隔内将内存中的数据集【快照】写入磁盘,也就是恢复时将快照文件直接读到内存中(时间段内的内存中的块区数据写入磁盘)。RDB文件的创建

2021-06-21 23:54:16 70

原创 Redis-单机数据库

Redis服务器是一个键值对数据库服务器,将所有数据都保存在redisServer结构的db数组。每个redisServer代表了一个数据库,初始化时,程序根据redis.conf中配置的属性来决定创建多少个数据库,默认是16个。一些数据库的操作1. 切换数据库。 select 0 切换到0号数据库。2. 添加新键。例如插入一个键值对set k1 v1/LPUSH k2 1 2 33. 删除键。DEL K14. 更新键。set k1 v2,将k1原来的值v1改成v25. 对键取值。GET k

2021-06-21 21:06:54 90

原创 Redis-基本数据结构

简单动态字符串(SDS)SDS在Redis中的应用:* 键值对中,键和值得底层实现都是保存着字符串的SDS* AOF模块的AOF缓冲区、客户端状态的输入缓冲区SDS的结构这其中,len记录字符串中保存的长度,free记录剩余多少未使用的字节,buf表示字符串数组SDS的优点因为自身保存着字符串长度len,所以SDS在计算长度时,时间复杂度为O(1),这也保证了获取字符串长度不会成为Redis的瓶颈。缓冲区不会溢出。当需要对SDS字符串进行修改时,API会检查SDS的空间是否满足修改需

2021-06-21 17:04:48 74

原创 高性能MySQL

MySQL架构与历史并发控制共享锁(读锁):共享、互不阻塞的。多个客户同一时刻可以同时读取一个资源而互不干扰。排他锁(写锁):排他的、一个写锁会阻塞其他的写锁和读锁,防止其他用户读取正在写入的同一资源。表锁:锁定整张表,一个用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对表的读写操作,没有写锁时才能获取到读锁,读锁之间相互不阻塞。行级锁:最大程度支持并发处理。对数据行进行锁定,降低了锁粒度,让多个用户能同时对表进行操作。意向锁:事务事务是一组原子性的SQL查询,事务内的语句

2021-06-16 20:19:22 435

原创 计算机网络-TCP/IP

五层模型五层模型:物理层、数据链路层、网络层、传输层、应用层应用层:应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层的协议定义了应用进程间通信和交互的基本规则。(DNS析协议、HTTP协议)传输层:负责向两台主机之间的进程通信提供通用的数据传输服务。(TCP协议、UDP协议)网络层:负责为分组交换网上的不同主机提供通信服务。发送数据时,网络层把运输层产生的报文或数据封装成分组或者包进行传送(IP数据报)(IP协议)数据链路层:进行两个主机之间的数据传输。物理层:定义了主机和物理设备

2021-06-09 22:45:55 218 3

原创 计算机网络——HTTP

TCP/IP协议族TCP/IP的分层管理:TCP/IP协议族按层次分为:应用层、传输层、网络层、数据链路层。这样做能过避免由一个协议统筹时某个地方需要改变设计,就必须把所有部分全部替换掉。分层之后只需要替换变动的层即可。应用层:应用层决定了向用户提供应用服务时通信的活动。即通过应⽤进程间的交互来完成特定⽹络应⽤。(DNS服务,HTTP协议)传输层:提供处于网络连接中的两台计算机之间的数据传输服务。(TCP、UDP协议)网络层:用来处理在网络上流动的数据包,确保数据及时传送。(IP协议)链路层:

2021-06-07 11:57:36 226 2

原创 JVM体系-线程安全和锁优化

线程安全线程安全的定义:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。线程安全的代码必备的特征:代码本身封装了所有必要的正确性保障手段,令调用者无须关心多线程下的调用问题,更无 须自己实现任何措施来保证多线程环境下的正确调用。线程安全在Java中的体现:1. 不可变。:只要 一个不可变的对象被正确地构建出来(即没有发生this

2021-05-30 14:24:23 95

原创 JVM体系-JVM内存模型与线程

为什么要进行多任务处理?1. 计算机运算能力强大。2. 计算机的运算速度与它的存储和通信子系统的速度差距太大,大量时间花在磁盘I/O、网络通信或者数据库访问上,必须要激发计算机的运算能力,减少造成性能浪费。高速缓存为什么要使用告诉缓存?:计算机的存储设备和处理器的运算速度差距太大,导致计算机需要添加高速缓存来进行一个缓冲。高速缓存的作用:读写速度接近处理器的运算速度,能够将运算所需要的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无需等待缓慢的内存读写..

2021-05-30 11:26:18 101

原创 并发编程体系-ThreadLocal

作用:主要是做数据隔离,让每个线程绑定自己的值,即填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,如果你创建了⼀个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的本地副本,不同线程对这个值的修改并不会互相影响。原理:ThreadLocal本身不存储任何值,内部存在ThreadLocalMap,将ThreadLocal作为key,自己设置的threadLocals作为value进行存储。数据是存在自己线程Thread的threadLocals变量里面的,别人没办法.

2021-05-28 21:24:00 85

原创 并发编程体系-semaphore、CountDownLatch、Cyclicbarrier

Semaphore信号量,用来做访问限制,在访问高峰期时,让请求线程阻塞,高峰期过去再释放,限制的仅仅是线程数而不是资源数使用:通过semaphore.acquire()和semaphore.release()来上锁和释放加锁过程–acquire()图解如下:1、当前线程会尝试去同步队列获取一个令牌,获取令牌的过程也就是使用原子的操作去修改同步队列的state ,获取一个令牌则修改为state=state-1。2、 当计算出来的state<0,则代表令牌数量不足,此时会创建一个Node

2021-05-27 22:51:02 93

原创 并发编程体系-线程池

**线程池的优点 **1. 降低资源消耗。通过重复利⽤已创建的线程降低线程创建和销毁造成的消耗。2. 提⾼响应速度。当任务到达时,任务可以不需要的等到线程创建就能⽴即执⾏。3. 提⾼线程的可管理性。线程是稀缺资源,如果⽆限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使⽤线程池可以进⾏统⼀的分配,调优和监控。使用execute()和submit()方法 的区别1. execute() ⽅法⽤于提交不需要返回值的任务,所以⽆法判断任务是否被线程池执⾏成功与否;2. submit() ⽅法.

2021-05-27 21:50:18 72

原创 并发编程体系-无锁

无锁的优缺点1. 优点:无锁情况下即使重试失败,线程仍然在高速运行,而synchronized会让线程在没获得锁的情况下发生上下文切换,进入阻塞,等到下次唤醒还得启动线程,所以效率比较低2. 不足:无锁状态下如果没有额外的cpu,虽然不会进入阻塞,但是会没有分到时间片而导致进入可运行状态,还是会导致上下文切换。CAS----CompareAndSet(基于乐观锁)CAS的工作方式:(ref.compareAndSet(prev, excp),CAS首先拿出预期的值来与内存中的值进行比较,即pr.

2021-05-27 17:38:05 213

原创 并发编程体系-内存

Java内存模型并发编程的三个重要特性1. 原子性: ⼀个的操作或者多次操作,要么所有的操作全部都得到执⾏并且不会收到任何因素的⼲扰⽽中断,要么所有的操作都执⾏,要么都不执⾏。保证指令不会收到上下文切换的影响。synchronized修饰代码块。2. 可见性:当⼀个变量对共享变量进⾏了修改,那么另外的线程都是⽴即可以看到修改后的最新值。保证指令不会受到cpu缓存的影响。volatile可以保证 共享变量的可见性。synchronized也能保证代码块中的可见性,但是属于重量级操作3. 有序性: .

2021-05-27 14:23:06 62

原创 并发编程体系-ReentrantLock

AQS AbstractQueuedSynchronizer,AQS是⼀个⽤来构建锁和同步器的框架,使⽤AQS能简单且⾼效地构造出应⽤⼴泛的⼤量的同步器。AQS的特点:1. 用 state 属性来表示资源的状态(分独占模式和共享模式),用CAS来设置state的状态,独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源2. 提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList3. 条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monit

2021-05-26 23:03:44 122

原创 并发编程体系-管程

临界区:一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区并发访问的线程安全问题多个线程对共享资源进行读写的时候发生指令错乱,比如当A线程对i进行修改,但还未修改时间片就执行完,此时保存当前状态,而B线程对i进行了修改保存后,轮到A执行,A将他的未写入i写入,导致最后结果为A修改的值Synchronized1. synchronized语法:synchronized(对象) // 线程1, 线程2(blocked) { 临界区 } 2. synchronized关键.

2021-05-26 17:00:02 128

原创 并发编程体系-进程与线程

进程与线程进程与线程:1. 程序:程序由指令和数据组成,这些指令要运行,数据就要读写,就必须将指令加载到CPU,数据加载到内存,在指令运行过程中还需要用到磁盘、网络等设备。2. 进程:进程用来加载指令、管理内存、管理IO的。进程是资源分配的最小单位,系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程,即进程是程序的一个实例,进程会占用某些系统资源如 CPU 时间,内存空间,⽂件,输⼊输出设备的使⽤权。3. 线程:线程是比进程更小的执行单位,是最小的调度单位。一个进程可以产生多个线程,一个线程就

2021-05-25 23:11:07 85

原创 JVM体系-字节码执行引擎

运行时栈帧结构栈帧是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息,每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。在活动线程中,只有位于栈顶的方法才是在运行的,只有位于栈顶的栈帧才是生效的。局部变量表作用:局部变量表用于存放方法参数和方法内部定义 的局部变量。局部变量表的容量以变量槽为最小单位,都可以使用32位或更小的物理内存来存储boolean、 byte、char、short、in

2021-05-20 22:35:38 69

原创 JVM体系-类加载

类加载类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java类型的过程类加载的时机:加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,必须按这个顺序来,而解析阶段不一定,可以在初始化之后开始。以下6中情况需要立刻初始化:1.使用new关键字实例化对象的时候、读取或设置一个类型的静态字段、调用一个类型的静态方法的时候, 即遇到new、getstatic、putstatic或invokestatic这四条字

2021-05-20 21:16:04 68

原创 JVM体系-垃圾回收和内存分配

什么是垃圾?:Java内存中已经不再被使用的内存空间怎么判断对象是否存活? 引用计数法。在对象中添加一个引用计数器,有一个地方引用它时,计数器值就加一; 当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。但是无法解决**相互循环引用**的问题。 可达性分析。从GCRoot出发,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain), 如果某个对象到GC Roots间没有任何引用链相连,即GC Roots到这个对象不可达时,则

2021-05-20 15:33:52 113

原创 JVM体系-性能调优

因为第三章是《深入理解JVM》,《深入理解Java虚拟机》中对这部分的阐述更完整,所以在另一篇博客上对这部分进行梳理。本博客主要对各种性能调优参数进行记录。堆大小设置:-Xms:设置堆的最小可用内存、-Xmx:设置堆的最大可用内存、 -Xmn:设置新生代的大小、-Xss:设置每个线程的堆栈大小、-XX:NewRatio:设置年轻代(包括Eden和两个Survivor区)与年老代的比值-XX:survivorRatio:设置新生代中Eden区和两个survivor区的比值。-XX:survivorRa

2021-05-19 18:31:52 172

原创 JVM体系-故障处理工具

基础故障处理工具jps:虚拟机进程状况工具,可以列出虚拟机正在运行的进程,虚拟机执行主类名称和进程本地虚拟机ID。jstat:监视虚拟机各种运行状态信息的命令行工具jinfo:Java配置信息工具,实时查看和调整虚拟机各项参数jmap:Java内存映像工具,用于生成堆转储快照jhat:虚拟机堆转储快照分析工具,与jmap搭配使用分析生成的堆转储快照jstack:Java堆栈跟踪工具,用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成目的:定位线程

2021-05-18 16:39:59 64

原创 JVM体系-内存管理

运行时数据区程序计数器程序计数器是一块较小的内存区域,且不会出现OOM (存放的仅仅是下一条待执行的命令的地址,最坏只能是死循环,不会出现oom)。作用:1. 帮助字节码解释器来读取下一条需要执行的字节码指令。2.记录当前线程的执行位置,方便下一次执行时恢复到正确的执行位置。Java虚拟机中多线程是通过线程轮流切换,分配处理器执行时间的方式(分配时间片轮转执行)。Java虚拟机栈Java虚拟机栈为线程私有。他的生命周期跟线程相同。描述的是Java方法执行的线程内存模型:每个方法被执行的时

2021-05-12 20:24:02 78

原创 Spring-AOP

AOP是一种编程目标,springAOP是一种Aop的形式AOP的作用AOP的主要职责就是将代码逻辑中,不是主业务逻辑,与主业务关系不大且散落在代码各个位置的部分(日志记录,权限验证,事务管理,效率检查等)封装起来,减少代码的重复,降低模块之间的耦合度。SpringAOP和AspectJ的关系?springAOP有两种编程风格,1. @AspectJ support,利用AspectJ的注解 2.xml配置文件进行配置AOP中四个重要的模块JoinPoint:连接点,表示在程序中

2021-05-05 23:28:21 50

空空如也

空空如也

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

TA关注的人

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