我正在分析一款应用程序,并注意到其中52%(195MB)的内存被char[]
使用,20%被String
使用。这是一个具有许多依赖关系的大型项目,我刚刚发现它,因此我有几个相关的问题,以帮助我入手:
String s = "some text"
会创建一个char[]
吗?
我注意到有数百个没有明显原因的String s = new String("some text")
。这是否是罪魁祸首?
我正在分析一款应用程序,并注意到其中52%(195MB)的内存被char[]
使用,20%被String
使用。这是一个具有许多依赖关系的大型项目,我刚刚发现它,因此我有几个相关的问题,以帮助我入手:
String s = "some text"
会创建一个char[]
吗?
我注意到有数百个没有明显原因的String s = new String("some text")
。这是否是罪魁祸首?
String s = "some text"会创建一个char[]吗?
这不会创建任何对象。
我注意到有很多没有明显原因的String s = new String("some text")。这是罪魁祸首吗?
这将创建字符串和可能的char[]的拷贝(两个对象)。只有当字符串表示另一个字符串的子串时,才会进行拷贝。
请确保您使用支持-XX:+UseCompressedStrings
的Java版本。这在后期Java版本中默认开启,并允许JVM使用byte[]
而不是char[]
,可以节省一半的空间。
然而,400 MB在今天并不算太大,购买更多内存可能是最简单的解决方案。您可以以低至120美元的价格获得16 GB的内存。
new String(“some text”)
不会复制char []
。我非常确定它将使用相同的数组引用。 - NPEchar[]
也是没有必要的,我也会感到惊讶。 - Lukas Edernew String()
。 - Peter Lawreychar[]
可以被复制,但在这种情况下不行。 - Peter Lawrey
new String("aa")
还是只有"aa"
? - Thilo