aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes GC question Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Spring in Action this week in the Spring forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "GC question" Watch "GC question" New topic
Author

GC question

Holmes Wong
Ranch Hand

Joined: Feb 18, 2002
Posts: 163
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

Joined: Aug 26, 2001
Posts: 7610
That's right


SCJP 5, SCJD, SCBCD, SCWCD, SCDJWS, IBM XML
[Blog] [Blogroll] [My Reviews] My Linked In
Sam Cooper
Greenhorn

Joined: Feb 21, 2002
Posts: 14
"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

Joined: Dec 20, 2001
Posts: 3271
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


SCJP Tipline, etc.
Ricardo Cortes
Ranch Hand

Joined: Jan 23, 2002
Posts: 140
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 ]

Sun Certified J2EE Architect for the J2EE Platform (Part 1)<br />Sun Certified Web Component Developer for the J2EE Platform<br />Sun Certified Programmer for the Java 2 Platform
Valentin Crettaz
Gold Digger
Sheriff

Joined: Aug 26, 2001
Posts: 7610
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

Joined: Jan 23, 2002
Posts: 140
Thanks. Some good information at that site!
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: GC question