自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

后端学习

只为成功找方法,不为失败找借口!

  • 博客(89)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM -运行时数据区-方法区(jdk7的永久代,jdk8的元空间)

方法区前言这次所讲述的是运行时数据区的最后一个部分从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理栈、堆、方法区的交互关系下面就涉及了对象的访问定位Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行

2021-03-03 21:12:39 947 1

原创 JVM - 运行时数据区-虚拟机栈(局部变量表,操作数栈,栈顶部缓存,逃逸分析等)

局部变量表局部变量表:Local Variables,被称之为局部变量数组或本地变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。

2021-02-03 08:17:51 405

原创 JVM(ClassLoader) - 类加载器的分类(引导类加载器,扩展类加载器,系统类加载器)

类加载器的分类JVM支持两种类型的类加载器 。分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示这里的四者之间是包含关系,不是上层和下层,也不是子系

2021-01-27 08:59:53 642 2

原创 AVI 自平衡二叉树

平衡二叉树本质是二叉查找树的一种每个节点的左右子树的高度差的绝对值(平衡因子)最多为1 ,| leftTreeHeightmax - rightTreeHeightmax| <= 1avi树图 (当左子树或是右子树,为空,默认值是-1)旋转当avi的平衡因子大于1的时候,就会打破avi的平衡,这时我们需要左旋转或右旋转,来重新让它平衡。对于AVI的旋转分为四种情况,分别是左左型,右右型,左右型,右左型左左型 — 像图中一样,所有节点都偏向左边的情况,这

2021-01-14 10:22:57 432

原创 【maven】maven知识的学习

maven相关的基础知识

2022-06-21 11:03:22 223 1

原创 分布式一致性

在宏观上将分布式一致性分为了:数据一致性和事务的一致性。数据一致性: 描述的是在单用户,单操作,多数据副本的情况下保持一致性。我们为了提高数据的可靠性,一般会存在多个数据副本,如何保证多个数据副本的一致性,就带来了一致性问题。在数据一致性的情况下,分为了状态一致性和操作的一致性。状态一致性:在状态的视角下,主要分为强一致性和最终一致性。强一致性:主要的代表就是mysql主从全同步复制。只有当主从完全同步后才能对客户端,反馈提交成功,这样可以保证数据的强一致性,但存在很多缺点。性能差

2022-03-22 18:21:41 510

原创 操作系统 - 调度算法总结

1. 进程的调度算法先到先服务调度算法:对短作业不友好,会加大短作业的等待时间,从而增加短作业的响应时间短作业优先:对长作业不友好,造成长作业饥饿高响应时间优先:优先级 = (等待时间+处理时间 )/处理时间, 当等待时间相同,短作业优先;当等待时间增大时,会增加长作业的优先级,兼顾了长作业和短作业。时间片轮转调度算法:没有设置优先级;时间片的大小的设置,会造成不同的影响(时间片短了,大量的上下文切换;长了,增加短作业的等待时间,增加响应事件)高优先级调度算法:会导致低优先级饥饿多级队列反馈

2021-10-11 12:05:45 850

原创 操作系统 - 文件系统

文件系统基本结构文件系统是操作系统的子系统,用于管理磁盘的持久化数据。文件系统的管理单位是文件: 文件分为索引节点(inode),目录项,文件数据这三部分。inode存放在磁盘中。目录项是内存中的一个数据结构;目录是文件的一个种类。打开文件表: 存放在内存中,操作系统打开一个文件,就会将其存放在打开文件表内;打开文件表的每一项对应着一个文件描述符虚拟文件系统文件系统有很多种类,所以我们在用户层与文件系统层加了个中间层,虚拟文件系统。虚拟文件系统可以看成是对多个文件系统的封装,为用户提供

2021-10-09 12:07:35 520

原创 计算机网络- 感悟-https

防止窃听https是通过混合加密的方式来完成,防止会话被窃听的https通过非对称加密(秘钥协商算法)得到对称加密的会话秘钥,为什么每次连接都要建立新的会话秘钥呢? - 主要是为了确保会话通信的安全,每次的会话秘钥都是新生成的,可以确保当一次会话秘钥被泄露不会导致所有的会话被泄露。—还有一个回答方向,就是如果我们只使用非对称加密方式进行通信,由于公钥是公开的,所有含公钥的客户端都可以对服务器进行通信,并且加密方式都是一样的,一旦私钥被泄露,那么所有的客户端与服务器的通信全部被泄露。非对称加密算法:

2021-10-05 09:33:05 103

原创 计算机网络 - http - http1.1的通用优化策略

1.减少Http请求的次数1.缓存技术2.减少重定向请求的次数 - 更多的让中间服务器来处理,缓存重定向响应3.小报文聚合 - 多个小资源请求报文合并成一个大资源请求报文4.只获取需要的资源2.压缩网络传输的报文大小1.无损压缩2.有损压缩...

2021-09-29 11:08:57 110

原创 mysql-三大核心日志-两阶段提交协议

为什么会有两阶段提交协议?redo log一般比binlog先刷新到缓冲区当中,而且redolog有个后台持久化线程,每秒执行一次;当binlog持久化失败, 但是redolog持久化成功时,会出现两个日志文件不一致的情况。两阶段协议将redo log设置为prepare和submit这两种状态来解决问题两阶段协议的具体描述1. 会将redolog中正在运行的事物标记为prepare状态、2. 在事务submit后会将相关事物的状态有prepare修改为submit状态在数据恢复的

2021-09-29 08:28:47 163

原创 计算机网络-http协议-htttps协议

tls协议的四次握手,非对称加密和对称加密RSA密码套件的内容「密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法」在我们第二次握手就会从客户端提供的密码套件列表选择一个密码套件来进行,(密码套件有很多种不只是RSA,具体的加密过程也不太相同)(举例:)TLS_RSA_WITH_AES_128_GCM_SHA256”:一般 WITH 单词前面有两个单词,第一个单词是约定密钥交换的算法,第二个单词是约定证书的验证算法。比如刚才的密码套件的意思就是:由于 WITH 单词只有一个

2021-09-26 11:05:28 1655

原创 计算网络-tcp的优化

1. 三次握手的优化1.1 客户端的优化第一次握手(syn包)的丢包重传最大次数的优化。第三次握手(ack包)可以携带请求数据。1.2 服务端的优化半连接对列的优化半连接对列的大小半连接对列的饱和策略开启tcp_synCookies的优化全连接对列的优化全连接的对列大小全连接的饱和策略限制第二次握手(ack+syn包)的最大重发次数的优化1.3 全面优化开启tcp_fastopen(快速建立的机制)的优化2. 四次挥手的优化2.1发起方的优化可以发

2021-09-24 11:53:14 83

原创 计算机网络- tcp的半连接对列和全连接对列

1. 全连接对列1.1 全连接对列的最大长度的决定因素全连接对列的最大值 = Math.min(somaxconn, backlog) ;somaxconn是内核参数;backlog根据web服务的不同而决定。1.2 全连接对列的溢出时的处理内核参数配置:tcp_abort_on_overflow0:将溢出的连接给直接丢弃- 默认方式,优点,在面对全连接对列短暂溢出时可以快速恢复连接,客户端会重发syn包;缺点,客户端可能不知道连接是否出现问题。1:往溢出的连接中,发出一个rst 连接

2021-09-23 09:23:48 145

原创 tcp的三次握手 - 数据包丢失处理

1.基础概念三次握手的丢包重传机制的次数限制和RTO的增长第一次握手(syn包): tcp_syn_retires 的参数来限制第一次握手(syn包)的重传次数,默认为5次。第二次握手(ack+ack包): tcp_synack_retires的参数来限制第二次握手(ack+syn包)的重传次数,默认为5次。第三次握手(ack包): tcp_retires2的参数来限制第三次握手(ack包)的重传次数,默认为15次。每次重传都会导致RTO超时重传的时间成倍增长。2.第一次握手(syn包)丢失

2021-09-21 11:18:17 2667

原创 操作系统 - 常见问题

进程与线程1. 并行与并发并发是指在一段时间内多个任务被处理,但是某个时间点上只有一个任务在被执行。并行是指在一段时间内多个任务被处理,但是某个时间点内有多个任务再被执行。比如线程A和线程B,在一段时间内上,在同一个处理器上线程A和线程B被交替执行完成,就是并发;在一段时间内,A和B在两个不同的处理器上被同时处理完,这就是并行。2. 进程和线程的切换流程进程的切换分为两步:切换页表以使用新的地址空间,一旦线程上文切换,处理器中已有的缓存的地址空间将失效(虚拟内存地址的切换,已缓存的地址空间

2021-09-20 09:14:31 236

原创 为什么redis是单线程模型?

我们想一下木桶效应,最终的性能是由那个最短木板决定的;cpu的处理速度远高于内存,而redis的父进程运行在内存中不执行IO操作(AOF和RDB的持久化IO是由子进程来完成的);所以此时内存就是木桶效应中的短木板,就是瓶颈;我们知道引入多线程的目的是为了把比较耗时的任务非阻塞式处理来提高利用率,在内存中处理速度都非常快,比较耗时的任务比较少,没有必要全面引入多线程,只需要像垃圾处理的时候来进行部分引入优化即可;redis的主要性能瓶颈是内存和网络IO, 我们不会因为引入了多线程,内存和网络IO的处理速.

2021-09-15 09:26:06 129

原创 redis缓存一致性问题

缓存一致性问题中的三大读写策略?1. 旁路缓存模式(cache aside Pattern)写:先更新DB;然后删除缓存 读:先读cache,cache中存在则直接返回;ceche不存在,则读db;将读取到的内容同步到ceche问题1:在写缓存的时候,我们可以先删除cache,再更新db嘛? ----> 不可以,可能出现缓存不一致的问题,比如请求1先删除变量A;接着请求2读取变量A,此时就会到db中读取,并又更新到缓存中;再接着变量A接着执行更新db,此时db中是最新数据,而缓存

2021-09-14 09:11:00 172

原创 redis事物 - 为啥没有回滚机制?redis的事物的意义是什么?

为啥没有回滚机制?在redis中事物执行失败有两个原因:语法错误,操作了不正确的键。这两个原因都可以在开发环境中得到修正,实际的生成环境不应该出现这种错误。事物的回滚是很复杂的,会带来额外的复杂度;引入回滚带来的收益没有想象中的那么大,所以redis的开发人员认为没有必要引入回滚机制。redis事物的意义redis的事物更像是一个逻辑组合体,一个事物代表的一个业务逻辑组合。AOF数据恢复是是以事物为单位进行的:当面对事物中只有部分被持久化到硬盘的情况时,redis 会根据 aof 日志恢复

2021-09-13 09:42:24 291 1

原创 操作系统 -- linux文件系统

1.文件系统概述 – 一切皆文件(包括,字符设备,块设备,网卡等)1.inode,文件元信息;block块inode是linux/unix文件系统的基础,存储文件的元信息metadata;文件系统中最小单位是扇区,而block块是由多个扇区组合而成。inode包含文件的元信息,元信息包含用来维护某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等,可以使用stat命令查看;文件的数据是存储在物理块block中,文件可以存储在多个物理块中,但是一个物理块只属于一个文件2.lin

2021-09-11 15:59:48 158

原创 操作系统-虚拟内存

请求分页的管理模式:(记录信息在外存位置,需要时从外存调入内存)执行过程中,当访问的信息不在内存中的时候,由操作系统将所需的信息从外存中调入内存中;如果还没有调入,那么也需要知道页面在内存中存放的位置。(记录所需信息在外存中存放的位置,在需要时从外存调入内存)页面置换算法:(在内存紧张时,将信息从内存调出内存到外存中)-最佳置换算法(OPT)先进先出页面置换算法(FIFO)最久未使用页面置换算法(LRU)时钟置换算法(Clock)页面分配策略:虚拟内存的注意点:虚拟内存技术的概念

2021-09-10 17:09:01 203

原创 操作系统-内存管理 - 4部分

内存的扩展操作系统需要提供某种技术在逻辑上对内存进行扩充地址转换(逻辑地址转换成物理地址) -3部分绝对装入(单道程序阶段,误操作系统)- 写程序时就完成翻译转换。不需要操作系统直接根据,根据物理地址对硬件进行直接操作可定位装入(静态重定位,早期多批道处理阶段)- 进入内存时完成翻译转换,只有进入时一次模块采用的是相对地址装入目标程序的过程中,完成从逻辑地址到物理地址的转换但是,这个转换过程只是在装入时发生一次;作业装入必须一次完成,不能在内存中移动,也不能申请内存空间(因为进入

2021-09-09 14:08:45 1005

原创 mysql优化- 慢查询日志和explain

慢查询日志结构4个配置变量slow_query_log = ON/OFF:是否打开慢查询日志。slow_query_log_file = /opt/soft/mysql/log/slow.log:慢查询日志的存储文件路径。long_query_time = 5:慢查询日志文件的时间阈值。long_query_not_using_indexes = on/off:是否记录没有使用索引的查询注意点慢查询日志的意义将未按照达到自己定义标准的查询记录下来,以便于单独进行分析和优化expl

2021-09-08 11:05:20 128

原创 jdk 1.8的新特性

接口的默认方法default和static函数式接口lambda表达式streams流OptionalDateAPI注解

2021-09-03 17:12:19 56

原创 mysql数据库的基础知识

数据系统的构成 (由DB,DBMS,DBA共同组成)数据库(DB)数据库是数据的集合,它被数据库管理系统来进行管理。数据库表(对应关系数据库中的关系,一个数据库表对应一个关系实体)元祖:对应数据库表中的行,数据库的每行对应一个元祖。属性:对应数据库的列,每列对应一个属性,例如主键对应主属性。码:代表所有属性中能唯一标识元祖的属性候选码:当属性中的某一个属性或几个属性联合能唯一标识一个元组,并且其任何子集都不能标识(就是单个的属性都不呢标识,联合起来可以唯一标识的情况),则称该属性集合为候

2021-09-03 12:45:49 225

原创 JVM运行时数据区

程序计数器(线程私有)为什么要有程序计数器?方便字节码解释器工作,字节码解释器可以通过改变程序计数器来依次读取指令(让程序计数器保存下一条要执行的字节码指令),从而实现代码的流程控制,顺序执行,选择,循环,异常处理在多线程下,可以程序计数器可以记录线程的执行的位置,可以在线程上下文切换的时候,恢复线程继续执行。程序计数器的底层结构。程序计数器是一快很小的内存区域,可以看成是线程所执行的字节码指示器。程序计数器的注意点。程序计数器是不会出现OOM的错误的内存区域,它的生命周期随线程开始而

2021-08-29 17:15:51 76 1

原创 mysql查询优化-单表查询优化的小总结

可以使用explain关键字可以让我们知道,性能瓶颈是查询语句还是表结构写sql要明确需要的字段,要多少就写多少字段,避免滥用select *使用join来避免使用子查询尽可能使返回结果更精确:有什么限制条件尽量都用上 ,比如,limt,where等,这样可以让我们查询少做不需要的动作。开启查询缓存(当收益大于成本的时候)怎么判断是不是需要开启查询缓存:通过缓存命中率(Qcache_hits / Com_select,这个结果只能看看,有天生的缺陷,代表不了查询的实际收益);缓存的写入率(Qca

2021-08-29 09:27:16 275

原创 面试题-阿里的笔试题

昨天做了阿里的笔试题,有一道我超时了,题目是这样的:给定一个数组 a,包含 n 个整数再给定一个整数 k,可以给数组中任意整数加 1,总共可以加 k 次加完 k 次后,找到数组中的最大值。最后要求得一个最小的最大值我们的答案:问题和数组有关,问最大值,与元素与数组中的位置没有关系,那么1.先排序,2.剩下的就是可以比作是补齐,先从最小值开始补, (这里的补齐过程就类似于将数组中的缺口补齐,填平,争取与比自己大的数平齐)先对最小值进行+1,一直加到它与第二小的值平齐;在从第二小数开始向第一

2021-08-28 22:16:08 211

原创 java并发-ThreadLocald详解

ThreadLocal的思想基础ThreadLocal的思想基础,来自于线程封闭来实现线程安全的思想当可变的共享资源,在多线程下就可能出现错误的结果,造成线程不安全;要达到线程安全,可以把可变资源变为不可变资源,共享资源变为线程私有或使用同步机制来确保安全。这里使用的是线程封闭的思想ThreadLocal的结构组成ThreadLocal的结构Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每个线程有一个自己的Thre

2021-08-28 17:17:30 107

原创 mysql查询优化-增删改的优化

INSERT语句(插入语句)在大量插入插入数据的时候,我们应该避免单条插入,因为每一个sql语句都需要提交到关系引擎哪里去解析,优化,一旦数量过多,就会造成大量消耗优化的方向是:批量提交,一次10条左右是最高效的,类似下图:采用顺序主键策略、DELETE语句(删除语句),与truncate table作比较truncate table [表名] :删除速度更快,但是删除后不进入mysql的日志文件,不可以恢复。(谨慎)如果没有外键关联,innnodb先drop table,再创建一个新

2021-08-28 10:49:27 344

原创 java并发-线程池

线程池提出的思想基础降低资源的消耗。通过重复利用已经创建的线程降低线程创建和销毁的消耗提高响应速度。当任务到达的时候,任务不需要等待线程创建直接可以执行提高对线程的可管理性。线程是稀缺资源,如果无线的创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池的实现原理线程池框架的结构(主要由三部分组成)任务(Runnable / Callable)我们将我们的结果封装到Runnable或是Callable中,交给ThreadPoolExecutor或Sc

2021-08-27 14:10:09 145

原创 mysql查询优化-查询缓存

mysql如何判断缓存是否命中缓存使用的是一个引用表,通过一个哈希值的引用,这个哈希值包括了,当前要查询的数据库,客户端协议,查询本身等当判断缓存是否命中时,mysql是不会解析,优化的,使用的是sql语句和客户端发送过来的原始信息。所以任何字符上的不同,例如空格,注释等都会导致缓存不会命中(所以这就导致缓存命中的条件比较苛刻,不同的编码习惯,命中率的影响很大)查询缓存如何使用内存查询缓存是完全在内存当中,基本的管理维护数据结构大概需要40kb左右的内存资源mysql用于查询缓存的内存被分

2021-08-27 11:13:55 269

原创 synchronized的有序性原理

一方面加了锁之后,只能有一个线程获得到了锁,获得不到锁的线程就要阻塞。所以同一时间只有一个线程执行,相当于单线程,而单线程的指令重排是没有问题的。另一方面还有就是在 进入synchronized代码块会先添加一个 acquire barrier 在最后添加一个release barrier 保证同步代码块中的代码不能和同步代码块外面的代码进行指令重排,在其内部还是会发生指令重排但基本不会影响结果总结,synchronized可以保证有序性但是不能避免指令重排,在双重检验的单例模式中,必须加volat.

2021-08-10 16:31:53 1555

原创 Java 代理模式实现方式,主要有如下五种方法

Java 代理模式实现方式,主要有如下五种方法静态代理,工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler- - 接口引用 )字节码文件并实例化对象返回。(jdk动态代理是由java内部的反射机制来实例化代理对象,并代理的调用委托类方法)基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要

2021-05-23 13:43:19 535

原创 内存泄露的八种情况

内存泄露的八种情况静态集合类单例模式,被单例对象所引用的对象不容易被回收。内部类持有外部类各种连接,如数据库连接,网络连接和IO连接等变量不合理的作用域改变hash值缓存泄露监听器和回调...

2021-04-13 19:49:02 128

原创 redis - 为什么redis是单线程的

为什么redis是单线程的?回答:在某些情况下,多线程不一定比单线程优秀,我们的redis主要是基于内存操作,读取的都是内存中的数据,而根据操作系统我们知道内存的读写速度相对较快,我们的redis可以一利用cpu来不间断读取内存中的数据,(读取时,不会产生像读取磁盘那样长的等待时间)倘若我们的redis是多线程的话,就会产生上文切换的额外开销,当线程上文切换的额外开销,反而拉低效率。所以单线程是个更好的处理方案。redis的技术瓶颈?官方表示:redis是基于内存操作,CPU不是redis的技术瓶颈

2021-04-03 22:10:29 118

原创 java多线程 - 虚假唤醒

线程也可以唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒 。 虽然这在实践中很少会发生,但应用程序必须通过测试应该使线程被唤醒的条件来防范,并且如果条件不满足则继续等待。 换句话说,等待应该总是出现在循环中,就像这样:synchronized (obj) { while (<condition does not hold>) obj.wait(timeout); ... // Perform action appropriate

2021-03-30 14:10:35 91

原创 JVM - 堆区 为什么在jvm中,SurvivorRatio= 8,但是在visualVM中的实际比值确实6:1:1?

为什么在jvm中,SurvivorRatio = 8,但是在visualVM中的实际比值确实6:1:1?由于jvm中,默认开启了+UseAdaptiveSizePolicy ,堆内存的中Eden和survivor0,survivor1的比值会被自动优化,就会出现,-XX:SurvivorRatio=8 ,但是实际却不是的情况。想改变回来,就得关闭-UseAdaptiveSizePolicy,在显示的适应-XX:SurvivorRatio=8,比例就会改变为8

2021-03-25 10:22:45 769

原创 java多线程 - hashmap在jdk1.7中的多线程死锁问题

扩容死锁(hashmap在jdk1.7中的多线程死锁问题)hashmap 的死锁问题主要是在扩容的时候,而扩容的方法是 transfer ,对方法 transfer 简化如下, void transfer(Entry[] newTable, boolean rehash) { for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.n

2021-03-24 21:39:32 437

原创 web前端实验2

web实验2https://blog.csdn.net/TobEABetterMan_/article/details/115085442?spm=1001.2014.3001.5501

2021-03-24 19:15:18 252

VSCodeUserSetup-x64-1.62.3.exe

VSCodeUserSetup-x64-1.62.3.exe

2021-12-04

空空如也

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

TA关注的人

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