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()) {