仅仅记录工作中的点滴
集合优化
- 如果预知集合长度,尽量初始化集合的时候集合长度。(集合扩容时,底层会有数据复制,当内存不足,还会有GC帮助清理,直至没有足够的空间)
- 小数据量时,使用
for i比Stream快。(小于1000都可以,你可以永远相信for i) - 不知道个数的时候,可以使用LinkedList。(我相信很少有业务去访问集合数组的随机下标的数据吧)
- 两个集合求交集,小集合驱动大集合。
- 对于一些与业务线程处理无关的操作,可以前置。比如说 策略排序,字段映射。
线程
- 关于线程池,这个需要结合实际情况,如果系统瓶颈就是线程资源不够,应该想着提升硬件能力,而使用多线程也是无意义的。
- 关于并发工具类的使用,CountDownLatch、Semaphore、CyclicBarrier。
- 使用
CompletableFuture代替Future,前者有更加丰富的API,包括Task组合,尤其在多个任务有关联关系的时候尤为合适。 - 尽量初始化核心线程,避免影响到用户线程。
- 创建线程池后,记得增加
ShutDownHook。
其他
- 代码运行慢,会和
Jit相关。还有系统刚启动,有些类的初始化并没有做完,所以通常刚发布完成的系统,前几个请求会很慢。(Jit 建议细细琢磨) - 尽量使用基本数据类型。(基本数据类型会在栈上分配)
- 尽量使用循环,拒绝递归。(方法栈有自己的深度,受栈帧大小影响。1. 易OOM 2. 每调用一个方法jvm创建栈帧和方法安全检测增加耗时)