use*_*587 4 java uuid out-of-memory
我正在使用大量的Java存储UUID到HashMap一行UUID.toString().由于数据量巨大,很快就会抛出OutOfMemoryError.现在我正在考虑一种紧凑的方式来表示UUID,最好是类似的东西long,然后我可以轻松地UUID用该long表示重建.这可能吗?
UUID基本上是一个数字,但它是一个128位的数字,是java long的两倍.您可以使用BigInteger(可能不比将UUID存储为字符串更节省空间),或者您可以将UUID封装在包含两个long的对象中 - 一个用于前64位,一个用于最后64位.
给定UUID 550e8400-e29b-41d4-a716-446655440000,您需要创建两个长整数0x550e8400e29b41d4,一个包含数字,另一个包含数字0xa716446655440000.
我正在使用大量的Java存储
UUID到HashMap一行UUID.toString().
所以你的意思是HashMap<String, MyObject>?
与之HashMap<UUID, MyObject>相比,通过存储UUID本身可以节省空间HashMap<String, MyObject>.A UUID比空间占用更少的空间String(两个long值变为16个字节而不是char[36]72个字节,这样可以节省大约80%的空间).
如果改变这还不够,那么考虑这些UUID值是否在JVM中是重要的.如果ID只需要对于单个进程是唯一的(您是保存HashMap到磁盘还是在 Java进程之间共享它?),那么您可以使用,int因为无论如何HashMap都不能大于Integer.MAX_VALUE任何大小.所以不是HashMap<UUID, MyObject>,你有HashMap<Integer, MyObject>.更好的是,Short如果您的对象少于2 16个,则可以使用,从而节省更多空间.但是,如果你得到一个OutOfMemoryError,我怀疑你可能有超过65536个对象.
最后,如果所有其他方法都失败了,请为此 JVM分配更多内存,如此问题所示.