我们游戏中数据包比较大时,就使用7z进行压缩后,再传给客户端。
最近压力测试时,发现一个坑,查了几天,才定位是使用的7z库的问题。
java中没有官方的7z库,也没有开源组织维护,只有一个作者自己写的7z库,最初没发现问题。
这次查看7z的源码,发现里面每次压缩时会分配16M内存,大量的分配释放内存导致整个jvm都被卡了。
没办法改为gzip库,来避免掉了这种问题。
关于压缩实际还有很多潜力可以挖掘。
1、比如:压缩解压每个数据块中有crc32校验,我们游戏中使用,可以直接去掉这部分计算。
2、比如:既然不使用crc32校验证,那crc32占用的那几个字节就可以省掉。
3、比如:既然前后端都知道使用相同的压缩算法,就可以把压缩文件的格式文件头去掉。
4、比如:每次压缩解压都会申请byte[],我们可以使用threadlocal复用byte[],来减少byte[]的分配。
0 条评论。