Hi Dean,

On Mon, Nov 26, 2018 at 10:44 PM <dean.l...@oracle.com> wrote:
>
> Doesn't the spec say it's the caller's responsibility to keep the class from 
> being unloaded?
>
> "
> A field or method ID does not prevent the VM from unloading the class from 
> which the ID has been derived. After the class is unloaded, the method or 
> field ID becomes invalid. The native code, therefore, must make sure to:
>
> keep a live reference to the underlying class, or
> recompute the method or field ID
>
> if it intends to use a method or field ID for an extended period of time.
>
> The JNI does not impose any restrictions on how field and method IDs are 
> implemented internally.
>
> "
>
>
> however, then the JVMTI spec has errors like JVMTI_ERROR_INVALID_METHODID 
> that seem to imply that the JVM can (or must?) detect an invalid methodid.
>
> dl
>

Yes, I took the fact that JVMTI functions can return
JVMTI_ERROR_INVALID_METHODID to be a requirement that the VM must be
able to detect this, and therefore the jmethodid slot must not move or
be reused.

Thanks, Thomas

> On 11/26/18 11:33 AM, Thomas Stüfe wrote:
>
> Hey JC,
>
> On Mon, Nov 26, 2018 at 8:15 PM JC Beyler <jcbey...@google.com> wrote:
>
> Hi all,
>
> Just added my two cents on one comment:
>
> On Mon, Nov 26, 2018 at 5:00 AM Thomas Stüfe <thomas.stu...@gmail.com> wrote:
>
> Hi Peter,
>
> On Mon, Nov 26, 2018 at 1:02 PM Peter Hull <peterhul...@gmail.com> wrote:
>
> Hi Thomas,
> Thank you very much for the detailed explanation. For your
> information, the relevant NetBeans bug is
> https://issues.apache.org/jira/browse/NETBEANS-1428
>
> On Sat, Nov 24, 2018 at 3:41 PM Thomas Stüfe <thomas.stu...@gmail.com> wrote:
>
> A jmethodid is a pointer to malloc'ed memory.
>
> OK. Just in case I haven't understood it - does this mean a jmethodid,
> once 'created', won't change (after garbage collection or whatever)?
>
> yes. It lives on, unchanged, forever. Even if the associated class is
> unloaded. That must be since outside JNI/JVMTI code may call in with
> outdated jmethodids which we must be able to handle gracefully.
>
> This is the current design and most likely will remain for quite a bit but it 
> is not defined by the SPEC to be like this so, in essence, it is an 
> implementation detail that could be not true in future releases ;-)
>
> I politely disagree :)
>
> JNI spec says that you have a function like this:
>
> jmethodID GetMethodID(..)
>
> returning a jmethodid which you can then use in subsequent JNI
> functions. These functions are required to behave in a predictable way
> if the jmethodid has gotten invalid. The spec has no way to inform the
> caller if a jmethodid has gotten invalid by class unloading. Since the
> jmethodid is handed up to the caller and stored by him, there is no
> way to change its value on the fly either.
>
> So even though the spec does not specifically say that jmethodid lives
> forever, it is laid out in a way that prevents jmethodids from ever
> becoming invalid, and from changing their numerical value. This can of
> course change, but not without changing the JNI spec.
>
> I think my point is that Peter can rely on this behavior without fear
> that it will change in the future without him noticing. Before this
> behavior changes, the JNI spec would have to change.
>
> Cheers, Thomas
>
>
>
>
>
>
>
> Thanks,
> Jc
>
> But it is not guaranteed to work. I would probably rather use a
> hashmap or similar.
>
> I need to look at the implications on more detail but think it would
> make sense to use long/jlong instead of int/jint on all platforms; the
> extra memory use shouldn't be a problem. I think the IDs are just
> stored on the Java side and used to get the method name and signature
> later. That should be a loss-free cast, shouldn't it?
>
> Sure.
>
> If this is
> true, this 4x30bit assumption may actually have worked before jdk8,
> since the java heap is allocated as one continuous space, with the
> PermGen clustered in one part of it.
>
> Indeed we did only start to get crashes on JDK9 and later (only
> observed on Windows, macOS seems OK and other platforms have not been
> tested)
>
> Yours sincerely,
> Peter
>
> Cheers, Thomas
>
>
> --
>
> Thanks,
> Jc
>
>

Reply via email to