自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM参数

标注指令:-开头,这些是所有的HotSpot都支持的参数,可用Java-help打印出来非标注指令:-x开头,这些指令通常是跟特限定的HotSpot版本对应的,可用Java -x打印出来不稳定参数:-xx开头,这一类参数都是跟特定HotSpot本本对应的,并且变化非常大...

2022-01-12 12:56:45 247

原创 STW理解

STW:Stop-The-World,是垃圾回收算法执行过程中需要将JVM内存冻结的一种状态,在STW状态下JAVA的所有线程都是停止执行的(GC线程除外),native方法可以执行但是不能与JVM交互,GC各种算法优化的重点就是减少STW,同时也是JVM调优的重点...

2022-01-12 12:54:14 508

原创 CopyOnWriteArrayList的的底层原理是怎样的

CopyOnWriteArrayList内部是通过数组实现,在向CopyOnWriteArrayList添加元素时会复制一个新的数组,写操作在新数组上进行,读操作在原数组进行并且写操作会加锁,防止出现并发写入丢数据的问题CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList较占内存,同时可能读到的数据不是实时最新的数据,所以不适合实时性要求很高的场景...

2022-01-12 12:43:56 282

原创 深拷贝和浅拷贝

深拷贝和浅拷贝就是指对象的拷贝,一个对象中存在两种类型的属性,一种是基本数据类型,一种时实例对象的引用浅拷贝只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会复制一份引用地址所指向的对象,内部的属性指向的是同一个对象深拷贝既会拷贝基本数据类型的值,也会针对实例对象的引用地址所指向的对象进行赋值,深拷贝出来的对象,内部的属性指向不是同一个对象...

2022-01-12 12:40:03 100

原创 JVM的垃圾回收算法

标记清除算法标记阶段,把垃圾内存标记出来清楚阶段,直接将垃圾内存回收此算法较简单但会产生大量的内存碎片复制算法为解决标记算法的内存碎片问题,产生此算法复制算法将内存分为大小相等的两半,每次只使用其中一半,垃圾回收时将当前这一块的存活对象全部拷贝到另一半,然后当前这一半内存就可以直接清除,这种算法没有内存碎片但是会浪费空间,而且效率与存活对象的个数有关标记压缩算法此算法在标记阶段跟标记清除压缩算法一样,但是在完成标记之后不是直接清理垃圾内存,而是将存活对象往一端移动然

2022-01-12 12:34:38 147

原创 类加载器双亲委派模型

JVM中存在三个默认的类加载器:BootstrapClassLoaderExtClassLoaderAppClassLoaderAppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器是BootstrapClassLoaderJVM在加载一个类时会调用AppClassLoader方法来加载这个类,不过这个方法会使用ExtClassLoader的loadClass方法来加载类,同样ExtClassLoader的loadClass方法中会

2022-01-12 12:27:40 76

原创 Spring的事务传播行为

什么是事务传播行为描述的方法和方法之间事务的关系Spring事务注解共7种TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,.

2021-12-01 21:50:17 73

原创 Btree和b+tree结构对比

BTree索引值和data数据分布在整棵树中每个节点可以存放多个索引值以及对应的data数据树节点中的多个索引值从左到右升序排列BTree也是按照二分查找,从每个节点找,如果没找到再到子节点上进行二分查找B+Tree非叶子节点不存储data数据,只存储索引值,这样可以存储更多的索引值叶子节点包含所有的索引值和data数据叶子节点用指针连接,提高区间的访问性能...

2021-11-28 16:28:56 100

原创 MyBatis如何获取自动生成的(主)键值

insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>insert into names (name) values (#{name})</insert>name name = new name();name.setnam

2021-11-28 14:43:46 534

原创 MyBatis如何执行批量插入

首先,创建一个简单的 insert 语句<insert id=”insertname”>insert into names (name) values (#{value})</insert>然后在 java 代码中像下面这样执行批处理插入list < string > names = new arraylist();names.add(“fred”);names.add(“barney”);names.add(“betty”);...

2021-11-28 14:41:32 545

原创 MyBatis的模糊查询 like 语句

第 1 种:在 Java 代码中添加 sql 通配符string wildcardname = “%smi%”;list<name> names = mapper.selectlike(wildcardname);<select id=”selectlike”>select * from foo where bar like #{value}</select>第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入string wildcar

2021-11-28 14:37:38 149

原创 MyBatis当实体类中的属性名和表中的字段名不一样时解决方法

第一种:通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类 的属性名一致<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>select order_id id, order_no orderno ,order_price price formorders where order_id=#{id};</select>第二种:通过来映射字段名和

2021-11-28 14:33:32 1402

原创 Thread 类的 sleep()方法和对象的 wait()方法的区别

sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第 66 题中的线 程状态转换图)。wait()是 Object 类的方法,调用对象的 wait()方法导致当前线 程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用 对象的 notify()方法(或 notifyAll()方法)时才能唤醒等待池中的线程进入等锁池

2021-11-27 16:14:26 394

原创 TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?

TreeSet 要求存放的对象所属的类必须实现 Comparable 接口,该接口提供了比 较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小。 TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元 素进行排序。Collections 工具类的 sort 方法有两种重载的形式,第一种要求传入 的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较;第二 种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是

2021-11-27 16:13:21 416

原创 List、Map、Set 三个接口存取元素时,各有什么特点

List 以特定索引来存取元素,可以有重复元素。Set 不能存放重复元素(用对象的 equals()方法来区分元素是否重复)。Map 保存键值对(key-value pair)映射, 映射关系可以是一对一或多对一。Set 和 Map 容器都有基于哈希存储和排序树的 两种实现版本,基于哈希存储的版本理论存取时间复杂度为 O(1),而基于排序树 版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达 到排序和去重的效果。...

2021-11-27 16:10:55 231

原创 JVM 加载 class 文件的原理机制

JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的 类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件 中的类。 由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一 个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、 连接(验证、准备和解析)和初始化。类的加载是指把类的.class 文件中的数据读 入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类

2021-11-27 15:55:43 91

原创 释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

我们定义一个基本数据类型的变量,一个对象的引用,函数调用的现场都保存使用JVM中的栈内存通过new关键字和构造器创建的对象则放在堆内存,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,堆内存还可以细分为新生代和老生代再具体一点可以分为Eden、Survior、又可分为From Survior和To Survior、Teneurd方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息,常量,静态变量,JIT编译器编译后的代码等数据,常量池也是方法区的一部分

2021-11-27 15:52:07 381

原创 Concurrency API中的LOCK接口(Lock interface)

Lock接口比同步方法和同步块提供了更具有扩展性的锁操作,允许使用更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象优势可以使锁更公平可以使线程在等待所的时候响应中断可以让线程尝试获取锁,并且无法获取锁的时候立即返回或者等待一段时间可以在不同的范围,以不同的顺序获取和释放锁Lock可以理解为是synchronized的扩展版,Lock提供了无条件的,可轮询的(tryLock方法),定时的(tryLock带参方法),可中断的(lockInterruptbly),

2021-11-27 14:28:27 258

原创 死锁和活锁的区别,死锁与饥饿的区别

死锁:是指两个或两个以上的线程在执行过程中因争夺资源而造成的一种互相等待的现象,如果没有外力作用他们将无法推进下去产生死锁的必要条件互斥条件:所谓互斥就是进程在某一时间段内独占资源请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:进程已获得资源,在未使用完之前不能强行剥夺循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系活锁:任务或执行者没有被阻塞,由于某些条件没有被满足导致一直重复尝试,失败-尝试-失败活锁和死锁的区别处于活锁的实

2021-11-26 17:40:37 318

原创 Dubbo的核心配置

配置 配置说明 dubbo:service 服务配置 dubbo:reference 引用配置 dubbo:protocol 协议配置 dubbo:application 应用配置 dubbo:module 模块配置 dubbo:provider 提供方配置 dubbo:registry 注册中心配置 dubbo:monitor 监控中心配置 dubbo:consumer 消费方配置 dubbo:method

2021-11-26 17:09:50 1081

原创 Dubbo集群容错方案

集群容错方案 说明 Failover Cluster 失败自动切换,自动重试其他服务器(默认) FailfastCluster 快速失败,立即报错,之发起一次调用 FailfastCluster 失败安全,发现异常时直接忽略 FailbackCluster 失败自动恢复,记录失败请求,定时重发 ForkingCluster 并行调用多个服务器,只要一个成功即返回 BroadcastCluster 广播逐个调用所有的提供者,任意一个报...

2021-11-26 17:02:28 1006

原创 Dubbo和SpringCloud的区别

Dubbo SpringCloud 服务注册中心 Zookeeper SpringCloud Netflix Eureka 服务调用方式 RPC REST API 服务网关 无 SpringCloud Netflix Zuul 断路器 不完善 SpringCloud Netflix Hystrix 分布式配置 无 SpringCloud Netflix Config 服务跟踪 无 SpringCl...

2021-11-26 16:45:42 70

原创 Dubbo分布式架构

Dubbo的整体架构分层接口服务层(Service):该层与业务逻辑相关,根据provider和consumer的业务设计对应的接口和实现配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务端的Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory服务注册层(Registry):封装服务地址的注册和发现,以服务URL为中心

2021-11-26 16:40:19 135

原创 SpringMVC常见注解

@RequestBodyRequestBody主要用于接收前段传递给后端的json字符串中的数据,最常用的是POST请求@RequestBody可以和@RequestParam同时使用,但RequestBody只能有一个,RequestParam可以有多个@RequestParm将请求参数绑定到控制器的方法参数上@Request Param(value=“参数名”,required=‘true/false’,default value=“默认值”)@Path Variable

2021-11-25 18:19:05 60

原创 微服务的优缺点和单片架构,SOA的区别

微服务架构的优点:自由使用不同的技术每个微服务都侧重于单一功能支持单个可部署但愿允许经常发布软件确保每项服务的安全性多个服务是并行开发和部署的微服务架构的缺点:增加故障排除的挑战由于是远程调用所以增加响应时间增加了配置的工作量较难确保交易的安全较难的在服务之间进行编码单片,SOA和微服务的区别单片架构类似于大容器,其中应用程序的所有软件组装在一起并紧密封装面向服务架构是一种互通信服务的集合,通信可以涉及简单的数据传递,也可以涉及两个或多个

2021-11-25 11:43:58 471

原创 @Autowired 注解

@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于 在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入

2021-11-24 13:08:53 215

原创 @Component, @Controller, @Repository,@Service注解的区别

@Component :这将 java 类标记为 bean。它是任何 Spring 管理组件的通 用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中@Controller :这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。@Service :此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图

2021-11-24 13:04:27 2902

原创 SpringBean的生命周期

spring bean容器的生命周期流程1、Spring容器根据配置中的bean定义实例化bean2、Spring使用依赖注入填充所有属性,如bean中所定义的配置3、如果bean实现BeanNameAware接口,则工厂通过传递bean的id来调用setBeanName()4、如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()5、如果存在与bean关联的任何BeanPostProcessors,则调用preProcessB

2021-11-24 12:56:05 265

原创 Redis中如果有大量的Key需要设置同一过期时间需要注意什么?

如果大量的key过期时间设置的太过集中,到过期的那个时间点redis可能会出现短暂的卡顿现象,一般需要在时间上加个随机值,使得过期时间分散一些

2021-11-23 12:30:03 1663

原创 Redis回收进程工作流程

当一个客户端运行了新的命令,添加了新的数据,Redis检查内存使用情况,如果大于max memory的限制,则根据设定好的策略进行回收。我们不断的穿越内存限制的边界,通过不断达到边界然后不断的回收并回收到边界以下。如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越...

2021-11-23 12:27:44 824

原创 Redis内存使用情况降低的办法

如果使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的key- value可以用更紧凑的方式存放

2021-11-23 12:23:18 563

原创 Redis哈希槽的概念

Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放到哪个槽,集群的每一个节点负责一部分的hash槽

2021-11-23 12:20:14 314

原创 Redis的回收策略(淘汰机制)

volatile-lru:从已经设置过期时间的数据集中挑选最少使用的数据淘汰volatile-ttl:从已经设置过期时间的数据集中挑选将要过期的数据淘汰volatile- random:从已经设置过期的数据集中任意选择数据淘汰allkeys-lru:从数据集中挑选最少使用的数据淘汰allkeys- random:从数据集中任意选择数据淘汰no-enviction(驱逐):禁止驱逐数据这里的6种机制,volatile和allkeys规定了是已设置过期时间的数据集淘汰数据还是从全部数

2021-11-23 12:12:59 863

原创 分布式事务解决方案

分布式事务产生的原因事务这个东西本质上是由数据库提供的,而当我们采用了分库的思想所以在一个service方法或同一个为服务中操作了不同的库,于是就产生了分布式事务的问题事务的四个特性:原子性,一致性,隔离性,持久性CAPC:一致性--->数据需要是一致的A:可用性--->只要一访问就要立刻响应P:分区容错性--->因网络故障或其他原因导致分布式系统中的部分节点与其他节点失去连接,形成独立的分区三者只能取其二,另一个只能弱一点Base描述的是如果三者只能

2021-11-22 15:05:51 1293

原创 MyBatis框架

什么是MyBatisMybatis是一个半ORM(对象映射关系)框架,它内部封装了JDBC,开发时只需关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂过程。程序开发者直接编写原生态sql,可以严格控制sql执行性能,灵活度高Mybatis可以使用XML(常用)或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集通过XML文件或注解的方式将要执行的各种statement配置起来,并通过Java

2021-11-22 13:50:00 318

原创 Redis分布式锁

Redis分布式锁是利用setNx方法和SetEx方法向redis中写一个字符串,如果redis本身不存在这个数据,setNx就能写入成功并且返回1,如果client拿到返回值结果1就表示他获得到了锁,执行业务逻辑完毕后删除锁,如果没有写入成功redis就会返回0,如果拿到0就表示没有获得到锁,需要自旋去进行抢锁以上方式存在的问题1、不能防止死锁2、有可能自己删除掉了别人的锁3、存在一个续期逻辑4、公平性问题解决问题1的解决:给redis设置key的时候添加一个原子性的加锁

2021-11-21 10:50:59 720

原创 SQL优化

在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在 MySQL 中优化 SQL 语句的方法。定位慢查询通过慢查询可以定位到已执行完的sql中哪些sql的执行效率较低,但请注意,他是执行完之后,才有结果开启慢查询日志查看MySQL数据库是否

2021-11-21 08:32:08 56

原创 索引结构和设计原则

索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。MySQL提供了4中索引BTREE索引:最常见的索引类型,大部分索引都支持B树索引HASH索引:只有Memory引擎支持,使用场景简单R-tree(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少Full-text(全文索引):全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,Inn

2021-11-20 22:20:27 612

原创 二分查找法

索引底层的查找法就是二分查找法二分查找法也称折半查找法,他是在有序数组中查找指定数据的搜索算法优点:等值查询、范围查询性能高缺点:更新数据、新增数据、删除数据维护成本高过程原理先定位left和right两个指针计算(left+right)/2判断除以2之后索引的位置与目标值的大小对比索引位置的值大于目标值就-1,right移动;如果小于目标值就+1,left移动...

2021-11-20 21:33:06 202

原创 MySQL索引

索引是帮助数据库更高效帮助数据库排好序的数据结构使用角度上分成单值索引,符合索引,唯一索引,主键索引存储角度上分成聚簇索引(innodb)和非聚簇索引(mysia)+辅助索引回表当我们去利用辅助索引去查询时由于查询条件中包含辅助索引中没有值,于是我们辅助索引就得通过回表到聚簇索引上查询数据覆盖索引我们查询时不用进行回表,我们查询的字段恰好就是从一个索引树上能拿到完整结果的数据他底层采用的是B+TreeB+Tree是一个多路平衡叉树B+Tree的优点:数据都落在

2021-11-18 16:51:34 415

空空如也

空空如也

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

TA关注的人

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