[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RE: [aspectj-users] Aspects holding onto weak references?
|
Hi.
I can assure you that certainly the aspect does not construct a strong
reference. If this was true, a lot of AspectJ programs would have failed
before.
I think the problem might rather be your methodology. System.gc() does
not actually have to perform a GC, neither does System.runFinalization()
have to run finalization.
Eric
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-
> bounces@xxxxxxxxxxx] On Behalf Of Mindaugas Idzelis
> Sent: Tuesday, November 07, 2006 11:17 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: [aspectj-users] Aspects holding onto weak references?
>
>
> I am trying to design an aspect where I grab the stack trace when
> objects are constructed. I would like to display them when the objects
> are destroyed. I would like to do this on the call-side since the
> weaver may not have the source to the target object.
>
> I'm finding that somewhere the aspect is holding a hard reference onto
> the target object. When I run a similar solution without using
aspects,
> it works as expected. Any thoughts on how/why the aspect would prevent
> the collection of the target object?
>
>
> Here's an example aspect to illustrate the problem. The problem is
that
> the "Ref cleared" is never printed out.
>
> public aspect WeakRefProblem {
>
> public static IdentityHashMap stacks = new IdentityHashMap();
>
> public static ReferenceQueue q = new ReferenceQueue();
>
> static {
> new Thread("ref clearing thread") {
> public void run() {
> while (true) {
> try {
> WeakReference r =
> (WeakReference) q.remove();
> Test list = (Test)
> r.get();
>
System.out.println("Ref
> cleared");
> Exception e =
> (Exception) stacks.get(r);
> e.printStackTrace();
> } catch (InterruptedException
> e) {
> e.printStackTrace();
> }
>
> }
> }
> }.start();
> }
>
> after() returning(Test list) : call(Test+.new(..)) {
> WeakReference ref = new WeakReference(list, q);
> stacks.put(ref, new Exception());
> }
>
> }
>
> test program
>
> public class Test {
> public static void main(String[] args) {
>
> Test t = new Test();
>
> t = null;
> for (int i = 0; i < 10; i++) {
>
> System.gc(); // <-- this is where normally,
the
> ref clearing thread will print out "ref cleared"
> System.runFinalization();
> }
>
> }
> }
>
>
> Thanks,
>
> Mindaugas Idzelis