dd-b wrote
At least, using a string literal 500 times in a loop causes a heap exhaustion error.  Since I'm assigning the same constant to the same variable over and over, that looks like it should be okay to me.  (It also happens if I call Output.printString on the same string literal, instead of assigning it to a string variable).
 
Because the VM language does not have any concept of multi-word data constants, the only way to make a string constant is programatically. The expression
    let str = "abc"
in Jack compiles to the equivalent of
    let str = String.new(3);
    do str.appendChar(65);    // 'a'
    do str.appendChar(66);    // 'b'
    do str.appendChar(67);    // 'c'
Thus, every time that a string constant is "executed", a new 
String object is allocated. You, the programmer, must deallocate this 
String.
The only way to do this is to assign the constant to a 
String variable, pass the variable to Output.printString, and then destroy it.
For constants that are used a lot, like a ", " list separator, you might want to make a static class variable that gets set to the constant value in your class's constructor, and then you can use that variable throughout your class.
--Mark