 |
AppletTalk.com Java discussions newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Novice Guest
|
Posted: Mon Jul 14, 2003 7:25 pm Post subject: do self references cause memory leaks in Java? |
|
|
Hi, I am doing some work with Java and C++ and am curious as to whether self
references in Java cause memory leaks.
For example:
class Test{
Object foo =this;
}
If I instantiate Test, the reference count of any Test object will never
become zero (as it always keeps a reference to itself) so long as the foo
variable is never re-assigned.
Does this present a problem for Java's garbage collection?
Thanks,
Novice
|
|
| Back to top |
|
 |
Adam Maass Guest
|
Posted: Mon Jul 14, 2003 7:37 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
"Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
| Quote: | Hi, I am doing some work with Java and C++ and am curious as to whether
self
references in Java cause memory leaks.
For example:
class Test{
Object foo =this;
}
If I instantiate Test, the reference count of any Test object will never
become zero (as it always keeps a reference to itself) so long as the foo
variable is never re-assigned.
Does this present a problem for Java's garbage collection?
|
Garbage collection in Java does not use reference counting. Rather, most
simple gc systems use a mark-and-sweep method.
-- Adam Maass
|
|
| Back to top |
|
 |
Novice Guest
|
Posted: Mon Jul 14, 2003 7:57 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
"Adam Maass" <adam.nospam.maass (AT) comcast (DOT) net> wrote
| Quote: |
"Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
Hi, I am doing some work with Java and C++ and am curious as to whether
self
references in Java cause memory leaks.
For example:
class Test{
Object foo =this;
}
If I instantiate Test, the reference count of any Test object will never
become zero (as it always keeps a reference to itself) so long as the
foo
variable is never re-assigned.
Does this present a problem for Java's garbage collection?
Garbage collection in Java does not use reference counting. Rather, most
simple gc systems use a mark-and-sweep method.
|
Is there somewhere I can find this documented?
The impression I get from the very high level documents I've read on
java.sun.com's website is:
"The Java runtime environment has a garbage collector that periodically
frees the memory used by objects that are no longer referenced."
So if an object references itself and never stops referencing itself that
object will always have at least one reference.
Thanks,
Novice
|
|
| Back to top |
|
 |
Novice Guest
|
Posted: Mon Jul 14, 2003 8:03 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
In fact I found this article:
http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html
on the sun website and it says that:
"Circular strong references don't necessarily cause memory leaks."
This statement doesn't seem to indicate that all objects which are no longer
referenced (except by themselves) will be removed/deleted.
In fact, it goes on further to say:
"although the VM might not actually collect these objects for an indefinite
amount of time"
Which to me says that the VM may not remove/delete these objects from memory
until the VM is shut-down.
Is there any reason to believe otherwise?
Thanks,
Novice
|
|
| Back to top |
|
 |
Novice Guest
|
Posted: Mon Jul 14, 2003 9:01 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
|
| Quote: | The VM might not collect any object for an indefinite amount of time. So
yes,
uncollected objects may remain in memory until the VM is shut down.
|
This to me is a problem - I mean server programs would eventually run out of
memory if they made use of classes with circular dependencies...
Can anyone provide any clarification on this?
Or do most people know to try to avoid circular dependencies?
Thanks,
Novice
|
|
| Back to top |
|
 |
Adam Maass Guest
|
Posted: Mon Jul 14, 2003 9:27 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
"Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
| Quote: | "Adam Maass" <adam.nospam.maass (AT) comcast (DOT) net> wrote:
|
| "Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
| > Hi, I am doing some work with Java and C++ and am curious as to
whether
| self
| > references in Java cause memory leaks.
|
| > For example:
|
| > class Test{
| > Object foo =this;
| > }
|
| > If I instantiate Test, the reference count of any Test object will
never
| > become zero (as it always keeps a reference to itself) so long as the
foo
| > variable is never re-assigned.
|
| > Does this present a problem for Java's garbage collection?
|
|
| Garbage collection in Java does not use reference counting. Rather, most
| simple gc systems use a mark-and-sweep method.
|
Is there somewhere I can find this documented?
|
OK, this isn't exactly crystal-clear from the specs, but here's the
definition of an object's lifecycle:
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#74701
And here's the definition of the term "reachable," which is part of the
lifecycle definition:
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44762
The short answer is that an object that refers to itself may be garbage
collected if there are no references to it from any live thread.
Java garbage collection does not use (a naive implementation of)
reference-counting.
-- Adam Maass
|
|
| Back to top |
|
 |
Bent C Dalager Guest
|
Posted: Mon Jul 14, 2003 10:15 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
In article <bev5h3$18a$1 (AT) knot (DOT) queensu.ca>,
Novice <cassidy (AT) cs (DOT) queensuDOTca> wrote:
| Quote: |
This to me is a problem - I mean server programs would eventually run out of
memory if they made use of classes with circular dependencies...
|
The VM will always do garbage collection - and a complete garbage
collection if necessary - before reporting an out of memory condition.
The case of not having had anything collected until program shutdown
will only occur for programs that did not run out of memory during
execution.
| Quote: | Can anyone provide any clarification on this?
Or do most people know to try to avoid circular dependencies?
|
Circular dependencies aren't a problem. If you're using an
experimental VM, of course, you might want to make a point out of
checking its documentation on this point.
I believe some older VMs did conservative GC, which is a bit of a
mess.
Cheers
Bent D
--
Bent Dalager - [email]bcd (AT) pvv (DOT) org[/email] - http://www.pvv.org/~bcd
powered by emacs
|
|
| Back to top |
|
 |
Phillip Lord Guest
|
Posted: Tue Jul 15, 2003 9:17 am Post subject: Re: do self references cause memory leaks in Java? |
|
|
| Quote: | "Novice" == Novice <cassidy (AT) cs (DOT) queensuDOTca> writes:
|
Novice> | The VM might not collect any object for an indefinite
Novice> amount of |time. So yes, uncollected objects may remain in
Novice> memory until the VM is shut |down.
Novice> |
Novice> This to me is a problem - I mean server programs would
Novice> eventually run out of memory if they made use of classes
Novice> with circular dependencies...
Novice> Can anyone provide any clarification on this?
Novice> Or do most people know to try to avoid circular
Novice> dependencies?
No. The JVM does not have to collect objects until it feels it wants
to. Maybe never.
However it is required to free all available memory before it throws
an out of memory error.
So, for instance, a JVM might choose not to GC until it runs short of
memory. This makes sense, as GC is expensive. Why do it if you don't
need to. If you are running out of memory, of course, this is a
different issue. Then you do need to.
In short, don't worry about circular dependencies. They will not cause
the GC problems. And generally don't worry about when objects that are
our of scope, are actually GC'd. Its an implementation issue, and it
will differ between JVM's.
Cheers
Phil
|
|
| Back to top |
|
 |
Ian deSouza Guest
|
Posted: Tue Jul 15, 2003 2:24 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
I think it might be worthwhile talking about the mark-and-sweep GC
that you had previously mentioned. Mark-and-sweep involves the GC
first looking at the main program and looking for object references
there, and "marking" them as valid. It then looks at the references
that those hold, marking them, and so on.
After it completes the marking, it then deletes the objects that
weren't marked, (since it has has a complete list of all the new'ed
objects), first calling finalize on the objects before removing the
memory.
Mark-and-sweep been in place since at least 1.1 (maybe before)..
"Adam Maass" <adam.nospam.maass (AT) comcast (DOT) net> wrote
| Quote: | "Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
"Adam Maass" <adam.nospam.maass (AT) comcast (DOT) net> wrote:
|
| "Novice" <cassidy (AT) cs (DOT) queensuDOTca> wrote:
| > Hi, I am doing some work with Java and C++ and am curious as to
whether
self
| > references in Java cause memory leaks.
|
| > For example:
|
| > class Test{
| > Object foo =this;
| > }
|
| > If I instantiate Test, the reference count of any Test object will
never
| > become zero (as it always keeps a reference to itself) so long as the
foo
| > variable is never re-assigned.
|
| > Does this present a problem for Java's garbage collection?
|
|
| Garbage collection in Java does not use reference counting. Rather, most
| simple gc systems use a mark-and-sweep method.
|
Is there somewhere I can find this documented?
OK, this isn't exactly crystal-clear from the specs, but here's the
definition of an object's lifecycle:
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#74701
And here's the definition of the term "reachable," which is part of the
lifecycle definition:
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44762
The short answer is that an object that refers to itself may be garbage
collected if there are no references to it from any live thread.
Java garbage collection does not use (a naive implementation of)
reference-counting.
-- Adam Maass
|
|
|
| Back to top |
|
 |
Roedy Green Guest
|
Posted: Wed Jul 16, 2003 2:16 am Post subject: Re: do self references cause memory leaks in Java? |
|
|
On Mon, 14 Jul 2003 17:01:33 -0400, "Novice" <cassidy (AT) cs (DOT) queensuDOTca>
wrote or quoted :
| Quote: | This to me is a problem - I mean server programs would eventually run out of
memory if they made use of classes with circular dependencies...
|
You are imagining Java gc works by reference counting where circular
references are a problem. See
http://mindprod.com/jgloss/reference.html and
http://mindprod.com/jgloss/garbagecollection.html
for how Java's mark sweep or generational gc works.
--
Canadian Mind Products, Roedy Green.
Coaching, problem solving, economical contract programming.
See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.
|
|
| Back to top |
|
 |
Doug Pardee Guest
|
Posted: Wed Jul 16, 2003 4:47 am Post subject: Re: do self references cause memory leaks in Java? |
|
|
"Steve Horsley" <steve.horsley1 (AT) virgin (DOT) NO_SPAM.net> wrote:
| Quote: | A full Garbage Collection will only run when the VM doesn't have enough
memory to create a new Object when required. A short-lived program or a
program that dives into a tight loop without creating and discarding many
objects may never trigger a full GC.
|
This is only true for certain environments.
The JVM specification declares that the behavior of the garbage
collector is not defined, and the JVM implementor has a free hand. The
only requirements are that there be a garbage collector, and that it
make its best effort to reclaim memory before throwing the
OutOfMemoryError.
Most of us are using Sun JVMs, and Sun has documented their GCs fairly
well. It's worth the trip to the Sun Web site to read the facts,
rather than relying on conjecture.
Modern Sun JVMs use multiple heaps, with separate garbage collectors
on each. These typically DO run on an as-needed basis, but in many
cases a "full GC" is never triggered even in a program that creates
and discards many objects.
On the other hand, if you're using RMI, the Distributed Garbage
Collector will force a "full GC" on a regular basis. By default, the
DGC triggers a full garbage collection every 60 seconds.
| Quote: | This is why finalize() cannot be
relied on to clean up resources - the program may terminate normally
without the finalizers ever running.
|
Again, not *necessarily* true. It is true for the default situation,
but if you call System.runFinalizersOnExit(true) at some point, the
finalizers will always be executed. Heh... unless someone calls
System.runFinalizersOnExit(false) after you've called it with "true"
:-)
|
|
| Back to top |
|
 |
Doug Pardee Guest
|
Posted: Wed Jul 16, 2003 5:15 am Post subject: Re: do self references cause memory leaks in Java? |
|
|
[email]ian_desouza (AT) yahoo (DOT) com[/email] (Ian deSouza) wrote:
| Quote: | I think it might be worthwhile talking about the mark-and-sweep GC
that you had previously mentioned.
[snip]
Mark-and-sweep been in place since at least 1.1 (maybe before)..
|
Historically, Sun JVMs have not used mark-and-sweep GCs.
The older Sun JVMs used mark-and-compact. The difference is that
mark-and-sweep leaves a checkerboarded heap.
Modern Sun JVMs (since 1.2.something) use multiple heaps, divided into
two generations for user objects and a third generation for system
objects. The two user generations use separate garbage collectors. The
young generation uses a single-pass "copying" garbage collector: all
live objects are copied from Eden and the current survivor space into
the new survivor space and possibly the tenured generation, and then
Eden and the current survivor space are declared empty, and the new
survivor space becomes the current survivor space. The tenured
generation uses mark-and-compact.
As of 1.4.1, Sun's JVMs have added some additional GC options, one of
which is a low-latency, mostly concurrent, mark-and-sweep GC for the
tenured generation. Its operation is a six-phase process that is a
*bit* more complicated than an ordinary mark-and-sweep. See the FAQ
reference below.
A couple of useful references:
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
http://java.sun.com/docs/hotspot/gc1.4.2/
|
|
| Back to top |
|
 |
S. Balk Guest
|
Posted: Wed Jul 16, 2003 8:44 am Post subject: Re: do self references cause memory leaks in Java? |
|
|
| Quote: | Hi, I am doing some work with Java and C++ and am curious as to whether
self
references in Java cause memory leaks.
For example:
class Test{
Object foo =this;
}
If I instantiate Test, the reference count of any Test object will never
become zero (as it always keeps a reference to itself) so long as the foo
variable is never re-assigned.
Does this present a problem for Java's garbage collection?
|
why don't you stress-test this little class by generating trillions of
objects, and watch the GC-log
|
|
| Back to top |
|
 |
Roedy Green Guest
|
Posted: Wed Jul 16, 2003 8:19 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
On Wed, 16 Jul 2003 10:44:22 +0200, "S. Balk"
<s.balk (AT) hccnet (DOT) n0spam.nl> wrote or quoted :
how would he to that?
--
Canadian Mind Products, Roedy Green.
Coaching, problem solving, economical contract programming.
See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.
|
|
| Back to top |
|
 |
Steve Horsley Guest
|
Posted: Wed Jul 16, 2003 9:37 pm Post subject: Re: do self references cause memory leaks in Java? |
|
|
On Tue, 15 Jul 2003 21:47:11 -0700, Doug Pardee wrote:
| Quote: | "Steve Horsley" <steve.horsley1 (AT) virgin (DOT) NO_SPAM.net> wrote:
This is why finalize() cannot be
relied on to clean up resources - the program may terminate normally
without the finalizers ever running.
Again, not *necessarily* true. It is true for the default situation,
but if you call System.runFinalizersOnExit(true) at some point, the
finalizers will always be executed. Heh... unless someone calls
System.runFinalizersOnExit(false) after you've called it with "true"
|
runFinalizerdOnExit() is deprecated as "inherently unsafe".
Steve
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|