Java中的巨大字符串表

Java中的巨大字符串表,java,string,Java,String,我有一个关于在应用程序内存中存储大量字符串的问题。我需要从文件中加载并存储大约500万行,每个行最多255个字符(URL),但大部分是~50个字符。有时我需要搜索其中一个。是否可以在~1GB内存上运行此应用程序 意志 最新的JVM默认支持-XX:+UseCompressedStrings,它在内部存储仅使用ASCII作为字节[]的字符串 列表中有几GB的文本不是问题,但从磁盘加载可能需要一段时间(很多秒) 如果平均URL为50个字符(ASCII),每个字符串的开销为32字节,那么500万个条目可

我有一个关于在应用程序内存中存储大量字符串的问题。我需要从文件中加载并存储大约500万行,每个行最多255个字符(URL),但大部分是~50个字符。有时我需要搜索其中一个。是否可以在~1GB内存上运行此应用程序

意志


最新的JVM默认支持
-XX:+UseCompressedStrings
,它在内部存储仅使用ASCII作为字节[]的字符串

列表中有几GB的文本不是问题,但从磁盘加载可能需要一段时间(很多秒)


如果平均URL为50个字符(ASCII),每个字符串的开销为32字节,那么500万个条目可能需要大约400 MB,这对于现代PC或服务器来说并不多。

有什么原因需要将其限制在1G以内吗?如果你想搜索它们,你肯定不想交换到磁盘,但是如果机器有更多的内存,那么把内存提高到1G是有意义的


如果必须搜索,请使用
SortedSet
,而不是
ArrayList
Java字符串是一个完整的对象。这意味着,从字符串的字符本身来看,还有其他信息要存储在其中(指向对象类的指针、带有指向它的指针数量的计数器以及其他一些基础结构数据)。因此一个空字符串在内存中已经占用了45个字节(如您所见)。 现在,您只需添加字符串的最大长度,并进行一些简单的计算,以获得该列表的最大内存


无论如何,如果您有内存问题,我建议您将字符串作为字节[]加载。通过这种方式,您可以控制编码,并且仍然可以进行搜索。

为什么不使用数据库?如果您只使用ASCII字符(如果字符串是URL,这似乎是给定的),则UTF-8编码字符串使用的内存与ASCII字符串完全相同,因此UTF-8编码不会成为问题。但是IIRC,Java在内部使用Utf-16,这实际上通常使用了两倍的内存。您至少应该为ArrayList提供一个初始大小,以避免在初始化期间执行数百次数组复制操作,例如:
newArrayList(1000*1000)第二部分是关于搜索它们。您可能希望使用
SortedSet
或类似的快速搜索集合。其他提示,如果知道字符串重复,请使用
intern()
,因为这只保存JVM中每个唯一字符串的一个副本。这会增加开销(CPU),但会节省内存。+1用于教我如何使用压缩字符串。使用它有什么坏处吗?我只在应用程序启动时加载它,然后保存在后台线程中。回答
字节[]
的Thx会终止搜索吗?
ArrayList <String> list = new ArrayList<String>();
java -Xmx1024M -Xms1024M -jar "PServer.jar" nogui