Rather than monkeypatching a custom _weakref module from JyNI (solution #2), it would seem better if we developed a better API, much as I tried to do with the callback scheme in my previous email. This would then let you build an efficient mechanism for your solution #1 and without any problematic "tweaks".
But in doing so, we can also revisit the old scheme of the private static field references being an ArrayList in _weakref.GlobalRef, and the management of AbstractRef objects in it. There easily seem to be additional O(n) and O(n^2) factors in this code that we could eliminate, not to mention possibly also removing the synchronized access, while also providing support for your needs. In part, I'm pretty sure this is due to the fact that weakref was apparently part of Jython 2.1 (anyone want to verify this?), and we really haven't looked at its performance in subsequent releases, just correctness. (I even touched it at one point to change references from Vector to ArrayList, but I did so as part of a general refactoring of the Jython codebase at the end of 2008.)
In general, I'm a big fan of Google Guava collections, which we already use extensively in Jython's implementation; I'm pretty sure we can find a better mapping.
I'm on vacation today through the weekend, so I'm sure I'll have more analysis next week. Looking forward to a good conversation.