java object多大 java对象内存模型 数组有多长(四)已经访问的对象记录优化
800*0.8*8*1400w = 66.76GB
光存那些Double指针花了那么多
优化方案:
1 Double(Long Integer)类型除了0,默认未访问,允许重复计算
String类型length超过50默认未访问,允许重复计算
2 借鉴 ip白名单算法(pdd活跃用户) 存对象地址hash
hashcode & System.identityHashCode 大约10W个对象后开始每1W个重复1-3次
直接采用2,不用1,因为redis bitmap 稀疏则浪费内存
有一点细微区别,ip地址最大值unsigned int 最大值 是2^32-1,包括0可需要2^32个byte,而hashcode最大值是java int 最大值2^31-1,包括0指需要2^31个byte
如果用内存byte[]数组,则还是4g/8=512M 长度,如果用redis bitmap则可以少点
3 优化结果 66.76GB->512MB,承担万分之三的误差
4 有问题
如果要这个方案准确,必须确保期间不gc,因为gc后内存地址会变?
如果要继续使用,应尽量保证gc次数小?
问题归结为identityhashcode会不会变?