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会不会变?

 

posted on 2024-06-17 11:27  silyvin  阅读(1)  评论(0编辑  收藏  举报