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

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

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

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

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

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

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

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

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

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

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

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

计算机三级信息安全技术

考试大纲基本要求1. 了解信息安全保障工作的总体思路和基本实践方法2. 掌握信息安全技术的基本概念、原理、方法和技术3. 熟练掌握计算机网络安全、系统软件安全和应用软件安全的基本知识和实践技能4. 掌握信息安全设备的安装、配置和使用的基本方法5. 了解信息系统安全设施部署与管理基本技术6. 了解信息安全风险评估和等级保护原理与方法7. 了解信息安全相关的标准、法律法规和道德规范考试内容一、信息安全保障概述1. 信息安全保障的内涵和意义信息安全保障的总体思路和基本实践方法二、信息
分类: 其他 发布时间: 09-08 23:42 阅读次数: 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

性能优化——JVM内存模型

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

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

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

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

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