自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 固态硬盘替换机械硬盘

以我自己的笔记本电脑举例:我自己的笔记电脑是ThinkPad L440 型号 带光驱首先根据电脑型号,在网上选择电脑型号对应的固态硬盘,最好是买固态硬盘送对应的盒子;固态硬盘可以让店家为你装好系统,到手后把机械硬盘换成固态硬盘,然后把机械硬盘放到光驱位置使用。我买的固态硬盘没让店家装系统,我准备把自己的系统迁移到固态硬盘中,收到固态硬盘后,把固态硬盘装进固态硬盘盒子里,然后替换光驱盒子然后,我们下载迁移系统的软件Diskgenius(DiskGenius – 正式版下载|免费下载),下载

2022-03-05 14:04:09 4305

原创 Win10系统的SSH连接不再断连

在C盘/用户/用户名/.ssh 目录下创建config文件,该文件不要有后缀,在文件内添加ServerAliveInterval 60 保存然后用ssh命令连接远程服务器,不会再像以前一样,过一会儿不操作就断连了

2021-10-14 17:27:10 849

原创 性能优化——抢购性能瓶颈调优

抢购业务流程 在进行具体的性能问题讨论之前,我们不妨先来了解下一个常规的抢购业务流程,这样方便我们更好地理解一个抢购系统的性能瓶颈以及调优过程。 用户登录后会进入到商品详情页面,此时商品购买处于倒计时状态,购买按钮处于置灰状态。 当购买倒计时间结束后,用户点击购买商品,此时用户需要排队等待获取购买资格,如果没有获取到购买资格,抢购活动结束,反之,则进入提交页面。 用户完善订单信息,点击提交订单,此时校验库存,并创建订单,进入锁定库存状态,之后,用户支付订单款。 当...

2020-09-11 15:24:31 273

原创 性能优化——分布式事务调优

如今,大部分公司的服务基本都实现了微服务化,首先是业务需求,为了解耦业务;其次是为了减少业务与业务之间的相互影响。 电商系统亦是如此,大部分公司的电商系统都是分为了不同服务模块,例如商品模块、订单模块、库存模块等等。事实上,分解服务是一把双刃剑,可以带来一些开发、性能以及运维上的优势,但同时也会增加业务开发的逻辑复杂度。其中最为突出的就是分布式事务了。 通常,存在分布式事务的服务架构部署有以下两种:同服务不同数据库,不同服务不同数据库。我们以商城为例,用图示说明下这两种部署:...

2020-09-11 14:29:46 273

原创 性能优化——设计更优的分布式锁?

那什么是分布式锁呢,它又是用来解决哪些问题的呢? 在 JVM 中,在多线程并发的情况下,我们可以使用同步锁或 Lock 锁,保证在同一时间内,只能有一个线程修改共享变量或执行代码块。但现在我们的服务基本都是基于分布式集群来实现部署的,对于一些共享资源,例如我们之前讨论过的库存,在分布式环境下使用 Java 锁的方式就失去作用了。 这时,我们就需要实现分布式锁来保证共享资源的原子性。除此之外,分布式锁也经常用来避免分布式中的不同节点执行重复性的工作,例如一个定时发短信的任务,在分布式集群中..

2020-09-11 13:54:28 312

原创 性能优化——MySQL中InnoDB的知识点

InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB 体系架构 InnoDB 主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包括缓存磁盘数据、redo log 缓冲等;后台线程则包括了 Master Thread、IO Thread 以及 Purge Thread 等;由 InnoDB 存储引擎实现的表的存储结构文件一般包括表结构文件(.frm)、共享表空间文(ibdata1)、..

2020-09-11 11:23:32 202

原创 性能优化——数据库参数设置优化

MySQL 是一个灵活性比较强的数据库系统,提供了很多可配置参数,便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想,你可能觉得在开发的过程中很少去调整 MySQL 的配置参数,但我今天想说的是我们很有必要去深入了解它们。 我们知道,数据库主要是用来存取数据的,而存取数据涉及到了磁盘 I/O 的读写操作,所以数据库系统主要的性能瓶颈就是 I/O 读写的瓶颈了。MySQL 数据库为了减少磁盘 I/O 的读写操作,应用了大量内存管理来优化数据库操作,包括内存优化查询、排序以及写入操作。.

2020-09-11 10:16:37 344

原创 性能优化——如何避免死锁

之前听别人说过一个项目,在项目初期,没有将读写表分离的,而是基于一个主库完成读写操作。在业务量逐渐增大的时候,偶尔会收到系统的异常报警信息,DBA 通知数据库出现了死锁异常。按理说业务开始是比较简单的,就是新增订单、修改订单、查询订单等操作,那为什么会出现死锁呢?经过日志分析,发现是作为幂等性校验的一张表经常出现死锁异常。和DBA 讨论之后,初步怀疑是索引导致的死锁问题。后来在开发环境中模拟了相关操作,果然重现了该死锁异常。接下来就通过实战来重现下该业务死锁异常。首先,创建一张订单记录表,该表主

2020-09-10 17:11:26 284

原创 性能优化——MySQL调优之索引

MySQL 索引存储结构索引是优化数据库查询最重要的方式之一,它是在 MySQL 的存储引擎层中实现的,所以每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格,看看不同的存储引擎分别支持哪种索引类型:B+Tree 索引和 Hash 索引是我们比较常用的两个索引数据存储结构,B+Tree 索引是通过B+ 树实现的,是有序排列存储,所以在排序和范围查找方面都比较有优势。Hash 索引相对简单些,只有 Memory 存储引擎支持 Hash 索引。Hash 索引适合 key-valu

2020-09-10 16:38:58 64

原创 性能优化——MySQL调优之事务

数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库操作要么成功,要么失败。谈到他,就不得不提 ACID 属性了。数据库事务具有以下四个基本属性:原子性(Atomicity)、一致性(Consistent)、隔离性(Isolation)以及持久性(Durable)。正是这些特性,才保证了数据库事务的安全性。而在 MySQL 中,鉴于MyISAM 存储引擎不支持事务,所以接下来的内容都是在 InnoDB 存储引擎的基础上进行讲解的。我们知道,在 Java 并发编程中,可以多线程并发执行程序

2020-09-10 15:57:00 145

原创 性能优化——MySQL调优之SQL语句

MySQL 数据库是互联网公司使用最为频繁的数据库之一,不仅仅因为它开源免费,MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。我们知道,应用服务与数据库的交互主要是通过 SQL 语句来实现的。在开发初期,我们更加关注的是使用 SQL 实现业务功能,然而系统上线后,随着生产环境数据的快速增长,之前写的很多 SQL 语句就开始暴露出性能问题。在这个阶段中,我们应该尽量避免一些慢 SQL 语句的实现。但话说回来,SQL 语句慢的原因千千万,除了一些常规的慢 SQL 语句可以直接

2020-09-10 15:12:15 134

原创 性能优化——装饰器模式

开始今天的学习之前,我想先请你思考一个问题。假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、设计吊顶装饰房顶等未必是所有用户都需要的,这些功能则需要实现动态添加。还有就是一旦有新的装修功能,我们也可以实现动态添加。如果要你来负责,你会怎么设计呢?此时你可能会想了,通常给一个对象添加功能,要么直接修改代码,在对象中添加相应的功能,要么派生对应的子类来扩展。然而,前者每次都需要修改对象的代码,

2020-09-10 13:45:56 177

原创 性能优化——生产者消费者模式

生产者消费者模式,在之前的一些案例中,我们是有使用过的,相信你有一定的了解。这个模式是一个十分经典的多线程并发协作模式,生产者与消费者是通过一个中间容器来解决强耦合关系,并以此来实现不同的生产与消费速度,从而达到缓冲的效果。使用生产者消费者模式,可以提高系统的性能和吞吐量,今天我们就来看看该模式的几种实现方式,还有其在电商库存中的应用。Object 的 wait/notify/notifyAll 实现生产者消费者在前面,我就曾介绍过使用 Object 的 wait/notify/notify

2020-09-10 11:05:43 437

原创 性能优化——使用设计模式优化并发编程

在我们使用多线程编程时,很多时候需要根据业务场景设计一套业务功能。其实,在多线程编程中,本身就存在很多成熟的功能设计模式,学好它们,用好它们,那就是如虎添翼了。今天我就带你了解几种并发编程中常用的设计模式。线程上下文设计模式线程上下文是指贯穿线程整个生命周期的对象中的一些全局信息。例如,我们比较熟悉的Spring 中的 ApplicationContext 就是一个关于上下文的类,它在整个系统的生命周期中保存了配置信息、用户信息以及注册的 bean 等上下文信息。这样的解释可能有点抽象,我们

2020-09-10 10:04:59 152

原创 性能优化——原型模式与享元模式:提升系统性能的利器

原型模式和享元模式,前者是在创建多个实例时,对创建过程的性能进行调优;后者是用减少创建实例的方式,来调优系统性能。这么看,你会不会觉得两个模式有点相互矛盾呢?其实不然,它们的使用是分场景的。在有些场景下,我们需要重复创建多个实例,例如在循环体中赋值一个对象,此时我们就可以采用原型模式来优化对象的创建过程;而在有些场景下,我们则可以避免重复创建多个实例,在内存中共享对象就好了。今天我们就来看看这两种模式的适用场景,了解了这些你就可以更高效地使用它们提升系统性能了。原型模式我们先来了解下原

2020-09-08 17:58:24 327

原创 性能优化——单一对象优化系统性能

什么是单例模式?它的核心在于,单例模式可以保证一个类仅创建一个实例,并提供一个访问它的全局访问点。该模式有三个基本要点:一是这个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。结合这三点,我们来实现一个简单的单例:// 饿汉模式public final class Singleton {private static Singleton instance=new Singleton();// 自行创建实例private Singleton(){}

2020-09-08 17:17:31 156

原创 性能优化——内存持续上升,该如何排查问题

你肯定遇到过内存溢出,或是内存使用率过高的问题。碰到内存持续上升的情况,其实我们很难从业务日志中查看到具体的问题,那么面对多个进程以及大量业务线程,我们该如何精准地找到背后的原因呢?常用的监控和诊断内存工具工欲善其事,必先利其器。平时排查内存性能瓶颈时,我们往往需要用到一些 Linux 命令行或者 JDK 工具来辅助我们监测系统或者虚拟机内存的使用情况,下面我就来介绍几种好用且常用的工具。Linux 命令行工具之 top 命令top 命令是我们在 Linux 下最常用的命令之一,它可以实

2020-09-08 16:24:17 1498

原创 性能优化——优化JVM内存分配

JVM 调优是一个系统而又复杂的过程,但我们知道,在大多数情况下,我们基本不用去调整 JVM 内存分配,因为一些初始化的参数已经可以保证应用服务正常稳定地工作了。但所有的调优都是有目标性的,JVM 内存分配调优也一样。没有性能问题的时候,我们自然不会随意改变 JVM 内存分配的参数。那有了问题呢?有了什么样的性能问题我们需要对其进行调优呢?又该如何调优呢?这就是我今天要分享的内容。JVM 内存分配性能问题谈到 JVM 内存表现出的性能问题时,你可能会想到一些线上的 JVM 内存溢出事故。但这

2020-09-08 15:20:25 151

原创 性能优化——优化垃圾回收机制

在 Java 开发中,开发人员是无需过度关注对象的回收与释放的,JVM 的垃圾回收机制可以减轻不少工作量。但完全交由 JVM 回收对象,也会增加回收性能的不确定性。在一些特殊的业务场景下,不合适的垃圾回收算法以及策略,都有可能导致系统性能下降。面对不同的业务场景,垃圾回收的调优策略也不一样。例如,在对内存要求苛刻的情况下,需要提高对象的回收效率;在 CPU 使用率高的情况下,需要降低高并发时垃圾回收的频率。可以说,垃圾回收的调优是一项必备技能。这讲我们就把这项技能的学习进行拆分,看看回收(后面简称

2020-09-08 14:37:17 89

原创 性能优化——深入JVM即时编译器JIT,优化Java编译

说到编译,我猜你一定会想到 .java 文件被编译成 .class 文件的过程,这个编译我们一般称为前端编译。Java 的编译和运行过程非常复杂,除了前端编译,还有运行时编译。由于机器无法直接运行 Java 生成的字节码,所以在运行时,JIT 或解释器会将字节码转换成机器码,这个过程就叫运行时编译。 类文件在运行时被进一步编译,它们可以变成高度优化的机器代码,由于 C/C++ 编译器的所有优化都是在编译期间完成的,运行期间的性能监控仅作为基础的优化措施则无法进行,例如,调用频率预测、分支频率预测、.

2020-08-28 10:57:01 189

原创 性能优化——JVM内存模型

为什么 JVM 在 Java 中如此重要? 首先你应该知道,运行一个 Java 应用程序,我们必须要先安装 JDK 或者 JRE 包。这是因为 Java 应用在编译后会变成字节码,然后通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分。JVM 不仅承担了 Java 字节码的分析(JIT compiler)和执行(Runtime),同时也内置了自动内存分配管理机制。这个机制可以大大降低手动分配回收机制可能带来的内存泄露和内存溢出风险,使 Java 开发人员不需要关注每个对..

2020-08-27 16:22:41 85

原创 性能优化——数据的强、弱一致性

前面提到了“强一致性”和“弱一致性”。很多同学留言表示对这个概念没有了解或者比较模糊,今天这讲加餐就来详解一下。说到一致性,其实在系统的很多地方都存在数据一致性的相关问题。除了在并发编程中保证共享变量数据的一致性之外,还有数据库的 ACID 中的 C(Consistency 一致性)、分布式系统的 CAP 理论中的 C(Consistency 一致性)。 下面我们主要讨论的就是“并发编程中共享变量的一致性”。 在并发编程中,Java 是通过共享内存来实现共享变量操作的,所以在多...

2020-08-27 14:45:37 180

原创 性能优化——用协程来优化多线程业务

近一两年,国内很多互联网公司开始使用或转型 Go 语言, 其中一个很重要的原因就是 Go 语言优越的性能表现,而这 个优势与 Go 实现的轻量级线程 Goroutines(协程Coroutine)不无关系。那么 Go 协程的实现与 Java 线程 的实现有什么区别呢? 线程实现模型 了解协程和线程的区别之前,我们不妨先来了解下底层实现 线程几种方式,为后面的学习打个基础。 实现线程主要有三种方式:轻量级进程和内核线程一对一相 互映射实现的 1:1 线程模型、...

2020-08-27 14:05:43 297

原创 性能优化——设置线程池大小

前面讲过“线程池的线程数量设置过多会导致线程竞争激烈”吗?今天再补一句,如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源。那么如何设置才不会影响系统性能呢? 其实线程池的设置是有方法的,不是凭借简单的估算来决定的。今天我们就来看看究竟有哪些计算方法可以复用,线程池中各个参数之间又存在怎样的关系。 线程池原理 开始优化之前,我们先来看看线程池的实现原理,有助于你更好地理解后面的内容。在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程...

2020-08-24 13:50:14 322

原创 性能优化——识别不同场景下最优容器

在并发编程中,我们经常会用到容器。今天我要和你分享的话题就是:在不同场景下我们该如何选择最优容器。 并发场景下的 Map 容器 假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下,我们是用一个哈希表来存储商品和销量键值对,然后使用排序获得销量前十的商品。在这里,哈希表是实现该功能的关键。那么请思考一下,如果要你设计这个功能,你会使用哪个容器呢?在前面,我曾详细讲过 HashMap 的实现原理,以及 HashMap 结构的各个优化细节。我说过...

2020-08-21 17:29:43 139

原创 性能优化——如何优化多线程上下文切换

如果是单个线程,在CPU 调用之后,那么它基本上是不会被调度出去的。如果可运行的线程数远大于 CPU 数量,那么操作系统最终会将某个正在运行的线程调度出来,从而使其它线程能够使用 CPU,这就会导致上下文切换。 还有,在多线程中如果使用了竞争锁,当线程由于等待竞争锁而被阻塞时,JVM 通常会将这个锁挂起,并允许它被交换出去。如果频繁地发生阻塞,CPU 密集型的程序就会发生更多的上下文切换。那么问题来了,我们知道在某些场景下使用多线程是非常必要的,但多线程编程给系统带来了上下文切换,从而增..

2020-08-21 15:00:46 404

原创 性能优化——哪些操作导致了上 下文切换?

我们常说“实践是检验真理的唯一标准”,这句话不光在社会发展中可行,在技术学习中也同样适用。在一次抢购活动中,系统重构上线后经历的第一次高并发考验,如期出现了大量超时报警,不过比我预料的要好一点,起码没有挂掉重启。 通过工具分析,我发现 cs(上下文切换每秒次数)指标已经接近了 60w ,平时的话最高 5w。再通过日志分析,我发现了大量带有 wait() 的 Exception,由此初步怀疑是大量线程处理不及时导致的,进一步锁定问题是连接池大小设置不合理。后来我就模拟了生产环境配置,对连接..

2020-08-21 13:45:01 134

原创 性能优化——乐观锁优化并行操作

Synchronized 和 Lock 实现的同步锁机制,这两种同步锁都属于悲观锁,是保护线程安全最直观的方式。 我们知道悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。那有没有可能实现一种非阻塞型的锁机制来保证线程的安全呢?答案是肯定的。今天我就带你学习下乐观锁的优化方法,看看怎么使用才能发挥它最大的价值。 什么是乐观锁 开始优化前,我们先来简单回顾下乐观锁的定义。 乐观锁,顾名思义,就是说在操作共享资源时...

2020-08-21 11:17:36 231

原创 性能优化——Lock 同步锁的优化方法

在 JDK1.5 之后,Java 还提供了 Lock 同步锁。那么它有什么优势呢? 相对于需要 JVM 隐式获取和释放锁的 Synchronized 同步锁,Lock 同步锁(以下简称 Lock 锁)需要的是显示获取和释放锁,这就为获取和释放锁提供了更多的灵活性。Lock 锁的基本操作是通过乐观锁来实现的,但由于 Lock 锁也会在阻塞时被挂起,因此它依然属于悲观锁。我们可以通过一张图来简单对比下两个同步锁,了解下各自的特点: 从性能方面上来说,在并发量不高、竞争不激烈的情况下...

2020-08-21 09:56:58 290

原创 性能优化——Synchronized同步锁的优化方法

在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。在 JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。 Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。 到了 JDK1.5 版本,并发包中新增了 Lock 接口来实现锁功能,它提供了与 Synchronized 关键字类似的同步功能,只是在使用时需要显示获取和释放锁。 Lock 同步锁是基于 Java 实现的,而 Syn..

2020-08-20 16:50:16 615

原创 性能优化——NIO的优化实现原理

Tomcat 中经常被提到的一个调优就是修改线程的 I/O 模型。Tomcat 8.5 版本之前,默认 情况下使用的是 BIO 线程模型,如果在高负载、高并发的场景下,可以通过设置 NIO 线程 模型,来提高系统的网络通信性能。我们可以通过一个性能对比测试来看看在高负载或高并发的情况下,BIO 和 NIO 通信性能 (这里用页面请求模拟多 I/O 读写操作的请求): 测试结果:Tomcat 在 I/O 读写操作比较多的情况下,使用 NIO 线程模型有明显的优势。...

2020-08-20 16:18:22 249

原创 性能优化——优化RPC网络通信

上一讲中,我提到了微服务框架,其中 SpringCloud 和 Dubbo 的使用最为广泛,行业内也一直存在着对两者的比较,很多技术人会为这两个框架哪个更好而争辩。 我记得我们部门在搭建微服务框架时,也在技术选型上纠结良久,还曾一度有过激烈的讨论。当前 SpringCloud 炙手可热,具备完整的微服务生态,得到了很多同事的票选,但我们最终的选择却是 Dubbo,这是为什么呢? RPC 通信是大型服务框架的核心我们经常讨论微服务,首要应该了解的就是微服务的核心到底是什么,这样我...

2020-08-19 17:41:40 186

原创 性能优化——避免使用Java序列化

当前大部分后端服务都是基于微服务架构实现的。服务按照业务划分被拆分,实现了服务的解偶,但同时也带来了新的问题,不同业务之间通信需要通过接口实现调用。两个服务之间要共享一个数据对象,就需要从对象转换成二进制流,通过网络传输,传送到对方服务,再转换回对象,供服务方法调用。这个编码和解码过程我们称之为序列化与反序列化。 在大量并发请求的情况下,如果序列化的速度慢,会导致请求响应时间增加;而序列化后的传输数据体积大,会导致网络吞吐量下降。所以一个优秀的序列化框架可以提高系统的整体性能。我们知道,..

2020-08-19 16:27:35 396

原创 性能优化——如何解决高并发下I/O瓶颈

提到 Java I/O,相信你一定不陌生。你可能使用 I/O 操作读写文件,也可能使用它实现 Socket 的信息传输…这些都是我们在系统中最常遇到的和 I/O 有关的操作。 我们都知道,I/O 的速度要比内存速度慢,尤其是在现在这个大数据时代背景下,I/O 的性 能问题更是尤为突出,I/O 读写已经成为很多应用场景下的系统性能瓶颈,不容我们忽视。 今天,我们就来深入了解下 Java I/O 在高并发、大数据业务场景下暴露出的性能问题,从 源头入手,学习优化方法。 什么是 I/...

2020-08-19 13:36:16 905

原创 性能优化——HashMap的设计与优化

常用的数据结构 我在 05 讲分享 List 集合类的时候,讲过 ArrayList 是基于数组的数据结构实现的, LinkedList 是基于链表的数据结构实现的,而我今天要讲的 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构,这样也有助于你更好地理解后面地 内容。 数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1), 但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表:一种在物理存储单元上非连续、...

2020-08-19 11:09:21 152

原创 性能优化——Stream如何提高遍历集合效率?

什么是 Stream?现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。但在后台管理员审核订单时,他们需要将各个数据源的数据查询到应用层之后进行合并操作。例如,当我们需要查询出过滤条件下的所有订单,并按照订单的某个条件进行排序,单个数据源查询出来的数据是可以按照某个条件进行排序的,但多个数据源查询出来已经排序好的数据,并不代表合并后是正确的排序,所以我

2020-08-14 17:19:58 848

原创 性能优化——ArrayList与LinkedList的使用优化

初识 List 接口在学习 List 集合类之前,我们先来通过这张图,看下 List 集合类的接口和类的实现关系:我们可以看到 ArrayList、Vector、LinkedList 集合类继承了 AbstractList 抽象类,而AbstractList 实现了 List 接口,同时也继承了 AbstractCollection 抽象类。ArrayList、Vector、LinkedList 又根据自我定位,分别实现了各自的功能。ArrayList 和 Vector 使用了数组实现

2020-08-13 17:59:23 528

原创 性能优化——慎重使用正则表达式

什么是正则表达式?正则表达式是计算机科学的一个概念,很多语言都实现了它。正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。构造正则表达式语法的元字符,由普通字符、标准字符、限定字符(量词)、定位字符(边界字符)组成。详情可见下图:正则表达式引擎正则表达式是一个用正则符号写出的公式,程序对这个公式进行语法分析,建立一个语法分析树,再根据这个分析树结合正则表达式的引擎生成执行程序(这个执行程序我们把它称作状态机,也叫状态自动机),用于字符匹配。而这里的正

2020-08-12 10:36:47 244

原创 性能优化——字符串(String)

String 对象是我们使用最频繁的一个对象类型,但它的性能问题却是最容易被忽略的。String 对象作为 Java 语言中重要的数据类型,是内存中占据空间最大的一个对象。高效地使用字符串,可以提升系统的整体性能。接下来我们就从 String 对象的实现、特性以及实际使用中的优化这三个方面入手,深入了解。在开始之前,我想先问你一个小问题,也是我在招聘时,经常会问到面试者的一道题。虽是老生常谈了,但错误率依然很高,当然也有一些面试者答对了,但能解释清楚答案背后原理的人少之又少。问题如下:通

2020-08-12 10:07:47 139

原创 性能优化——如何制定性能调优策略

总结一下就是“测试 - 分析 - 调优”三步走。性能测试攻略性能测试是提前发现性能瓶颈,保障系统性能稳定的必要措施。下面我先给你介绍两种常用的测试方法,帮助你从点到面地测试系统性能。1. 微基准性能测试微基准性能测试可以精准定位到某个模块或者某个方法的性能问题,特别适合做一个功能模块或者一个方法在不同实现方式下的性能对比。例如,对比一个方法使用同步实现和非同步实现的性能。2. 宏基准性能测试宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标。首先看测试环境,我们需

2020-08-12 09:34:29 287

空空如也

空空如也

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

TA关注的人

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