G1 gc
1.garbage first是指内存分很多小区域,每个区域可以标记垃圾比例,回收的时候找比例高的回收
2.为啥能控制停顿时间?能自动调整参数是一个原因,还有一个原因是能控制回收分区的数量
3.为啥能解决碎片?同样是因为分区,回收的时候是把一些分区挪移到其它的分区,同时做了压缩。核心创新还是分区
java性能权威指南的几个点
1.TLAB线程本地对象分配区适当调整可能会优化对象分配速度
2.linux huge使用加快page寻址,避免page换出
3.默认开启指针压缩但最大只能支持到32g,一般内存不要超过这个值
4.java8 parallelStream 会做自动并行化,使用恰当可以优化性能
5.@Contended可以对齐cache line,而不用自己去推算cpu cache line大小
关于mmap的性能
1.mmap快在不用每次读写都拷贝内存和系统调用
2.写的时候尤其是顺序写,如果每次写入的大小比较大,内存拷贝和系统调用的优势在实际io面前就没那么大了,所以mmap和fwrite的性能实际差距不太大
3.一般的建议是append的方式写文件用fwirte,因为mmap resize需要反复撤销和创建mmap这个成本较高没必要。不过如果一开始就知道文件大小而且很大的情况下用mmap也可以。如果读比较多就比较适合用mmap。比较经典的例子就是kafka和metaq,kafka只有索引用了mmap而metaq是索引和log文件都用了mmap。可以看看linus大神怎么说https://stackoverflow.com/questions/35891525/mmap-for-writing-sequential-log-file-for-speed
io_uring
1.简单描述就是有submission queue和completion queue两个队列是用户态和内核态共享,所以用户态提交io请求由内核线程负责处理sq并返回cq,整个过程没有系统调用
没有评论:
发表评论