性能优化随想录

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

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

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

阅读更多

性能优化总结之内存篇

内存调优核心点:

  1. 保证应用程序的热点数据放到内存中;
  2. 尽量减少换页和交换。

1 缓存基础

1.1 内存中的Buffer和Cache

BufferCache 的设计目的,是为了提升系统的 I/O 性能。它们利用内存,充当起慢速磁盘与快速 CPU 之间的桥梁,可以加速 I/O 的访问速度。可以使用 vmstat 命令查看这两个值的大小。

阅读更多

合理使用设计模式

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

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

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

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

阅读更多

ZGC:低延迟的垃圾回收器

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

ZGC 特性一览

ZGC 的设计目标

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

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

阅读更多

Java 内存溢出问题总结

这里总结一下在 Java 服务中,常见的 内存溢出(OutOfMemoryError)问题及解决思路。

堆溢出

报错信息:java.lang.OutOfMemoryError: Java heap space

原因

  1. 堆中(新生代和老年代)无法继续分配对象了;
  2. 某些对象的引用长期被持有没有被释放,垃圾回收器无法回收;
  3. 使用了大量的 Finalizer 对象,这些对象并不在 GC 的回收周期内。

解决方法

阅读更多

CMS垃圾回收启动的时机

CMS(Concurrent-Mark-Sweep)是 Hotspot 虚拟机中目前使用最广泛的老年代垃圾回收器,在响应时间这个GC 指标上表现优异。CMS 在什么时机开始工作?触发的条件都有哪些?今天我们可以从 OpenJDK 中 CMS 这一块的实现来分析一下,该实现主要位于concurrentMarkSweepGenerationConcurrentMarkThread 这两个类中。

阅读更多

JVM中的垃圾回收策略

Java和C++之间有一堵由内存分配和垃圾回收技术所围成的高墙,在里面的人想出来,不在里面的人想进去。C++程序员必须承担每一个对象生命开始到终结的责任,而Java程序员无须为每一个new 出来的对象执行 delete/free 操作,不容易出现内存泄漏和内存溢出问题。

阅读更多

GC日志时间分析: user + sys < real

背景

在GC日志里,一条完整的GC日志记录最后,会带有本次GC所花费的时间,如下面这一条新生代GC:

[GC [DefNew: 3298K->149K(5504K), 0.0053498 secs] 3298K->3221K(9600K), 0.0053750 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

注意到日志中时间分为了三块:usersys,和 real,三者的区别和含义如下:

  • real:指的是在此次GC事件中所花费的总时间;
  • user:指的是CPU工作在用户态所花费的时间;
  • sys:指的是CPU工作在内核态所花费的时间。
阅读更多

Jstat 常用命令

常用命令

  1. jstat -gc pid
  2. jstat -gccapacity pid
  3. jstat -gcutil pid
  4. jstat -gcnew pid
  5. jstat -gcnewcapacity pid
  6. jstat -gcold pid
  7. jstat -gcoldcapacity pid
  8. jstat -gcpermcapacity pid
  9. jstat -class pid
  10. jstat -compiler pid
  11. jstat -printcompilation pid
阅读更多

性能诊断零星知识点

  1. 火焰图既是一个开源工具,也是一种类型的图片。作为一个二维图片,火焰图的X轴代表采样总量,而Y轴代表栈深度。每个框就代表了一个栈里的函数,其宽度代表了所占用的CPU总时间。因此,比较宽的框就表示该函数运行时间较慢或被调用次数较多,从而占用的CPU时间多。通过火焰图,相关设计或分析人员就可以轻松观察到各个应用占用CPU的情况。

    参考:CPU Flame Graphs

阅读更多

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