Java 代码性能优化之路

一、前言最近一直忙着参与公司的新项目开发,由于临期上线,正在对系统进行性能压测,在这个过程中,发现一些代码有性能优化的空间。因此决定写一篇文章,把本次以及今后,遇到的性能优化的 case 都记录下来,希望对大家们的编码水平能够有所帮助。 二、Java 基础2.1 字符串拼接在我们的系统中,存在着大量的缓存,这些缓存的 key 值根据请求参数的不同而拼接起来,如下代码所示: public cl...

首次排查 OOM 实录

一、前言距离上篇文章更新已经一月有余,之所以一直没更新一是工作最近比较忙,二是感觉产出不了什么对自己和他人有价值的文章。因此这段时间,主要的空闲时间在学习技术和写 GitHub,博客这边就暂时落下了。 本篇文章的落成更像是一篇笔记,而不是博客。因为在一年的工作后,首次碰上了 OOM 问题,虽然导致的原因比较简单,但也算是值得纪念的,哈哈。 二、问题复现问题原因和 Disruptor 相关,如...

高性能 Disruptor——消除伪共享

一、CPU Cache存储设备往往是速度越快价格越昂贵,速度越快价格越低廉。在计算机中,CPU 的速度远高于主存的速度,而主存的速度又远高于磁盘的速度。为了解决不同存储部件的速度不对等问题,让高速设备充分发挥性能,引入了多级缓存机制。 为了解决内存和 CPU 的速度不匹配问题,相继引入了 L1 Cache、L2 Cache、L3 Cache,数字越小,容量越小,速度越快,位置越接近 CPU。...

不可不说的 Java “锁”事

一、前言Java 提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自 JDK 8和 Netty 3.10.6)和使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java 中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出...

Java 并发编程——线程池的异常处理机制

一、前言1.1 文章起因这篇文章的起因来源于一个 BUG,这个 BUG 和上篇文章《Java SynchronizedSet 线程不安全之坑》 有点关系。简单来说,就是在线程池中执行任务,任务本身未做异常处理,导致出现异常后任务停止。 出错的原因来自对 Collections.synchronizedSet(new HashSet<>()) 的线程不安全访问,抛出了 Concur...

Java SynchronizedSet 线程不安全之坑

一、前言一般而言,想要构造出线程安全的 Set,我们会使用 Collections.synchronizedSet 方法,如下所示。 Set<User> set = Collections.synchronizedSet(new HashSet<>()); 但这并不意味着,你可以安全的使用该集合的任何方法,如果没有仔细的了解过其实现的话,一不小心就会踩进坑中。最近我在...

Navicat Premium 15 安装与激活

偶然发现 Navicat 已经更新到了15 了,今天就来把 Navicat 升级一下。Navicat15 的激活和 Navicat12 一致,可以参考《Navicat Premium 12.0.27 安装与激活》。 首先前往官网自行下载 Navicat15 的安装包。然后下载激活工具: Download For CSDN Download For BaiduPan[6gwe] 以下是重点...

Parallel Stream 的错误实践

一、前言Java8 Stream 流的出现,极大的简化了业务需求中对集合数据的加工处理操作。虽然好用,但是一旦使用不当,也会带来意想不到的结果,本文记录使用 Parallel Stream 的错误实践。 List<Object> sourceList = ...; List<Object> list = new ArrayList(); sourceList.str...
Java

详解 Spring 定时任务的调度方式

在 Spring 中,我们可以使用 @Scheduled 方便的进行定时任务的执行,其支持以下三种调度方式:Cron、FixedDelay、FixedRate。下面分别介绍在标准模式下和异步模式下这三种调度方式的不同。 一、标准模式1.1 示例准备创建一个 SpringBoot 初始程序,依赖包只需要引入 spring-boot-starter-web 即可: <dependencie...

2019 年终总结

自从进入大学开始,总觉时间开启了快进模式,一年一年不知不觉就过去了,转瞬又是新的一年的开始。 2020 是一个特殊的年份,在不少电影中它是未来的代名词,在国家的红头文件中它是消灭贫困人口的 DeadLine。哈哈,庆幸自己还没有被消灭。 言归正传,2019 年对我来说是一个特殊的年份,因此 2020 年的第一篇博文就来总结下 2019 年吧。 一、学生身处高考地狱难度的江苏省,机缘巧合,考入...

gRPC 在 Java 中的入门实例

一、前言经过前面三篇 Protobuf 相关文章的学习,相信大家已经对 Protobuf 有所掌握。前文说过, ProtoBuf 很适合做数据存储或 RPC 数据交换格式。可以用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 本节将介绍在 Java 中如何使用 gRPC 和 Protouf。gRpc 也是 Google 推出的 RPC 框架,由于师出同门,Pro...

Protobuf 学习手册——编码篇

一、编码规范Google 官方提供了 Protobuf 的编码规范,通过遵循这些规范,可以使 Protobuf 消息定义及其相应的类保持一致并易于阅读。 Protobuf 编码规范可能随着时间推移而发生变化,对于既有项目,应当保持编码规范的一致性,而不需盲目保持最新的编码规范。但是对于全新项目,应当遵循官方的编码规范,可以点击这里查阅官方最新的编码规范。 1.1 Override 一行不超过...