Java Forum / General / September 2007
garbage collector
timothy ma and constance lee - 12 Sep 2007 02:47 GMT Sir/madam
I have this question in my heart. In Java, they always say object use up the memory. Since all java programming will have object instiantiate like Date(), timestamp, String etc. Should we need to garbage collect them after use? If so, how to do that by batch rather than object bu object?
Thanks
Andrew Thompson - 12 Sep 2007 03:15 GMT ...
>...In Java, they always say object use up the >memory. That would be true of any language that is OO. (And for non-OO languages, other things beside objects use up memory.)
>..Since all java programming will have object instiantiate like >Date(), timestamp, String etc. Should we need to garbage collect them after >use? It depends.
For example, let's look at one program, designed two different ways. Say you have two programs that each deal with 10,000,000 records from a DataBase.
The code of both apps. might use a common Java Object to represent each record, but while one program retains a single instance of the RecordObject, and simply recycles it for use with each record, the second instantiates 10,000,000 RecordObject's.
The first app. would probably do just fine, whereas the second would be likely to crash in the standard memory assigned to Java apps.
The usual advice for Java applications is not to worry about it until/unless it becomes a problem, then use a profiler to determine the source of the problem.
>If so, how to do that by batch rather than object bu object? To my knowledge, there is no way to ensure no more references to an object 'by batch'. Of course, you can call GC, and any objects with no further references should be disposed, but I suspect you are referring to something else.
 Signature Andrew Thompson http://www.athompson.info/andrew/
Joshua Cranmer - 12 Sep 2007 03:16 GMT > Sir/madam > [quoted text clipped - 3 lines] > use? > If so, how to do that by batch rather than object bu object? Java garbage collection is handled automatically for you. If you want objects to be garbage collected, then drop all of the references to the object, and it will be collected on the next run.
 Signature Beware of bugs in the above code; I have only proved it correct, not tried it. -- Donald E. Knuth
Lew - 12 Sep 2007 03:39 GMT >> Sir/madam >> [quoted text clipped - 7 lines] > objects to be garbage collected, then drop all of the references to the > object, and it will be collected on the next run. Well, maybe not the very next run, depending on what you mean by "next run". There are two flavors of GC in the standard Sun default implementation, and it could be that the object is not collected in a minor GC and will have to wait for a major GC.
But that doesn't diminish Joshua's point, which is that you don't collect objects, the JVM does. You just have to make sure nothing refers to them any more, as Joshua indicated.
The Sun page <http://java.sun.com/javase/technologies/hotspot/gc/index.jsp> has a bunch of information that you should study.
It's often a good idea in Javaland to search, in order, Sun, Google and IBM for information. It didn't take me too long to find the link I posted, given that I didn't have it bookmarked and needed to hunt it down on Sun's Java site. It shouldn't have taken you much longer.
Basically, you navigate to <http://java.sun.com/> Find the link on the right that says, "Technologies: Java SE" <http://java.sun.com/javase/> Click on the "Technologies" tab. Since GC is a JVM issue, look for the header "Java Virtual Machine". It sports one link: "HotSpot VM" <http://java.sun.com/javase/technologies/hotspot/index.jsp> Look down the page, and hey, presto! There's a link for "HotSpot Garbage Collection" (/ibid./).
 Signature Lew
Curt Welch - 12 Sep 2007 07:25 GMT > Sir/madam > > I have this question in my heart. Other people answered your question, but I wonder if they were assuming you knew more than you do. So let me make a few points clear in case you don't understant the basics of garbage collection.
> In Java, they always say object use up > the memory. Since all java programming will have object instiantiate like > Date(), timestamp, String etc. Should we need to garbage collect them > after use? No. It's all automatic. You don't have to worry about that.
if you do something like:
for (int i=0; i < 1000000; i++) { Date d = new Date(); // do stuff with date }
It will create a million Date objects for you, but each Date object is lost at the end of each iteration of the for() loop, and as such, they are available for the garbage collector to free them. The garbage collector runs automaitcally when it's needed so you just don't worry about it.
However, the better way to write that is something like this (as someone else already suggested to you):
Date d = new Date(); for (int i=0; i < 1000000; i++) { // keep reusing the one Date object for each loop }
Then you only use up the memory for one Date object and only one Date object has to be cleaned up after your method terminates. So as a general rule, it's better if you don't create lots of objects inside large loops if you don't need to. But at the same time, Java object creation and cleanup is so fast, you can normally get away with doing it the bad way.
> If so, how to do that by batch rather than object bu object? The garbage collector will clean up your dead objects for you at some point in the future. You normally never have to worry about it. That's the beauty of using a gc based language like Java.
You can force the garbage collector to run by calling System.gc() at any point, but you never need to do that unless you have very special requirements. It runs automatically when it's needed.
If you have data you don't need anymore, you can drop your access to it by setting the object to null. So for example:
int a[] = new int[10000000];
Uses up a large chunk of memory which won't be freed as long as you can access the variable a. But if you are done with the data, you can drop your access to the array by doing this:
a = null;
At that point, all the memory used to hold the large array is available for the gc() to reclaim when it needs more memory.
Normally however, you don't even do that, instead, you just make sure the life of the variable matches the programs need for the data. If you only need that large data for the life of a single method, then you make it a local variable in the method. If you only needed it for the life of a given object, you make it an instance variable in the object.
When you might find a need for that is for class variables (static). They stay around for the life of your program, and if there's some point in the program you don't need them anymore, you can make the memory available for other use just by setting it to null like above.
As someone else said, the normal practice is to not worry about it until it becomes a problem. If you are used to programing in other languages where you have to carefully alloc and free all your memory and spend all your life hoping you haven't created a memory leak, it's hard at first to get used to ignoring it. But once you get used to the beauty of not having to worry about memory, you will never want to go back.
 Signature Curt Welch http://CurtWelch.Com/ curt@kcwc.com http://NewsReader.Com/
Stefan Ram - 12 Sep 2007 07:41 GMT >You can force the garbage collector to run by calling System.gc() It can be /suggested/ to expend effort toward recycling:
»Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.«
http://download.java.net/jdk7/docs/api/java/lang/System.html#gc()
Lew - 12 Sep 2007 12:00 GMT (Curt Welch) writes:
> However, the better way to write that is something like this (as someone > else already suggested to you): [quoted text clipped - 3 lines] > // keep reusing the one Date object for each loop > } Why is that better than declaring the Date inside the loop?
Doesn't it force the object into the tenured generation, actually hurting memory usage?
 Signature Lew
Joshua Cranmer - 12 Sep 2007 21:58 GMT > (Curt Welch) writes: >> However, the better way to write that is something like this (as someone [quoted text clipped - 9 lines] > Doesn't it force the object into the tenured generation, actually > hurting memory usage? But the object is only being created once rather than one million times. I suppose it is ultimately slightly worse on the memory usage, but the garbage collection procedure will be triggered fewer times. Inside the loop, it is likely to have a slight increase on memory--there are fewer uncollected fragments on the heap--but it will properly degrade memory somewhat outside of the loop (expanded scope, etc.). [*]
[*] Note: Well, the reference for initialization inside the loop would probably not be lost until a new variable had been declared following the loop, due to the Java VM constraints. If that is true, then the scope of better performance is slightly expanded.
 Signature Beware of bugs in the above code; I have only proved it correct, not tried it. -- Donald E. Knuth
Lew - 13 Sep 2007 02:10 GMT Lew wrote:
>> Doesn't it force the object into the tenured generation, actually >> hurting memory usage?
> But the object is only being created once rather than one million times. > I suppose it is ultimately slightly worse on the memory usage, but the > garbage collection procedure will be triggered fewer times. Inside the > loop, it is likely to have a slight increase on memory--there are fewer > uncollected fragments on the heap--but it will properly degrade memory > somewhat outside of the loop (expanded scope, etc.). [*] It's that "expanded scope" that worries me. You have to make sure that the Date instance is properly cleared between instances, for example, perhaps as part of reinitialization. You now have a variable visible outside its intended range, which in some applications can become an issue. Memory allocation in Java is blindingly fast, and young-generation GCs don't take all that long.
Another consideration is that long-lived mutable objects present threading challenges. Alas, Date is not immutable, but if one had a better example than Date one might find the benefits of an immutable object outweigh the downside of reinstantiation inside the loop, in the face of multi-threaded considerations.
I'm not making the case that having the variable inside the loop will be faster, only that it is not a sure thing that all types will benefit from re-use of an instance in lieu of re-allocation. There are many scenarios where the overhead of managing a long-lived, wide-scoped mutable object will be worse than the overhead of newly instantiating a short-lived, limited-scope immutable object.
 Signature Lew
Roedy Green - 13 Sep 2007 14:38 GMT >Memory >allocation in Java is blindingly fast, and young-generation GCs don't take all >that long. The allocation is fairly quick, but you still have to initialise the object. This means zeroing the whole thing, then filling in any fields that initialise to something other than 0. (I wonder how long before CPUs have single instruction to do the zeroing efficiently.) Further some classes have some fairly extensive computation in the initialization methods.
Note how JTable uses but one object to render all the cells. Sun would not have done such a peculiar thing if allocating a component were almost free.
 Signature Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
Lew - 13 Sep 2007 14:45 GMT > The allocation is fairly quick, but you still have to initialise the > object. This means zeroing the whole thing, then filling in any > fields that initialise to something other than 0. (I wonder how long > before CPUs have single instruction to do the zeroing efficiently.) > Further some classes have some fairly extensive computation in the > initialization methods. Which initializing is just as necessary and sometimes harder to keep safe with an object that is reused after having been dirtied.
> Note how JTable uses but one object to render all the cells. Sun > would not have done such a peculiar thing if allocating a component > were almost free. One example of where a paradigm doesn't apply doesn't imply that it never applies.
The point is that it isn't always true that re-use of an object is better than re-instantiation.
Furthermore, your point isn't proven because Sun has done many peculiar things with Java that aren't the best. Making java.util.Date mutable is one.
Further furthermore, while allocation may have been difficult in Java 1.1 when they were inventing JTable, it might not be such the problem any more in Java 6.
Further further furthermore, allocation cost might not have been involved in the decision at all - perhaps scope or algorithm concerns were what prevailed there. Do you have evidence for the factors that went into that decision?
 Signature Lew
nebulous99@gmail.com - 15 Sep 2007 03:39 GMT [snip lots]
> Further further furthermore, allocation cost might not have been involved in > the decision at all - perhaps scope or algorithm concerns were what prevailed > there. Do you have evidence for the factors that went into that decision? One more thing that seems relevant here: "Premature optimization is the root of all evil"
Roedy Green - 13 Sep 2007 01:42 GMT >> Date d = new Date(); >> for (int i=0; i < 1000000; i++) { [quoted text clipped - 5 lines] >Doesn't it force the object into the tenured generation, actually hurting >memory usage? With new Date inside the loop you get 1000000 Date objects created and gced. With it outside you have only one.
If you are worried about the Date object persisting after the loop, do a d=null aftter the loop.
 Signature Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
Roedy Green - 12 Sep 2007 08:14 GMT On Wed, 12 Sep 2007 01:47:21 GMT, "timothy ma and constance lee" <timcons1@shaw.ca> wrote, quoted or indirectly quoted someone who said
>Should we need to garbage collect them after >use? see http://mindprod.com/jgloss/garbagecollection.html
It happens automatically.
 Signature Roedy Green Canadian Mind Products The Java Glossary http://mindprod.com
Free MagazinesGet these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...
|
|
|