Java字符数组和字符串的性能分析

7

我正在分析一款应用程序,并注意到其中52%(195MB)的内存被char[]使用,20%被String使用。这是一个具有许多依赖关系的大型项目,我刚刚发现它,因此我有几个相关的问题,以帮助我入手:

String s = "some text"会创建一个char[]吗?

我注意到有数百个没有明显原因的String s = new String("some text")。这是否是罪魁祸首?


那么,是 new String("aa") 还是只有 "aa" - Thilo
有两种情况。我认为对于“aa”我无能为力,但是使用new String(“aa”)可能是错误的,可以进行优化。 - Michael
1个回答

10

String s = "some text"会创建一个char[]吗?

这不会创建任何对象。

我注意到有很多没有明显原因的String s = new String("some text")。这是罪魁祸首吗?

这将创建字符串和可能的char[]的拷贝(两个对象)。只有当字符串表示另一个字符串的子串时,才会进行拷贝。

请确保您使用支持-XX:+UseCompressedStrings的Java版本。这在后期Java版本中默认开启,并允许JVM使用byte[]而不是char[],可以节省一半的空间。

然而,400 MB在今天并不算太大,购买更多内存可能是最简单的解决方案。您可以以低至120美元的价格获得16 GB的内存。


在查看JDK6代码后,我怀疑new String(“some text”)不会复制char []。我非常确定它将使用相同的数组引用。 - NPE
1
如果实现不可变的字符串正确,复制char[]也是没有必要的,我也会感到惊讶。 - Lukas Eder
2
99.9%的情况下,不需要使用new String() - Peter Lawrey
@LukasEder,char[] 可以被复制,但在这种情况下不行。 - Peter Lawrey
@Peter:你说得对。我刚刚查看了源代码... 很高兴知道。 - Lukas Eder
有320万个char[]实例和319万个String实例,所以Peter几乎肯定是正确的。我正在使用JDK1.5(银行!),但将尝试1.6或7以查看是否有任何改进(并向您更新)。52%是令人担忧的,而不是400MB-我正在使用非常小的数据子集进行测试。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接