Intern strings returned by Gson when parsing build files.
Summary: This prevents `buck targets` from OOM'ing on large projects.
Test Plan:
Verify that `buck targets` no longer fails, without resorting
to increasing the max heap size.
diff --git a/src/com/facebook/buck/json/BuildFileToJsonParser.java b/src/com/facebook/buck/json/BuildFileToJsonParser.java
index 7121a25..03f9bea 100644
--- a/src/com/facebook/buck/json/BuildFileToJsonParser.java
+++ b/src/com/facebook/buck/json/BuildFileToJsonParser.java
@@ -120,7 +120,12 @@
if (json.isJsonPrimitive()) {
JsonPrimitive primitive = json.getAsJsonPrimitive();
if (primitive.isString()) {
- return primitive.getAsString();
+ // On a large project, without invoking intern(), we have seen `buck targets` OOM. When this
+ // happened, according to the .hprof file generated using -XX:+HeapDumpOnOutOfMemoryError,
+ // 39.6% of the memory was spent on char[] objects while 14.5% was spent on Strings.
+ // (Another 10.5% was spent on java.util.HashMap$Entry.) Introducing intern() stopped the
+ // OOM from happening.
+ return primitive.getAsString().intern();
} else if (primitive.isBoolean()) {
return primitive.getAsBoolean();
} else if (primitive.isNumber()) {