- 博客(222)
- 收藏
- 关注
原创 java面经总结-jvm相关
一.谈谈你对java的理解平台无关性在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。同一份Java源代码在不同的平台上运行,它不需要做任何的改变,并且只需要编译一次。而编译好的字节码,是通过JVM这个中间的“桥梁”实现跨平台的,JVM是与平台相关的软件,它能将统一的字节码翻译成该平台的机器码。gc特性语言特性面向对象类库异
2022-03-16 12:54:35 312 1
原创 kubernetes介绍
概念Master:集群控制结点,每个集群需要至少一个master结点负责集群的管控Node:工作负载结点,由aster分配容器到这些node工作结点上,然后node结点上的docker负责容器的运行。Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器Controller:控制器,通过他来实现对pod的管理,比如启动pod,停止podService:pod对外服务的统一入口,下面可以维护着同一类的多个podLabel:标签,用于pod进行分类,
2022-01-29 22:02:18 1478
原创 应用程序部署方式演变
1.传统部署互联网早期,会直接将应用程序部署在物理机上优点:简单,不需要其他技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响。2.虚拟化部署可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境优点:程序环境不会相互产生影响,提供一定程度的安全性缺点:增加了操作系统,浪费了部分资源。3.容器化部署与虚拟化类似,但是共享了操作系统优点:可以保证每个容器拥有自己的文件系统,cpu,内存,进程空间等运行应用程序所需要的资源都被容器包
2022-01-25 10:39:40 2575
原创 ddd概念
ddd的相关概念ddd叫做领域驱动设计,是一种软件架构设计方法,他并不定义软件开发过程ddd利用面向对象的特性,以业务为核心驱动,而不是传统的数据库驱动开发什么是领域领域是对功能需求的划分;大的领域下面还有许多小的子领域对领域模型进行分析,推演实体(数据表),值对象(传递的参数),领域服务(实现的业务功能)找出聚合边界,降低服务耦合度。为聚合配备存储仓库(数据持久化)实践ddd,并不断推倒和重构。...
2022-01-22 09:29:46 527
原创 HTML基本使用
HTML基础结构与属性超文本标记语言,标准通用标记语言下的一个应用。是网页制作必备的编程语言HTML:超文本 标记 语言超文本:文本内容 + 非文本内容(图片,视频,音频等)标记: 也叫做标签 <单词> 例如:,写法分成两种单标签 双标签 标签是可以上下排列的,也可以组合嵌套标签的属性:来修饰标签的,设置当前标签的一些功能<标签 属性=“值” 属性=“值”>语言:编程语言HTML的初始代码 文档声明:告诉浏览器这是一个html文件
2022-01-18 14:02:35 521
原创 redis过期策略
定时删除redis会将每个设置了过期时间的key放入一个独立的字典当中,以后会定时遍历这个字典来删除到期的key。惰性删除除了定时遍历之外,他还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候,redis对key的过期时间进行检查,如果过期了就立即删除。如果说定时删除是集中处理,那么惰性删除就是零散删除。定时扫描策略1.从过期字典中随机选出20个key2.删除这20个key中已经过期的key3.如果过期的key的比例超过四分之一,那就重复步骤1同时,为了保证过期
2022-01-17 16:56:42 686
原创 redis-事务
指令:multi:表示事务的开始exec:表示执行事务discard:表示事务的丢弃watch:监视某个变量的状态当一个客户端处于事务状态时,这个客户端发送的命令,服务器是否会立即执行,分为以下2种情况:如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD四个命令中的其中1个,服务器会立即执行这个命令。如果客户端发送的命令为以上4个命令外的其它命令,服务器不会立即执行这个命令,而是将其放到事务队列里,然后向客户端返回QUEUED回复。服务器一旦收到exec指令,才开始执行整个
2022-01-15 16:35:42 77
原创 布隆过滤器
什么是布隆过滤器可以把布隆过滤器理解为一个不怎么精确的set结构,当你是用他的contains方法判断某个对象是否存在的时候,他可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,他的精确度也可以控制得相对足够精确。实现原理:布隆过滤器是一个bit数组当我们要映射一个值到布隆过滤器的时候,我们需要使用多个不同的哈希函数对该值进行哈希映射,并对每个生成的哈希值指向的bit位置变成1。再增加一个值值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆
2022-01-13 15:52:15 251
原创 HyperLoglog
HyperLoglog提供不精确的去重技术方案,但是也不是非常离谱,标准误差是0.81%。同时他需要的12kb的空间。但是在技术比较小的时候,他的存储空间采用稀疏矩阵存储,空间占用又很小,仅仅在技术慢慢变大,稀疏矩阵占用空间渐渐超过了阈值的时候,才会一次性转变成稠密矩阵,才会占用12kb的空间。算法:HyperLogLog算法是近似统计大量去重元素数量的算法,它内部维护了16384个桶来记录各自桶的元素数量,当一个元素过来,它会散列到其中一个桶。当元素到来时,通过 hash 算法将这个元素分派到其中的一
2022-01-13 15:22:22 473
原创 HashMap源码分析
HashMap内部的结构它可以看做是数组和链表结合组成的符合结构,数组被分为一个个桶,通过哈希值决定了键值对在这个数组的寻址;哈希值相同的键值对,则以链表形式存储。如果链表大小超过阈值,图中的链表就会被改造成树形结构。从非拷贝构造函数的实现来看,这个表格(数组)似乎并没有在最初就初始化好,仅仅设置了一些初始值而已。所以,也许HashMap是按照lazy-load的原则来进行初始化。put方法:如果表格是null,resize方法会负责初始化它,这从tab = resize()可以看出。resiz
2021-12-25 13:58:27 362
原创 公平锁与非公平锁,可重入锁与不可重入锁
公平锁与非公平锁公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待首先Java中的ReentrantLock 默认的lock()方法采用的是非公平锁。公平锁的效率较低,但是不会引起线程的饿死非公平锁的效率较高,但是会引起线程的饿死可重入锁与不可重入锁广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者cla
2021-12-18 15:01:36 601
原创 synchronized的具体表现形式
对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的class对象对于同步方法块,锁是synchonized括号里面配置的对象
2021-12-18 14:40:11 246
原创 juc-lock
lock锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。衙门允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。lock提供了比synchronized更多的功能。lock与synchronized区别1.lock不是java语言内置的,synchronized是java语言的关键字,因此是内置特性。2.lock是一个类,通过这个类可以实现同步访问。3.ock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synch
2021-12-16 21:10:06 128
原创 JUC简介
JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。提供了许多在并发编程工程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO、轻量级框架、还提供了多线程上下文的Collectiion的实现。wati和sleep的区别1.sleep是thread的静态方法,wait是object的方法,任何对象实例都能调用2.sleep不会释放锁,他也不需要占用锁。wait会释放锁,但调用它的前提就是当前线程占有锁。3.他们都可以被interrupted方法
2021-12-15 22:04:44 600
原创 rockemq的高级特性
消息的存储1.消息生产者发送消息到MQ2.MQ收到消息,将消息进行持久化,存储该消息(避免broker宕机造成生产者不断重发消息而造成消费者的重复消费)3.MQ返回ACK给生产者4.MQ push消息给对应的消费者5.消息消费者返回ACK给MQ6.MQ删除消息rocketmq直接将消息存在文件系统上面,而activemq是存在数据库中消息服务器会先向文件磁盘当中预先申请连续的一片空间,进行消息的顺序存取,提高消息的提取速度。消息的发送:linux系统发送数据的方式为零拷贝数据传输由
2021-12-07 22:20:13 400
原创 消息队列大致流程
大致流程消息生产者集群,发送消息给broker的消息服务器集群,同时消息服务器集群可以返回接收的结果。消息服务器集群会被监听器监听,如果消息服务器集群中含有消息,会将其进行推送给消费者。然后消息消费者集群可以从消息服务器集群中拉取消息生产者会发送消息给命名服务器集群获取broker信息,去寻找在broker服务器上对应的消息队列,消费者也是如此。...
2021-12-02 21:50:23 588
原创 分库与分表
作用:分库分表就是为了解决由于数据量过大二造成数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库,单一数据表的数据量变小,从而达到提升数据库性能的目的。垂直分表:将一个表按照字段分成多个表,每个表存储其中一部分字段可以将访问数据比较频繁的字段放在一张表上,将其他字段放在另一张表上,或者将大字段数据放在一张表上,小字段数据放在一张表上。这样可以避免一些频繁访问字段被不频繁访问字段所拖累而降低效率。大字段IO效率低:第一是由于数据量本身大,需要更
2021-11-27 13:03:47 1329
原创 mycat的主从配置
在schema.xml文件中进行配置schema标签为虚拟的数据库而在下面的dataNode标签为实际的数据库,Mycat常见错误1、 问题:schema TESTDB didn’t config tables,so you must set dataNode property!解决:在schema.xml少加了一个参数在schema标签的最后添加dataNode = “dn1”即可...
2021-11-27 10:57:13 1018
原创 高性能数据库
pxc集群:每个节点都必须同步接受数据,适合保存强一致性数据。rp集群:每个节点时异步接受数据的,不适合保存强一致性数据。只要一个结点成功接受数据,那么事务就算成功了,如果由于网络原因,读写分离的情况下,就可能导致扣款成功,但是订单状态同步失败的问题。如果一个请求既操作了pxc又操作了rp的数据,这种夸集群的事务就很难实现。...
2021-11-20 14:29:26 872
原创 乐观锁与悲观锁
乐观锁:每次拿到数据的时候都不会进行上锁,在更新的时候会判断一下在此期间该数据有没有进行变更。实现机制乐观锁的实现主要有两种,一种是版本号控制,另一种是CAS算法实现。版本号控制:一般是在一个数据表中加上一个数据版本号字段,表示数据被修改的次数,当数据被修改的时候,该版本号字段会进行加1的操作。当某一个线程要对一个字段进行修改的时候,会在读取数据的同时读取版本号的值,在提交更新的时候,若版本号的值与之前的版本号的值不同的时候,便会重新进行更新操作。CAS机制:线程在读取数据时不进行加锁,在准备
2021-11-20 09:06:00 76
原创 SPU与SKU
SPU全称为standard product unit,是标准产品单位。spu描述一个产品的各种特性。SPU 是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述 了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个 SPU。例如:ThinkPad:产品有各种的销售方案,4K 屏、黑色、32G 内存等;商品小米 9:产品也有各种的销售方案,黑色、128g、红色;商品技嘉 1060 显卡产品有 2G、4G、6G 版本;商品spu与商家,颜色,套餐等等没有关
2021-11-19 10:40:47 294
原创 mysql事务机制
mysql一共有5种日志,其中只有redo日志和undo日志与事务相关先将数据复制到undo日志当中,修改成功之后,记录在redo日志当中,操作没有问题之后,则把redo日志中的数据同步到数据库中。就算系统重启,还有redo日志,所以数据一般不会丢失。事务的ACID属性A:原子性:一个事务中的所有操作要么全部成功,要么全部失败。事务执行后不允许停留在某个状态。先拷贝数据到undo中,执行成功之后,写入redo中,提交事务,把redo中的数据同步到数据库中。如果要回滚,则把undo与redo中的数据
2021-11-19 10:34:14 589
原创 类加载各个阶段
加载将类的字节码载入方法区中,如果这个类还有父类没有进行加载,可以先加载父类。加载和连接可能是交替运行的。连接验证阶段:验证类是否符合jvm规范,安全性检查。准备阶段:static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成。如果static变量是final的基本类型,那么编译阶段值就已经确定了,赋值在准备阶段完成。如果static变量是final的,但属于引用类型,那么赋值也会在初始化阶段完成。解析阶段:将常量池中的符号引用解析为直接引用初始化初始化即
2021-10-30 20:05:11 95
原创 一台机器最多能撑多少个TCP连接?
客户端对于有1个Ip的客户端来说,受限于ip_local_port_range参数,也受限于65535。但单Linux可以配置多个ip,有几个ip,最大理论值就翻几倍TCP连接的客户端机:每一个ip可建立的TCP连接理论受限于ip_local_port_range参数,也受限于65535。但可以通过配置多ip的方式来加大自己的建立连接的能力。服务端我们现在在来回头考虑服务器端。对于服务器来说,最大支持的并发连接是多少呢?就有人开始可爱地糊涂了:“服务器端理论也是端口限制吗?”。好,假设如果受影响的话
2021-10-27 21:18:44 2127
原创 类文件结构
根据jvm规范,类文件的结构如下左边对应的是每个标志所占的字节位数。魔数0~3字节,表示它是否是class类型的文件版本4~7字节,表示类的版本,此处的类的版本表示为java8常量池8~9字节,表示常量池长度,此处的常量池的长度为35项,从#1-#34项,#0项不计,这样做是为了满足某些指向常量池的索引值的数据在特定的情况下表达不引用任何一个常量池项常量池项0a为16进制,转换成10进制便是10,根据常量池表,0a表示这是一个method信息,0006和0015表示它引用了常量
2021-10-27 16:00:36 69
原创 easyexcel
1.常用类EasyExcel 入口类,用于构建各种对象,开始各种操作ExcelReaderBuilder 构建出一个ReadWorkbook对象,即一个工作簿对象,对应的是一个Excel文件ExcelWriterBuilder 构建出一个 WriteWorkbook对象,即一个工作簿对象,对应的是一个Excel文件ExcelReaderSheetBuilder 构建出一个ReadSheet对象,即一个工作表对象,对应的Excel文件中的每个sheet,一个工作簿可以 有多个工作表ExcelWrit
2021-10-25 19:24:08 657
原创 一个接口同时接收到多个用户的请求,服务器怎么解决?
servlet是默认采用单实例,多线程的方式进行。只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,servlet在其生命周期中只有在将项目给移除或服务器stop的时候才会销毁。当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread)调度它管理下的线程池中等待执行的线程(Worker Thread)给请求者;出现不同的线程同一时间访问同一个servlet的时候,servlet的对象只有一个,但是由于是tomcat支持多线程的原因,每个客户端
2021-10-20 21:53:55 3258
原创 垃圾回收器
回收器集合一:Serial 收集器特点:单线程、简单高效二:ParNew收集器特点:多线程、三:Parallel Scavenge 收集器特点:属于新生代收集器也是采用复制算法的收集器,又是并行的多线程收集器(与ParNew收集器类似四:Serial Old 收集器特点:同样是单线程收集器,采用标记-整理算法五:Parallel Old 收集器特点:多线程,采用标记-整理算法。六:CMS收集器特点:基于标记-清除算法实现。并发收集、低停顿七:G1收集器特点:并行与并发:G1能
2021-10-20 20:12:13 63
原创 直接内存的回收机制
对外内存堆外内存是相对于堆内内存的一个概念,堆内内存是由JVM所掌控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且他们遵 循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存,那么堆外内存就是存在于JVM管控之外的一块内存区域,因此,它不直接虚拟机被管控。直接内存NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通的
2021-10-19 09:40:24 445
原创 mysql服务器处理客户端请求
1.连接管理客户端进程可以采用tcp/ip或者命名管道或者共享内存等方式与服务器进程建立连接。服务器进程会创建一个线程专门处理与这个客户端的交互。当客户端与该服务器断开之后,不会立即撤销线程,只会把他缓存起来等待下一个客户端请求连接的时候,将其分配给该客户端。2.解析与优化1.查询缓存。2.语法解析:如果查询缓存没有命中相应的语句,那么服务器将会对该文本语句进行分析,判断是否正确,然后才从文本中将要查询的表,个中查询条件都提取出来放到mysql服务器内部使用的一些数据结构上。3.查询优化:我们自己
2021-10-16 09:43:15 453
原创 TCP保证可靠传输的手段
1.应用数据被分割成TCP认为最适合发送的数据块。2.当TCP发出有一个段文之后,他启动一个定时器,等待目的端确认受到这个报文段。如果不能及时收到一个确认,将重发这个报文段。3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。但是不是立即就开始进行发送,需要先对包的完整性进行检查才开始发送。4.TCP将保持他的首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输的过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。5. 对TCP端所收到的数据
2021-10-14 16:24:58 205
原创 cicd开发模型
持续集成CI通过持续集成,开发人员能够频繁将其代码集成到公共代码仓库的主分支当中。开发人员能够在任何时候多次向仓库提交作品,而不是独立地开发每个功能模块并在开发周期结束的时候才提交。持续交付CDCD 集中依赖于部署流水线,团队通过流水线自动化测试和部署过程。此流水线是一个自动化系统,可以针对构建执行一组渐进的测试套件。CD 具有高度的自动化,并且在一些云计算环境中也易于配置。在流水线的每个阶段,如果构建无法通过关键测试会向团队发出警报。否则,将继续进入下一个测试,并在连续通过测试后自动进入下一个阶段。
2021-10-14 16:10:00 196
原创 设计模式的六大设计原则
一.单一职责原则每个类的功能都必须单一,不能多功能二.里氏替换原则1.子类必须完全实现父类的方法2.子类可以有自己的个性,拥有自己的特定的方法3.覆盖或实现父类的方法的时候输入的参数可以被方法4.覆盖或实现父类的方法的时候输出的结果可以被缩小三.依赖倒置原则1.接口或抽象类不依赖于实现类2.实现类依赖接口或抽象类四.接口隔离原则1.客户端不依赖它不需要的接口2.类之间的依赖关系应该建立在最小的接口上五.迪米特法原则一个类应该对自己需要耦合或调用的类知道最少六.开闭法则软件实体
2021-10-14 14:42:14 52
原创 java编译期
前端编译器:把java文件转变成为class文件的过程。JDK的javac中的增量式编译器即时编译器:运行期把字节码转变成本地机器码的过程。Hotspot虚拟机的c1,c2编译器提前编译器:直接把程序编译成与目标机器指令集相关的二进制代码过程。JDK的jaotc从java代码的总体结构来看,编译过程大致可以分为1个准备阶段和3个处理过程1.准备阶段:初始化插入式注解处理器2.解析与充填符号表过程3.插入式注解处理器的注解处理过程4.语义分析与字节码生成过程注:上述3个处理过程里面,执行插入式
2021-10-14 09:47:23 108
原创 java注解
注解也叫做元数据,即一种描述数据的数据。解析一个注解往往有两种形式,一种是编译器的直接扫描,一种是运行期的反射。编译器的扫描指的是编译器在对java代码编译成字节码的过程中会检测到某个类或者方法被一些注解修饰,这时它就会对于这些注解进行某些处理。注解的用途1.生成文档2.编译检查3.编译时动态处理4.运行时动态处理元注解1.retention,解释说明这个注解的存活时间RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。Retentio
2021-10-12 09:38:41 59
原创 java语法糖
指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。并且该语法糖只存在编译期。解语法糖java虚拟机并不支持所谓的语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构。这个过程就叫做解语法糖。基本语法糖块1.switch支持String与枚举其实对于编译器来说switch中其实只能使用整型。而对于String类型的支持,是通过equals和hashcode的方法来进行实现的。先比较哈希值,再通过equals方法进行比较。2.泛型和类型擦除虚拟机中没有
2021-10-10 12:31:41 121
原创 通配符过滤查询
LIKE操作符与之相匹配的通配符1.百分号%通配符%表示任何字符出现的任意次数2.下划线_通配符只匹配单个字符而不是多个字符注意事项:不要过度使用通配符。它会降低搜索性能,增加性能负担。在确实需要使用通配符的时候,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。要自习注意通配符的位置,如果放错地方,可能不会返回想要的数据。...
2021-09-20 20:57:45 168 1
原创 用in操作符的理由
1.在使用长的合法选项清单的时候,in操作符的语法更清楚且更加直观2.在使用in的时候,计算的次序更容易管理3.in操作符一般比or操作符清单执行得更快4.in的最大优点是可以包含其他的select语句,使得能够更动态地建立where子句。...
2021-09-20 20:38:01 86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人