这是这半年来,在安全公司处理千亿条数据的经验。(数据太大,稍微写的优点问题,整个服务就崩,所以代码很谨慎,也遇到了很多问题,此文作为总结)
1.能用Map,就用Map
原因:Map底层是红黑树,尤其是对比2个集合中的内容,continueKey的速度比数组快9-10倍左右
2.SQL优化,对于我们大数据工程师来说,最熟悉,而且网上很多优化方案,最常用,最有效的批量插入,用拼接insert values(data1,data2)。查询建立索引,超过400-500W的数据建立分区。其他代码,保证遍历最小(总之,就是写好SQL逻辑后,思考怎么样,才能更加优化,慢慢改善,我喜欢建立小表,小列,做测试,逐步改善)
3.内存调优,网上说什么加快GC回收,设置为null,尽量用1个变量,其实我想说,这些都是鸡助。网上的东西要试过才知道,最好用的,效果最强的还是,分步骤,用结果集进行运行。不要在一个for循环里面套其他for循环,一次性处理完,这样内存就会淤积,并且不会被释放,而且GC也无法按整个数组回收,最后会导致CPU全被GC占用,内存也会撑满JAVA的老年代(持久带,这个带的东西堆爆就会报内存溢出)。查询哪个代码溢出,哪个耗内存,你更要分步骤写代码,按逻辑来区分,因为机器运行的太快,你不好看出内存消耗。及时用IDEA自带的visul GC也很难看出来。
分步骤,你就能打断点,然后边看visul GC边DEBUG,就能知道是哪个模块消耗的大,才去看他的代码进行优化。
4.硬盘优化,对外提供的服务,一定要使用jar将日志进行分块。推荐使用Log4j
以上就是我的内存法则。(半年来的血的教训)以上全是为大数据量的条件,如果你任务小,数据少,可以不参照这个方法,因为太小了,体会不到速度上的优化。



