性能优化随想录

大概是在2020年年初的时候,微信上线了「微信圈子」这个功能,产品和「知识星球」比较像,我第一时间注册了「性能优化」这个圈子,疫情期间也发表了几十个动态,后面由于工作太忙也就没有精力去维护了。2021年5月28日,微信圈子发布公告表示,因业务发展方向调整,将于2021年12月28日正式停运。

我当时的圈子介绍(匿了):

提供新鲜、扎实的性能优化技巧,分享一线性能案例及调优经验,致力于构建最丰富、最有含金量的软件调优知识体系。

阅读更多

原创重点文章集

这里整理了我的一些原创性文章。文章都是一个字一个字敲出来的,字数多的有近3w的,少的也有几千字,稍微整理了发现有几十篇,真是出乎意料,希望以此为契机,后面能沉淀更多。

公众号文章

下面这几篇是发表在阿里技术公众号上的文章。

  1. 90%的人会遇到性能问题,如何用1行代码快速定位?
  2. 如何回答性能优化的问题,才能打动阿里面试官?
  3. A Handy Guide to Optimizing Your Java Applications
  4. 底层原理,垃圾回收算法是如何设计的?
  5. 前沿实践,垃圾回收器是如何演进的?
阅读更多

Java 中 Null 的设计并不是一个错误

我使用 Java 开发项目很多年了,了解如何用它来开发大型的项目。在工业界,我看到大家做了很多努力来规避 NullPointerException(NPE),对其胆战心惊。NPE 的发明人 Tony Hoare 在 2009年承认:「null 引用的设计是一个十亿美元的错误」。

我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我的目的是确保所有引用的使用都是绝对安全的,编译器会自动进行检查。但是我未能抵御住诱惑,加入了null引用,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。近年来,大家开始使用各种程序分析程序,比如微软的 PREfix 和 PREfast 来检查引用,如果存在为非 null 的风险时就提出警告。更新的程序设计语言比如 Spec# 已经引入了非 null 引用的声明。这正是我在1965年拒绝的解决方案。” —— 《Null References: The Billion Dollar Mistake》托尼·霍尔(Tony Hoare),图灵奖得主。

阅读更多

合理使用设计模式

半吊子水平的设计模式理解 + 糟糕的抽象 + 多重继承 = 灾难。

最近接触很多项目,深感设计模式给项目带来的痛苦,比如:

  1. 不必要的接口。
  2. 不必要的池化。

首先是接口。设计合理的接口对程序员的能力要求很高,这需要很完备的顶层设计,建模能力、前瞻能力都需有。可我在现实中看到更多的是:接口更多被用来当做表征 feature 了(虽然这也是接口表达的初衷),不管什么业务类,都会先去做如下定义:

阅读更多

使用Spring Boot快速搭建微服务

使用 Spring Boot 已经两年多了,我从刚开始的抵触,到积极拥抱,再到现在进行若干反思,这中间积累了一些使用心得和一些个人的思考。本文将对 Spring Boot 做一个整体的概述,阅读完文章,你将会了解到下面这些:

  1. Spring Boot 是什么
  2. Spring Boot 快速上手
  3. Spring Boot 的优势
  4. Spring Boot 的不足
  5. Spring Boot 实践经验

注意:下面的介绍中,将不区分 应用服务(当然它们本质上是有区别的),都指的是一个 Spring Boot 项目,此外,除非特别说明,下面的包依赖管理工具均指的是 maven。

阅读更多

Java并发编程中的核心要点

Synchronized 的原理

Synchronized 修饰方法块

JVM 对方法块同步是通过 monitorentermonitorexit 两个比较重要的指令来实现的。任何对象都有一个 monitor(这里 monitor 指的就是锁) 与之关联,当且仅当一个 monitor 被持有后,它将处于锁定状态。

阅读更多

ZGC:低延迟的垃圾回收器

ZGC 是 Oracle 内部研发的一款新的垃圾回收器,最大的宣传点是低延迟(Low Latency)。根据近期的消息,该项目将会托管给 OpenJDK,由后者开发完善。

ZGC 特性一览

ZGC 的设计目标

  • TB 级别的堆内存管理;
  • 最大 GC Pause 不高于 10ms
  • 最大的吞吐率(Throughput)损耗不高于 **15%**;

关键点:GC Pause 不会随着 堆大小的增加 而增大。

阅读更多

ClassLoader类加载过程浅析

类加载概述

概述

定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。

类加载分为 加载(Loading)验证(Verfication)准备(Preparation)解析(Resolution)初始化(Initialization)使用(Using)卸载(Unloading) 这 7 个阶段。

阅读更多

《SpringBoot揭秘:快速构建微服务体系》读书笔记

春节假期过后,为了消除假期综合征,就花了一两天读了这本《SpringBoot 揭秘:快速构建微服务体系》,简单的感悟如下:

  1. 整本书内容不多,前三章关于 Springboot 的论述 不错,后两章(Scala + SpringBoot)有狗尾续貂之嫌;
  2. 看得出来作者还是希望表达一些技术理念的,但很多地方没有展开,所以整本书给人一种泛泛而谈的感觉;
  3. 这本书其实可以浓缩为3~5篇博客。

如果没有接触过 Springboot 和微服务,那么这本书还是值得一读的。

阅读更多

SpringBoot 启动 Scala 项目:NoClassDefFoundError

今天尝试将一个 scala 项目转为 springboot 项目时,出现了无法找到主类的报错,现象如下:

  1. 在 IDEA 里面新建 SpringBoot 启动配置,运行后启动成功。
  2. 在 POM 目录 执行 mvn spring-boot:run 运行项目,启动成功;
  3. 线下环境 通过 java -jar jar_name.jar,运行成功;
  4. 线上脚本启动时(事实上也是运行的 java -jar…),抛出异常:
阅读更多

:D 一言句子获取中...