Hi Paul,

I was also wondering if there is a compatibility risk involved with the JMM_VERSION change.
So, thanks to Volker for asking these questions.

One more question.
I do not see a backport of the src/jdk.management/share/native/libmanagement_ext/management_ext.c change.
Is it intentional, and if so, what is the reason to skip this file?

Thanks,
Serguei


On 8/20/20 11:30, Volker Simonis wrote:
On Wed, Aug 19, 2020 at 6:17 PM Hohensee, Paul <[email protected]> wrote:
Please review this backport to jdk8u. I especially need a CSR review, since the CSR approval process can be a bottleneck. The patch significantly reduces fleet profiling overhead, and a version of it has been in production at Amazon for over 3 years.



Original JBS issue: https://bugs.openjdk.java.net/browse/JDK-8185003

Original CSR: https://bugs.openjdk.java.net/browse/JDK-8185705

Original patch: http://hg.openjdk.java.net/jdk10/master/rev/68d46cb9be45



Backport JBS issue: https://bugs.openjdk.java.net/browse/JDK-8251494

Backport CSR: https://bugs.openjdk.java.net/browse/JDK-8251498

Backport JDK webrev: http://cr.openjdk.java.net/~phh/8185003/webrev.8u.jdk.05/

JDK part looks good to me.

Backport Hotspot webrev: http://cr.openjdk.java.net/~phh/8185003/webrev.8u.hotspot.05/

HotSpot part looks good to me but see discussion below.


Details of the interface changes needed for the backport are in the Description of the Backport CSR 8251498. The actual functional changes are minimal and low risk.

I've also reviewed the CSR yesterday which I think is fine. But now,
when looking at the implementation, I'm a little concerned about
changing JMM_VERSION from " 0x20010203" to "0x20020000" in "jmm.h".

This might be especially problematic in combination with the changes
in "Management::get_jmm_interface()" which is called by
JVM_GetManagement():

 void* Management::get_jmm_interface(int version) {
 #if INCLUDE_MANAGEMENT
-  if (version == JMM_VERSION_1_0) {
+  if (version == JMM_VERSION) {
     return (void*) &jmm_interface;
   }
 #endif // INCLUDE_MANAGEMENT
   return NULL;
 }

You've correctly fixed the single caller of "JVM_GetManagement()" in
the JDK (in "JNI_OnLoad()" in "management.c"):

-    jmm_interface = (JmmInterface*) JVM_GetManagement(JMM_VERSION_1_0);
+    jmm_interface = (JmmInterface*) JVM_GetManagement(JMM_VERSION);

but I wonder if there are other monitoring/serviceability tools out
there which use this interface and which will break after this change.
A quick search revealed at least two StackOverflow entries which
recommend using "JVM_GetManagement(JMM_VERSION_1_0)" [1,2] and there's
a talk and a blog entry doing the same [3, 4].

I'm not sure how relevant this is but I think a much safer and
backwards-compatible way of doing this downport would be the
following:

- don't change "Management::get_jmm_interface()" (i.e. still check for
"JMM_VERSION_1_0") but return the "new" JMM_VERSION in
"jmm_GetVersion()". This won't break anything but will make it
possible for clients to detect the new version if they want.

- don't change the signature of "DumpThreads()". Instead add a new
version (e.g. "DumpThreadsMaxDepth()/jmm_DumpThreadsMaxDepth()") to
the "JMMInterface" struct and to "jmm_interface" in "management.cpp".
You can do this in one of  the two first, reserved fields of
"JMMInterface" so you won't break binary compatibility.
"jmm_DumpThreads()" will then be a simple wrapper which calls
"jmm_DumpThreadsMaxDepth()" with Integer.MAX_VALUE as depth.

- in the jdk you then simply call "DumpThreadsMaxDepth()" in
"Java_sun_management_ThreadImpl_dumpThreads0()"

I think this way we can maintain full binary compatibility while still
using the new feature. What do you think?

Best regards,
Volker

[1] https://stackoverflow.com/questions/23632653/generate-java-heap-dump-on-uncaught-exception
[2] https://stackoverflow.com/questions/60887816/jvm-options-printnmtstatistics-save-info-to-file
[3] https://sudonull.com/post/25841-JVM-TI-how-to-make-a-plugin-for-a-virtual-machine-Odnoklassniki-company-blog
[4] https://2019.jpoint.ru/talks/2o8scc5jbaurnqqlsydzxv/

Passes the included (suitably modified) test, as well as the tests in



jdk/test/java/lang/management/ThreadMXBean

jdk/test/com/sun/management/ThreadMXBean



Thanks,

Paul

Reply via email to