AppletTalk.com Forum Index AppletTalk.com
Java discussions newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

do self references cause memory leaks in Java?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    AppletTalk.com Forum Index -> Java Help
View previous topic :: View next topic  
Author Message
Novice
Guest





PostPosted: Mon Jul 14, 2003 7:25 pm    Post subject: do self references cause memory leaks in Java? Reply with 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?

Thanks,
Novice


Back to top
Adam Maass
Guest





PostPosted: Mon Jul 14, 2003 7:37 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote




"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





PostPosted: Mon Jul 14, 2003 7:57 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote



"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





PostPosted: Mon Jul 14, 2003 8:03 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Mon Jul 14, 2003 9:01 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

|
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





PostPosted: Mon Jul 14, 2003 9:27 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote


"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





PostPosted: Mon Jul 14, 2003 10:15 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Tue Jul 15, 2003 9:17 am    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Tue Jul 15, 2003 2:24 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Wed Jul 16, 2003 2:16 am    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Wed Jul 16, 2003 4:47 am    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

"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





PostPosted: Wed Jul 16, 2003 5:15 am    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

[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





PostPosted: Wed Jul 16, 2003 8:44 am    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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





PostPosted: Wed Jul 16, 2003 8:19 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

On Wed, 16 Jul 2003 10:44:22 +0200, "S. Balk"
<s.balk (AT) hccnet (DOT) n0spam.nl> wrote or quoted :

Quote:
watch the GC-log

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





PostPosted: Wed Jul 16, 2003 9:37 pm    Post subject: Re: do self references cause memory leaks in Java? Reply with quote

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"
Smile

runFinalizerdOnExit() is deprecated as "inherently unsafe".

Steve

Back to top
Display posts from previous:   
Post new topic   Reply to topic    AppletTalk.com Forum Index -> Java Help All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.