前言
最近突然收到了系统推送消息告警。打开一看,好家伙!直接 kafka 堆积超过了 100w 条数据,就差基础服务的人找上门来了。
经过简单的一系列排查,终于找到是代码中 Orika 工具使用不当导致内存增加、cpu 过高导致消费变慢。
下面记录下排查的思路
最近突然收到了系统推送消息告警。打开一看,好家伙!直接 kafka 堆积超过了 100w 条数据,就差基础服务的人找上门来了。
经过简单的一系列排查,终于找到是代码中 Orika 工具使用不当导致内存增加、cpu 过高导致消费变慢。
下面记录下排查的思路
JDK1.8在Windows系统上MMap后文件IO关闭无效
最近在开发个小东西,大量涉及了文件的操作。当然这种事情很简单嘛,最基本的打开个文件流进行写不就行了?
1 |
|
我本来也是这样想的,可是当你执行这条语句file.delete()
的时候居然返回的是false,删除失败?why?我不是明明已经将文件流关闭了嘛?接下来就是疯狂找原因了。
FileChannel和MMAP的使用以及benchmark
最近弄了一些小东西,发现它们都有个共同点:对文件的操作。无论是文件的快速写入又或者是大文件的读取等,都要求我们对文件IO有很深的了解。不同文件大小的读写操作,应该选择哪种方式能达到最快的效果?接下来我们看看Java中常见的文件操作方式以及它们在读写大文件时各自的效果。
7月份的时候参加了一个阿里天池的性能优化比赛,后面在复赛的时候因为是集群场景,需要考虑各个节点之间数据的一致性,本来想自己实现的,但奈何时间太短(ps: 太菜了😭),最终还是找了市面上成熟的中间件来实现(Ignite)。这不,还是手痒,自己实现一个基于Raft的一致性服务。
Github:zraft
个人博客:zhaommmmomo
扩容规则:底层是System.arraycopy()这个方法
懒加载机制:ArrayList初始化的时候并没有直接给数组分配容量,而是使用的一个空数组进行赋值,只有当第一次增加的时候才会真正的给数组进行容量分配。这样是为了防止用户初始化后没有进行使用导致内存的浪费。(只有用户调用无参构造方法的时候才是懒加载,其他两个构造函数是分配的另外一个空数组)
想必各位都对线程这个词不陌生,我们都知道Java中可以通过Thread、Rannable、Callable和线程池来创建一个线程。但是一个线程的创建、运行到结束到底是一个什么样的过程呢?我们以一段代码为入口点来看看Java到底是如何弄的线程。
1 |
|