Roxana
Roxana

Reputation: 11

regarding garbage collection and references

I have a question regarding references and garbage collector in java.

When calling a method with a parameter, let say an array, it is sent a copy of the reference of the array that is considered the parameter.

Hypothesis: the garbage collector is triggered exactly after calling the method, or when executing operations inside the method to the considered array.

Is now the same reference for the array in the calling method and in the called method, regardless of the operations and moves done by the garbage collector (the garbage collector can move the reference from eden to survivor 1)?

A simpler expression for the question: can you rely on this reference copy in order to use it as a mechanism for parameters sent 'by reference'?

Thank you very much! Roxana

Upvotes: 1

Views: 106

Answers (3)

ddyer
ddyer

Reputation: 1786

Some garbage collectors work by finding objects with no references and reclaiming the space they occupy.

Others work by finding all objects with references, and moving them to a new object space. When all objects have been moved, the old object space is reclaimed. In that case, all the references are updated.

Upvotes: 0

AlexR
AlexR

Reputation: 115398

Garbage collector removes object that cannot be accessed by any reference. In your example there are at least 2 references that can be used to access object. Therefore it will not be removed and you can be use references to access it.

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1503729

If you're trying to ask whether you can fake pass by reference like this:

// We'd like to pass x by reference...
String x = "hello";
String[] array = { x };
foo(array);
x = array[0];

...

static void foo(String[] array)
{
    array[0] = array[0] + "foo";
}

... then yes, that will always work, and isn't affected by garbage collection.

I'd personally try to avoid it, but yes, it'll work :)

Note that unlike with real pass-by-reference, if the method throws an exception then the assignment after the method call won't occur, so you'll lose the "change".

Upvotes: 2

Related Questions