【发布时间】:2012-05-31 13:59:27
【问题描述】:
我们有一个在tomcat下运行的java/jruby webapp,我一直在分析应用程序在运行时的对象数量和内存使用情况。启动后我注意到“org.jruby.RubyString”类有1,118,000个字符串“”实例,仅空字符串使用的堆内存总量为65mb,这对我来说很荒谬,因为它是15%的内存由 webapp 使用。空字符串只是存在此问题的许多字符串值的一个示例,如果我可以实习我计算出的所有 jruby 字符串,我可以节省大约 130mb。
我知道在Java中,每次创建字符串值时,它都会检查该值是否已经存在于字符串池中,如果存在则重用它。我想知道 Jruby 中是否有具有相同优化的选项?如果是这样,我该如何启用它?
Jruby 中的示例:
v1 = "a"
v2 = "a"
puts v1.object_id # => 3352
puts v2.object_id # => 3354
Java 中的示例:
String v1 = "a";
String v2 = "a";
System.out.println(v1.hashCode()); # => 97
System.out.println(v2.hashCode()); # => 97
【问题讨论】:
-
如果你用符号替换所有字符串,你会得到这种行为,但我不知道有一个选项可以自动使它成为实习字符串。
-
不是一个理想的解决方案,因为很多这些字符串是从 3rd 方 gems 和插件创建的。
-
你能发布一段产生这些空字符串的代码吗?
-
Java 哈希码并不能证明两个对象是相同的(并不是说您对字符串文字在 Java 中自动进行实习是错误的)。
String a = "a" + "b"; String b = "a" + "b";AFAIK 将创建两个对象,而不是一个,但两者都将具有相同的哈希码。
标签: java ruby string optimization jruby