File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

GC question

 
Holmes Wong
Ranch Hand
Posts: 163
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
How many objects are eligible for garbage collection once execution has reached the line labeled Line A?
String name;
String newName = "Nick";
newName = "Jason";
name = "Frieda";
String newestName = name;
name = null;
//Line A
Since string literals in string pool will not be
collected, the answer should be 0 right?
 
Valentin Crettaz
Gold Digger
Sheriff
Posts: 7610
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
That's right
 
Sam Cooper
Greenhorn
Posts: 14
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
"Since string literals in string pool will not be
collected, the answer should be 0 right?"
Holmes, Could you please elaborate your explanation.
Thanks
 
Corey McGlone
Ranch Hand
Posts: 3271
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by Sam Cooper:
"Since string literals in string pool will not be
collected, the answer should be 0 right?"
Holmes, Could you please elaborate your explanation.
Thanks

When you declare a String literal in your program, such as "Hello", or "World", these String objects are not created the way any other object is created. Rather, since Strings are immutable, the JVM takes advantage of that and optimizes the creation of Strings. The String literals are created in what is known as the "string pool." Then, if, anywhere throughout your application, you declare another String literal just as you used it before, no new objects will be created, you'll just be reusing the one from the string pool.
Because of this special way that String literals are created and handled, string literals are not generally garbage collected. In the case that memory becomes very tight, the literals will be garbage collected, but they do not become "eligible" like all other Java Objects.
Had the code looked like this:

Then, after line A was executed, 2 objects would be available for garbage collection (the String objects representing "Bob" and "Tessa"). When you use the new operator for a String, they are created like any other Java object. Only when you use a string literal (as in the initial example), are Strings created in the string pool.
I hope that helps.
Corey
 
Ricardo Cortes
Ranch Hand
Posts: 140
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
So, would it make sense to always use constructors when creating String objects to allow for proper garbage collection? Can this be considered a valid optimization?
[ February 21, 2002: Message edited by: Ricardo Cortes ]
 
Valentin Crettaz
Gold Digger
Sheriff
Posts: 7610
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Ricardo,
Basically, it depends on what you are actually looking for, performance or memory footprint. Creating an object is an expensive operation. I'd say that using String literals (that is strings not created with "new") is a good choice when you know that your strings are not gonna change and that you are gonna use them at several places within your application.
Everytime you need to change a String, a new one has to be created and sometimes the performance decreases.
StringBuffer is a good option when dealing with strings that are changing over time.
If you want to get more information about performance, consider reading the following link:
Java Performance Tuning.
 
Ricardo Cortes
Ranch Hand
Posts: 140
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thanks. Some good information at that site!
 
I agree. Here's the link: http://aspose.com/file-tools
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic