老废物乐园

var 局部变量类型推断:用还是不用

升级 JDK 11 之后,代码里开始出现 var 2 月初我们把一个服务从 JDK 8u272 升到了 JDK 11.0.10。升级本身没什么好说的,倒是有个副作用:有同事开始用 var 了。 第一次在 review 里看到这段代码,我打了回退: var result = orderService.

Administrator Administrator 发布于 2021-02-06

Optional 与 Stream 的性能代价实测

review 时和同事吵了一架 1 月中旬做 code review,我写了一段统计订单金额的代码: long total = orders.stream() .mapToLong(Order::getAmount) .sum(); 同事评论:"Stream 有性能

Administrator Administrator 发布于 2021-01-21

HashMap 扩容死链:JDK 1.7 那个著名的 CPU 100% 问题

那个 CPU 100% 的现场,和我熬夜复现的死循环 12 月初,隔壁组的老服务(跑在 JDK 7 上的一套结算系统,JDK 一直没升)CPU 突然跑满。监控上 CPU 从 30% 直接顶到 100%,而且是持续的,降不下来。接口全部超时,重启之后几分钟又上去。 我过去帮忙看,抓了现场。这篇记录整个

Administrator Administrator 发布于 2019-12-08

CompletableFuture 异步编排实战

商品详情页 800 毫秒,我把它改成了 180 毫秒 10 月底做性能优化,商品详情页是重点。这个页面要聚合 6 个数据源,原来的代码是串行调的: public ProductDetailVO getDetail(Long skuId) { ProductVO product = produ

Administrator Administrator 发布于 2019-10-28

Stream 并行流慎用:一次 parallelStream 导致的数据错乱

对账少了 3.7 万元:一行 parallelStream 惹的祸 10 月 8 号,财务来找我,说 9 月 30 号的日报表金额对不上,系统算出来 148.2 万,实际银行流水 151.9 万,少了 3.7 万。而且奇怪的是,同一个任务重跑一遍,出来的数字还不一样:第二次是 149.6 万。 同样

Administrator Administrator 发布于 2019-10-12

Optional 的正确用法,别把它当成判空工具

review 的时候,我看到一段"用 Optional 写的判空" 5 月底做代码评审,看到同事写了这么一段: Optional<User> userOpt = userMapper.findById(userId); if (userOpt.isPresent()) { User user

Administrator Administrator 发布于 2019-06-11

Lambda 表达式与函数式接口:从会用到了解实现

同事说"Lambda 就是匿名内部类的语法糖" 三月底做代码评审,我提了个建议说"这里可以用 Lambda 简化"。同事回了句:"Lambda 不就是匿名内部类的语法糖吗,性能还差一点,没必要改。" 我说不上来哪里不对,但记得在哪看过说 JDK 8 的 Lambda 底层用的是 invokedyna

Administrator Administrator 发布于 2019-04-02

Java 8 日期时间 API 全面迁移:LocalDateTime 实战

统计三月的订单,查出来是四月的 3 月中旬接了个老项目的改造任务,其中一块是给运营加个按月导出订单的功能。我写了个 SQL 拼时间的工具类,自测的时候点了三月,导出来的数据全是四月的。 当时那段代码: public static Date monthStart(int year, int month

Administrator Administrator 发布于 2019-03-14

注解处理器与自定义注解:手写一个参数校验

一个 DTO 我写了 47 行 if 年前接手了一个商户入驻的接口,参数对象有 12 个字段,原来的校验代码长这样: public Result<?> apply(MerchantApplyDTO dto) { if (dto.getMerchantName() == null || dto

Administrator Administrator 发布于 2019-01-29

ConcurrentHashMap 为什么比 synchronizedMap 快

压测报告里,那根最扎眼的柱子 一月初做订单履约服务的性能优化,主管让我把瓶颈点列一遍。用 JMH 跑了几个核心组件的基准测试,结果里最刺眼的是本地缓存这一项:同样 8 线程、读写比 9:1,Collections.synchronizedMap(new HashMap<>()) 的吞吐是 2.1M

Administrator Administrator 发布于 2019-01-11