问题:从oracle查询1800w数据,根据尾号截取,加载到内存,取表数据四个字段,其中包含手机号、两个10位中文字段加一个日期,
用jedisCluster进行管道操作psetStr
当程序加载到第五批次左右,程序宕机,通过重启,重新加载数据,配合
ps -ef|grep 查询进程号,jstat -gcutil 进程id 2000,top查看当前内存占用(-c查看执行脚本)、free -m 查看机器可用内存,几个命令,分析出当前机器空闲内存不足
修改:调整程序启动的最大堆内存参数、修改程序,采用后两位尾数查询方式,减少分页量的大小,从10个批次扩充到100个批次,配合多线程处理
后续问题:由于成功加载了redis数据,导致redis数据内部占用内存较大,使其他程序运行时宕机,解决:将redis下的dump文件
top 指令:如果swap的uesd变化频繁,说明内存可能不足了,free少,不代表真的不够用了,mem的used表示,之前使用的内存,使用之后不会立即返回free
堆、栈分配的内存,如果没有使用是不会占用实存(RES)的,只会记录到虚存(VIRTT)。
如果程序占用实存比较多,说明程序申请内存多,实际使用的空间也多。
如果程序占用虚存比较多,说明程序申请来很多空间,但是没有使用。
比如可能会有【程序虚存300G+, 实存只有不到15G】
gcstat -gcutil 进程号
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间