diff --git a/404.html b/404.html index 9bf8442097..b92c2f2220 100644 --- a/404.html +++ b/404.html @@ -5452,6 +5452,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/allocation/index.html b/allocation/index.html index 85067b9bf9..3d65195ed7 100644 --- a/allocation/index.html +++ b/allocation/index.html @@ -5628,6 +5628,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/aot/index.html b/aot/index.html index 91afd2d7e2..fe969c7c11 100644 --- a/aot/index.html +++ b/aot/index.html @@ -5512,6 +5512,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-conditionhandling/index.html b/api-conditionhandling/index.html index 3a0f8868fd..05d46e7590 100644 --- a/api-conditionhandling/index.html +++ b/api-conditionhandling/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-cuda/index.html b/api-cuda/index.html index 5ed6fcc8dd..efcbcd668f 100644 --- a/api-cuda/index.html +++ b/api-cuda/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-daa/index.html b/api-daa/index.html index c11ce12bab..372b728a6b 100644 --- a/api-daa/index.html +++ b/api-daa/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-dtfj/index.html b/api-dtfj/index.html index e104140841..ebff1f71c4 100644 --- a/api-dtfj/index.html +++ b/api-dtfj/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-gpu/index.html b/api-gpu/index.html index e4dcb0f673..dce4b5fa14 100644 --- a/api-gpu/index.html +++ b/api-gpu/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-jdk11/index.html b/api-jdk11/index.html index 62dba420d0..ce5bfca704 100644 --- a/api-jdk11/index.html +++ b/api-jdk11/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-jdk17/index.html b/api-jdk17/index.html index 1c7b4804a4..cf75432d9b 100644 --- a/api-jdk17/index.html +++ b/api-jdk17/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-jdk21/index.html b/api-jdk21/index.html index cc86b04fb9..d5458f8b9b 100644 --- a/api-jdk21/index.html +++ b/api-jdk21/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-jdk23/index.html b/api-jdk23/index.html index 7cc028e690..108ea868c9 100644 --- a/api-jdk23/index.html +++ b/api-jdk23/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-jvm/index.html b/api-jvm/index.html index 39179c129e..99942650ef 100644 --- a/api-jvm/index.html +++ b/api-jvm/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-langmgmt/index.html b/api-langmgmt/index.html index c9cde286b1..681ad0d833 100644 --- a/api-langmgmt/index.html +++ b/api-langmgmt/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-overview/index.html b/api-overview/index.html index 56cafc3704..35eed27f60 100644 --- a/api-overview/index.html +++ b/api-overview/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/api-shrc/index.html b/api-shrc/index.html index 40e6ac9ea6..495f26d15d 100644 --- a/api-shrc/index.html +++ b/api-shrc/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/attachapi/index.html b/attachapi/index.html index 8b9b6ab335..e0420fd39d 100644 --- a/attachapi/index.html +++ b/attachapi/index.html @@ -5530,6 +5530,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/builds/index.html b/builds/index.html index 654a59e1f0..7db8706308 100644 --- a/builds/index.html +++ b/builds/index.html @@ -5530,6 +5530,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/cmdline_general/index.html b/cmdline_general/index.html index 46387af968..6fadd027ab 100644 --- a/cmdline_general/index.html +++ b/cmdline_general/index.html @@ -5514,6 +5514,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/cmdline_migration/index.html b/cmdline_migration/index.html index 1cafe4d254..8367ecf907 100644 --- a/cmdline_migration/index.html +++ b/cmdline_migration/index.html @@ -5541,6 +5541,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/cmdline_specifying/index.html b/cmdline_specifying/index.html index 83531f216f..9e30dfcef2 100644 --- a/cmdline_specifying/index.html +++ b/cmdline_specifying/index.html @@ -5523,6 +5523,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/configuring/index.html b/configuring/index.html index 6060508982..57b910e3b4 100644 --- a/configuring/index.html +++ b/configuring/index.html @@ -5620,6 +5620,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/criusupport/index.html b/criusupport/index.html index 4e1dd14de4..d713b83155 100644 --- a/criusupport/index.html +++ b/criusupport/index.html @@ -5556,6 +5556,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/d_jvm_commands/index.html b/d_jvm_commands/index.html index f69c2908ae..58b9e7a225 100644 --- a/d_jvm_commands/index.html +++ b/d_jvm_commands/index.html @@ -5477,6 +5477,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmenableclasscaching/index.html b/dcomibmenableclasscaching/index.html index 195dbeb5e7..67da55215c 100644 --- a/dcomibmenableclasscaching/index.html +++ b/dcomibmenableclasscaching/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmenablelegacydumpsecurity/index.html b/dcomibmenablelegacydumpsecurity/index.html index 369b4e321a..1cbb3fc809 100644 --- a/dcomibmenablelegacydumpsecurity/index.html +++ b/dcomibmenablelegacydumpsecurity/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmenablelegacylogsecurity/index.html b/dcomibmenablelegacylogsecurity/index.html index 03997c8d55..8cff5a9ef1 100644 --- a/dcomibmenablelegacylogsecurity/index.html +++ b/dcomibmenablelegacylogsecurity/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmenablelegacytracesecurity/index.html b/dcomibmenablelegacytracesecurity/index.html index 910f9f555b..18a2f28e95 100644 --- a/dcomibmenablelegacytracesecurity/index.html +++ b/dcomibmenablelegacytracesecurity/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmgpudisable/index.html b/dcomibmgpudisable/index.html index 06c61caaec..1a9a3c4450 100644 --- a/dcomibmgpudisable/index.html +++ b/dcomibmgpudisable/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmgpuenable/index.html b/dcomibmgpuenable/index.html index 72a7e1fc7b..0696be99bd 100644 --- a/dcomibmgpuenable/index.html +++ b/dcomibmgpuenable/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmgpuverbose/index.html b/dcomibmgpuverbose/index.html index 0a18fe4c91..8225960b0e 100644 --- a/dcomibmgpuverbose/index.html +++ b/dcomibmgpuverbose/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmlangmanagementosmxbeaniscputime100ns/index.html b/dcomibmlangmanagementosmxbeaniscputime100ns/index.html index 1ad232de4a..a69d19d8ae 100644 --- a/dcomibmlangmanagementosmxbeaniscputime100ns/index.html +++ b/dcomibmlangmanagementosmxbeaniscputime100ns/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmlangmanagementverbose/index.html b/dcomibmlangmanagementverbose/index.html index 9d1d9f1018..fe6564706f 100644 --- a/dcomibmlangmanagementverbose/index.html +++ b/dcomibmlangmanagementverbose/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmotisharedsharedclassglobalfilterclass/index.html b/dcomibmotisharedsharedclassglobalfilterclass/index.html index 45617eb81f..c147f95f24 100644 --- a/dcomibmotisharedsharedclassglobalfilterclass/index.html +++ b/dcomibmotisharedsharedclassglobalfilterclass/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachcommand_timeout/index.html b/dcomibmtoolsattachcommand_timeout/index.html index 31fe75def9..81ce79533b 100644 --- a/dcomibmtoolsattachcommand_timeout/index.html +++ b/dcomibmtoolsattachcommand_timeout/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachdirectory/index.html b/dcomibmtoolsattachdirectory/index.html index c454ccfb2e..3020104730 100644 --- a/dcomibmtoolsattachdirectory/index.html +++ b/dcomibmtoolsattachdirectory/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachdisplayname/index.html b/dcomibmtoolsattachdisplayname/index.html index e1b32fb327..efa342d0f9 100644 --- a/dcomibmtoolsattachdisplayname/index.html +++ b/dcomibmtoolsattachdisplayname/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachenable/index.html b/dcomibmtoolsattachenable/index.html index 8afcfb0d89..afd31a8418 100644 --- a/dcomibmtoolsattachenable/index.html +++ b/dcomibmtoolsattachenable/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachfileaccessupdatetime/index.html b/dcomibmtoolsattachfileaccessupdatetime/index.html index 17aac5c9b5..3c607d7107 100644 --- a/dcomibmtoolsattachfileaccessupdatetime/index.html +++ b/dcomibmtoolsattachfileaccessupdatetime/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachid/index.html b/dcomibmtoolsattachid/index.html index 7051faf5dd..4a931092cc 100644 --- a/dcomibmtoolsattachid/index.html +++ b/dcomibmtoolsattachid/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachlogging/index.html b/dcomibmtoolsattachlogging/index.html index 4050047ad6..0617f8a381 100644 --- a/dcomibmtoolsattachlogging/index.html +++ b/dcomibmtoolsattachlogging/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachlogname/index.html b/dcomibmtoolsattachlogname/index.html index 743b9dda62..411c7a6d51 100644 --- a/dcomibmtoolsattachlogname/index.html +++ b/dcomibmtoolsattachlogname/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachretry/index.html b/dcomibmtoolsattachretry/index.html index c155056667..599fd7fe69 100644 --- a/dcomibmtoolsattachretry/index.html +++ b/dcomibmtoolsattachretry/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachshutdown_timeout/index.html b/dcomibmtoolsattachshutdown_timeout/index.html index f7288acc80..c8ace12d7b 100644 --- a/dcomibmtoolsattachshutdown_timeout/index.html +++ b/dcomibmtoolsattachshutdown_timeout/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dcomibmtoolsattachtimeout/index.html b/dcomibmtoolsattachtimeout/index.html index bffca80c7b..052cb0b841 100644 --- a/dcomibmtoolsattachtimeout/index.html +++ b/dcomibmtoolsattachtimeout/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dfileencoding/index.html b/dfileencoding/index.html index 110dc6c084..2c96f57d66 100644 --- a/dfileencoding/index.html +++ b/dfileencoding/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/diag_overview/index.html b/diag_overview/index.html index 4be8b29846..c844155d71 100644 --- a/diag_overview/index.html +++ b/diag_overview/index.html @@ -5652,6 +5652,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djavacompiler/index.html b/djavacompiler/index.html index 5142fe8e47..2215cf23a1 100644 --- a/djavacompiler/index.html +++ b/djavacompiler/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djavalangstringbuffergrowaggressively/index.html b/djavalangstringbuffergrowaggressively/index.html index 3b2a5fa576..6c51f64aec 100644 --- a/djavalangstringbuffergrowaggressively/index.html +++ b/djavalangstringbuffergrowaggressively/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djavalangstringsubstringnocopy/index.html b/djavalangstringsubstringnocopy/index.html index 685e38125d..b835178eaa 100644 --- a/djavalangstringsubstringnocopy/index.html +++ b/djavalangstringsubstringnocopy/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativecbc/index.html b/djdknativecbc/index.html index 04ffde25de..91b4c157b8 100644 --- a/djdknativecbc/index.html +++ b/djdknativecbc/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativechacha20/index.html b/djdknativechacha20/index.html index cf5d6970c5..e94c537167 100644 --- a/djdknativechacha20/index.html +++ b/djdknativechacha20/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativecrypto/index.html b/djdknativecrypto/index.html index ed9ae84edf..be0b513f87 100644 --- a/djdknativecrypto/index.html +++ b/djdknativecrypto/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativedigest/index.html b/djdknativedigest/index.html index f1d6c3bdce..bab8347e4e 100644 --- a/djdknativedigest/index.html +++ b/djdknativedigest/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativeec/index.html b/djdknativeec/index.html index a518352e21..6a503c8302 100644 --- a/djdknativeec/index.html +++ b/djdknativeec/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativeeckeygen/index.html b/djdknativeeckeygen/index.html index a6640a662b..2f8e51bc64 100644 --- a/djdknativeeckeygen/index.html +++ b/djdknativeeckeygen/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativegcm/index.html b/djdknativegcm/index.html index 8d40428516..72ece2a508 100644 --- a/djdknativegcm/index.html +++ b/djdknativegcm/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativersa/index.html b/djdknativersa/index.html index d4c5dc8f3c..e92b86131d 100644 --- a/djdknativersa/index.html +++ b/djdknativersa/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativexdhkeyagreement/index.html b/djdknativexdhkeyagreement/index.html index 845c66fc57..7d210660b2 100644 --- a/djdknativexdhkeyagreement/index.html +++ b/djdknativexdhkeyagreement/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/djdknativexdhkeygen/index.html b/djdknativexdhkeygen/index.html index fe4d6ca803..4790ad44f2 100644 --- a/djdknativexdhkeygen/index.html +++ b/djdknativexdhkeygen/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dorgeclipseopenj9criuimmutableenvvars/index.html b/dorgeclipseopenj9criuimmutableenvvars/index.html index 4cae6e43c3..f3518ee194 100644 --- a/dorgeclipseopenj9criuimmutableenvvars/index.html +++ b/dorgeclipseopenj9criuimmutableenvvars/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dump_heapdump/index.html b/dump_heapdump/index.html index 1ea461b559..ee477535b5 100644 --- a/dump_heapdump/index.html +++ b/dump_heapdump/index.html @@ -5660,6 +5660,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dump_javadump/index.html b/dump_javadump/index.html index 1852fa66d4..23a9dea0b5 100644 --- a/dump_javadump/index.html +++ b/dump_javadump/index.html @@ -5672,6 +5672,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/dump_systemdump/index.html b/dump_systemdump/index.html index 786f2f3e0e..98033cde2d 100644 --- a/dump_systemdump/index.html +++ b/dump_systemdump/index.html @@ -5540,6 +5540,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/enhancementstoopenjdksecurity/index.html b/enhancementstoopenjdksecurity/index.html index 3604e19cb7..0b6b41055d 100644 --- a/enhancementstoopenjdksecurity/index.html +++ b/enhancementstoopenjdksecurity/index.html @@ -5514,6 +5514,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/env_var/index.html b/env_var/index.html index 7aaa773b93..e802cb17e5 100644 --- a/env_var/index.html +++ b/env_var/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/gc/index.html b/gc/index.html index 75364e4875..dcf1621860 100644 --- a/gc/index.html +++ b/gc/index.html @@ -5712,6 +5712,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/gc_overview/index.html b/gc_overview/index.html index 3934a6ef86..4a9b699cdf 100644 --- a/gc_overview/index.html +++ b/gc_overview/index.html @@ -5622,6 +5622,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/index.html b/index.html index 29b9371c90..4996bed9d3 100644 --- a/index.html +++ b/index.html @@ -5528,6 +5528,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/interface_dtfj/index.html b/interface_dtfj/index.html index c20406ca47..fca40ea18f 100644 --- a/interface_dtfj/index.html +++ b/interface_dtfj/index.html @@ -5558,6 +5558,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/interface_jvmti/index.html b/interface_jvmti/index.html index cf8824ddee..7a137fc876 100644 --- a/interface_jvmti/index.html +++ b/interface_jvmti/index.html @@ -5807,6 +5807,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • @@ -9468,9 +9489,10 @@

    Overview

    or

    -agentpath:<path-to-agent>=<options>
     
    -

    In the example that follows (see Sample JVMTI agent), the directory containing the jdwp library is assumed to be on the library path. If you require a specific library, such as jdwp, with your JVMTI agent, you can specify the path at startup, for example:

    +

    In the example that follows (see Sample JVMTI agent), the directory containing the jdwp library is assumed to be on the library path. If you require a specific library, such as jdwp, with your JVMTI agent, you can specify the path at startup, for example:

    -agentlib:jdwp=<options>
     
    +

    For more information about -agentlib:jdwp, see -Xrunjdwp.

    For more information about JVMTI, see https://docs.oracle.com/javase/8/docs/technotes/guides/management/index.html.

    For a guide about writing a JVMTI agent, see http://www.oracle.com/technetwork/articles/javase/jvmti-136367.html.

    Eclipse OpenJ9 extensions

    diff --git a/interface_lang_management/index.html b/interface_lang_management/index.html index 8303a53f30..65064164b6 100644 --- a/interface_lang_management/index.html +++ b/interface_lang_management/index.html @@ -5477,6 +5477,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/introduction/index.html b/introduction/index.html index 7e508742fb..ae872c1598 100644 --- a/introduction/index.html +++ b/introduction/index.html @@ -5635,6 +5635,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/jit/index.html b/jit/index.html index 3bc0b46061..6bcede79e8 100644 --- a/jit/index.html +++ b/jit/index.html @@ -5545,6 +5545,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/jitserver/index.html b/jitserver/index.html index 03c2e6273a..642ff38420 100644 --- a/jitserver/index.html +++ b/jitserver/index.html @@ -5581,6 +5581,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/jitserver_tuning/index.html b/jitserver_tuning/index.html index 8e7b0ec133..756a6e73a7 100644 --- a/jitserver_tuning/index.html +++ b/jitserver_tuning/index.html @@ -5632,6 +5632,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/legal/index.html b/legal/index.html index 2581d890da..ec5e18691a 100644 --- a/legal/index.html +++ b/legal/index.html @@ -5461,6 +5461,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/messages_intro/index.html b/messages_intro/index.html index 5048b05eae..8ca2b894b3 100644 --- a/messages_intro/index.html +++ b/messages_intro/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/migrating11to17/index.html b/migrating11to17/index.html index ad3ccdb322..04fca52f87 100644 --- a/migrating11to17/index.html +++ b/migrating11to17/index.html @@ -5523,6 +5523,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/migrating17to21/index.html b/migrating17to21/index.html index 92dac2d474..f0eba24f8d 100644 --- a/migrating17to21/index.html +++ b/migrating17to21/index.html @@ -5523,6 +5523,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/migrating8to11/index.html b/migrating8to11/index.html index 8c460c6ffc..3ee56db51f 100644 --- a/migrating8to11/index.html +++ b/migrating8to11/index.html @@ -5523,6 +5523,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_defaults/index.html b/openj9_defaults/index.html index fc826c8983..3fb1bfc6cb 100644 --- a/openj9_defaults/index.html +++ b/openj9_defaults/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_directories/index.html b/openj9_directories/index.html index a60c83382f..d3469e4fd6 100644 --- a/openj9_directories/index.html +++ b/openj9_directories/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_newuser/index.html b/openj9_newuser/index.html index 841c636eaa..492f27142a 100644 --- a/openj9_newuser/index.html +++ b/openj9_newuser/index.html @@ -5572,6 +5572,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_releases/index.html b/openj9_releases/index.html index b5b3c6e59a..0619b57eca 100644 --- a/openj9_releases/index.html +++ b/openj9_releases/index.html @@ -5475,6 +5475,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_signals/index.html b/openj9_signals/index.html index d44d1752fb..1170074837 100644 --- a/openj9_signals/index.html +++ b/openj9_signals/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openj9_support/index.html b/openj9_support/index.html index 388ac2dcef..711ab80c3d 100644 --- a/openj9_support/index.html +++ b/openj9_support/index.html @@ -5463,6 +5463,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/openssl/index.html b/openssl/index.html index 072c014eac..e189cd368c 100644 --- a/openssl/index.html +++ b/openssl/index.html @@ -5475,6 +5475,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/search/search_index.json b/search/search_index.json index 200aff1051..ce2929c130 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"About the docs","text":""},{"location":"#eclipse-openj9","title":"Eclipse OpenJ9","text":"

    Welcome to the user documentation for the Eclipse OpenJ9\u2122 virtual machine (VM).

    This user documentation supports the configuration, tuning, and diagnosis of the OpenJ9 VM in an OpenJDK runtime. However, due to differences between the Java SE class libraries, specific options might apply only to one Java SE version. Icons are used to indicate where differences apply. For example:

    This sentence applies only to Java 11 binaries that include the OpenJ9 VM. Icons for LTS releases are this colour.

    This sentence applies only to Java 16 or later binaries that include the OpenJ9 VM. Icons for feature releases are this colour.

    To see which Java releases are LTS releases and which are feature releases, and for information about release cadence, supported platforms, and build environments, see Supported environments.

    Note: Documentation to support OpenJ9 is still under construction. The current content covers some high level information about OpenJ9 components together with the command-line options and environment variables that you can use to configure the VM when you start your application. Because OpenJ9 was contributed to the Eclipse Foundation by IBM, this content contains some links to additional information that forms part of the IBM\u00ae SDK, Java\u2122 Technology Edition product documentation in IBM Documentation. That content supplements the documentation here until a more complete set of user documentation is available.

    We welcome contributions to the user documentation. If you would like to get involved, please read our Contribution guidelines. If you spot any errors in the documentation, please raise an issue at our GitHub repository.

    "},{"location":"#supported-environments","title":"Supported environments","text":"

    OpenJDK binaries that contain the OpenJ9 VM are supported on a range of hardware and operating systems. This range is expanding as work progresses at the Eclipse foundation. See the current list of supported environments for details.

    Note: This user guide also contains information about configuring, tuning, and debugging OpenJ9 on the z/OS\u00ae platform.

    "},{"location":"#documentation-for-specific-releases","title":"Documentation for specific releases","text":"

    Several versions of the documentation are available, covering all releases of OpenJ9:

    "},{"location":"#useful-links","title":"Useful links","text":""},{"location":"allocation/","title":"Heap allocation","text":""},{"location":"allocation/#heap-allocation","title":"Heap allocation","text":"

    The process of managing memory in the VM is handled by the allocator and the garbage collector. These components operate on an area of memory that is reserved for VM processing called the Java\u2122 heap.

    The allocator assigns areas of the heap for Java objects. Objects are considered as live when they have a chain of references to them that start from root references, such as those found in thread stacks. When that reference or pointer no longer exists, the objects are considered as garbage.

    The garbage collector reclaims memory by removing objects when they are no longer required. To find out more about the garbage collector, see Garbage collection.

    Depending on your application workload or service level agreement, you can choose from a number of Eclipse OpenJ9\u2122 garbage collection (GC) policies. Each GC policy uses a different strategy to manage memory on the heap. The structure of the heap also depends on the strategy in force. For more information about choosing a GC policy, see Garbage collection policies.

    "},{"location":"allocation/#the-allocator","title":"The allocator","text":"

    The allocator manages pools of free memory and how the free memory is consumed. It is also responsible for allocating areas of storage in the Java heap for objects at the request of applications, class libraries, or the VM.

    In general, allocation requires a heap lock to synchronize concurrent threads that try to access the same area of memory at the same time. When an object is allocated, the heap lock is released. If there is insufficient space to allocate the object, allocation fails, the heap lock is released, and the garbage collector is called. If GC manages to recover some space on the heap, the allocator can resume operations. If GC does not recover enough space, it returns an OutOfMemoryError exception.

    Acquiring a heap lock for every allocation would be an intensive operation with an impact to performance. To get around this problem, small objects are allocated to allocation caches.

    "},{"location":"allocation/#allocation-caches","title":"Allocation caches","text":"

    To improve performance, allocation caches are reserved in the heap for different threads. These allocation caches are known as thread local heaps (TLH) and allow each thread to allocate memory from its cache without acquiring the heap lock. Objects are allocated from the TLH unless there is insufficient space remaining in the TLH to satisfy the request. In this situation, the allocation might proceed directly from the heap for larger objects by using a heap lock or the TLH might be refreshed for smaller objects.

    If a thread allocates a lot of objects, the allocator gives that thread a larger TLH to reduce contention on the heap lock.

    A TLH is predefined with an initial default size of 2 KB. On every TLH refresh, the requested size for that thread is increased by an increment (default 4 KB). The requested size can grow up to a predefined maximum (default 128 KB). If a TLH refresh fails to complete, a GC cycle is triggered.

    After every GC cycle, the requested size of the TLH for each thread is reduced, sometimes by as much as 50%, to take account of threads that reduce their allocation rate and no longer need large TLHs.

    For very inactive threads, the requested size can even drop below the initial value, down to the predefined minimum (512/768 bytes). For very active threads, the maximum TLH requested size might be reached before the next GC occurs.

    Larger TLHs can help reduce heap lock contention, but might also reduce heap utilization and increase heap fragmentation.

    The following options control the requested TLH size:

    Typically, when the maximum TLH size is increased, you should also increase the increment proportionally, so that active threads can reach the maximum requested TLH size more quickly.

    "},{"location":"allocation/#heap-configuration","title":"Heap configuration","text":"

    Depending on the memory management strategy in force, the Java heap can be configured in a number of ways. The simplest configuration consists of a single area of memory, often referred to as a flat heap. Other configurations divide the heap into different areas or regions, which might contain objects of different ages (generations) or sizes.

    "},{"location":"allocation/#area-based-heaps","title":"Area-based heaps","text":"

    The default GC policy for OpenJ9 uses a heap configuration that is divided into two main areas: the nursery area for new object allocation, and the tenure area for objects that continue to be reachable for a longer period of time. Most objects have short lifecycles and can be reclaimed by the garbage collector more quickly by focusing only on the nursery area. Global GC cycles that cause application pauses in order to clear and defragment the tenure area are less frequent.

    "},{"location":"allocation/#soa-and-loa","title":"SOA and LOA","text":"

    All area-based heaps subdivide part of the heap into the Small Object Area (SOA) and the Large Object Area (LOA).

    The allocator initially attempts to allocate objects in the SOA, regardless of size. If the allocation cannot be satisfied the following actions are possible, depending on object size:

    The GC action that is triggered by the allocation failure depends on the GC policy in force.

    The overall size of the LOA is calculated when the heap is initialized, and recalculated at the end of each global GC cycle. The garbage collector can expand or contract the LOA, depending on usage, to avoid allocation failures.

    You can control the size of the LOA by using the -Xloainitial, -Xloaminimum, and -Xloamaximum command line options. If the LOA is not used, the garbage collector contracts the LOA after a few cycles, down to the value of -Xloaminimum. You can also specify -Xnoloa to prevent an LOA being created.

    An SOA and LOA are used by the OpenJ9 GC policies: gencon, optavgpause, and optthruput. For the gencon policy, the LOA and SOA are contained within the tenure area, which is designated for ageing objects. For more information about policies, see Garbage collection policies.

    "},{"location":"allocation/#region-based-heaps","title":"Region-based heaps","text":"

    The Java heap can also be subdivided into multiple regions. The balanced GC policy uses a heap that is divided into thousands of equal size regions in order to manage multiple generations of objects. The metronome GC policy also uses multiple regions, which are grouped by size-class to manage a singe generation of objects. To learn more about how the regions are configured for each policy, see Garbage collection policies.

    In addition to regions, the balanced and metronome policies use structures called arraylets to store large arrays in the heap.

    "},{"location":"allocation/#arraylets","title":"Arraylets","text":"

    A Java heap that is subdivided into regions might not be able to contain a large enough region for data arrays. This problem is solved by using arraylets. An arraylet has a spine, which contains the class pointer and size, and leaves, which contain the data associated with the array. The spine also contains arrayoids, which are pointers to the respective arraylet leaves, as shown in the following diagram.

    There are a number of advantages to using arraylets.

    Note: Despite the general advantage of using arraylets, they can slow down processing when the Java Native Interface (JNI) is being used. The JNI provides flexibility by enabling Java programs to call native code; for example, C or C++, and if direct addressability to the inside of an object is needed, a JNI critical section can be used. However, that requires the object to be in a contiguous region of memory, or at least appear to be so. The JNI, therefore, creates a temporary contiguous array that is the same size as the original array and copies everything, element by element, to the temporary array. After the JNI critical section is finished, everything is copied from the temporary array back to the arraylet, element by element.

    "},{"location":"allocation/#heap-sizing","title":"Heap sizing","text":"

    The overall size of the Java heap is determined by two command-line options, -Xms, which sets the initial size of the heap, and -Xmx, which sets the maximum size of the heap. Finer tuning of the heap depends on the heap configuration that is being used by a GC policy. For example, an LOA within the heap can be sized by using the -Xloainitial, -Xloaminimum, and -Xloamaximum command-line options. A nursery area within the heap can be sized by using the -Xmn, -Xmns, and -Xmnx command-line options. For more information about policies and the heap configurations that are used, see GC policies. To determine the values that are in use for the Java heap, use the -verbose:sizes option when you run your Java application.

    When the Java heap runs out of space, OutOfMemoryError exceptions are generated. If you are confident that your heap settings are appropriate for your application but are still receiving an OutOfMemoryError exception, check the Java dump file that gets automatically generated when the error occurs. A Java dump file can tell you more about what your application was attempting to do at the time of the error. For example, see the Java OutOfMemoryError scenario.

    "},{"location":"allocation/#expansion-and-contraction","title":"Expansion and contraction","text":"

    At startup, the VM allocates a single contiguous area of virtual storage to match the value of -Xmx. By default, this is 25% of the available memory up to a maximum of 25 GB. The actual Java heap size starts at the value set by -Xms and expands automatically, as required, up to the maximum heap size. The VM can also contract the size of the Java heap. Expansion and contraction occur as part of a GC cycle when the VM has exclusive access to the heap. The only GC policy that does not support heap expansion and contraction is the metronome GC policy, where the heap is always fully expanded.

    Note: On operating systems that support paging, the VM allocates a single contiguous area that matches the value of -Xms. Additional memory is committed as the heap expands by using the paging process.

    Expansion occurs to maintain free space on the Java heap for object allocation. By default, the heap is expanded to maintain 30% free space, but this proportion can be adjusted by setting one of the following command-line options:

    If expansion is required, the amount of memory that the heap can expand by is controlled by the following command-line options:

    Expansion can also be triggered if more time is being spent on GC processing than is specified by the -Xmaxt option. In this case, the heap expands by an amount that provides 17% more free space, within the limits imposed by the -Xmine and -Xmaxe values.

    Heap contraction occurs under certain conditions and might be preceded by heap compaction. If the last three GC cycles caused a heap expansion, contraction does not occur. Otherwise, contraction is triggered when the proportion of free heap space that is specified by the -Xmaxf option is reached. The amount of memory to reduce the heap by is calculated to the nearest 1024-byte boundary, down to the minimum size specified for the initial Java heap (-Xms). To prevent heap contraction, set the -Xmaxf value to 1, which sets the maximum free space allowed on the heap to 100%.

    When the heap contracts, physical memory is not released unless paging is supported by the underlying operating system.

    "},{"location":"allocation/#balanced-gc-policy","title":"balanced GC policy","text":"

    For the balanced GC policy, if the -Xminf/-Xmaxf and/or -Xmint/-Xmaxt criteria are not being met and this results in a heap resize, then the heap resize that occurs, happens only on non-eden heap (similar to how these options apply to tenure part for gencon).

    The non-eden heap resizing occurs at the end of a GMP cycle, or global collection. At this point, heap resizing decision is made by observing both -Xmint/-Xmaxt and -Xminf/-Xmaxf and comparing them to the appropriate proportion of time spent in GC, and free heap respectively.

    If either -Xmint/-Xmaxt and/or -Xminf/-Xmaxf criteria are not being met, there is no guarantee that a heap resize will occur. The heap sizing logic is looking at the following two things:

    Since these two criteria may be providing opposite recommendations (for example, lots of free memory, but high % of time in GC) causing oscillations in heap size, the balanced GC heap sizing logic finds a balance between these two criteria.

    "},{"location":"allocation/#compressed-references","title":"Compressed references","text":"

    On 64-bit systems, the VM can use compressed references to decrease the size of Java objects and make better use of the available space in the Java heap. By storing objects in a 32-bit representation, the object size is identical to that in a 32-bit VM, which creates a smaller memory footprint. These 4 byte (32-bit) compressed references are converted to 64-bit values at runtime with minimal overhead. Smaller objects enable larger heap sizes that result in less frequent garbage collection and improve memory cache utilization. Overall, the performance of 64-bit applications that store compressed rather than uncompressed 64-bit object references is significantly improved.

    Compressed references are used by default when the maximum Java heap size is in the range 0 - 57 GB on AIX\u00ae, Linux\u00ae, and Windows\u00ae systems. The upper limit is also 57 GB on z/OS\u00ae systems that have APAR OA49416 installed (25 GB without APAR OA49416). All GC policies observe these limits except for the metronome policy, which can support a heap size of up to 25 GB only with compressed references.

    When the VM uses compressed references, classes, threads, and monitors are stored in the lowest 4 GB of address space. However, this area of memory is also used by native libraries, the operating system, and for small Java heaps. If you receive native memory OutOfMemoryError exceptions in the lowest 4 GB when running with compressed references enabled, these errors might result from the lowest 4 GB of address space becoming full. Try specifying a large heap with the -Xmx option, which puts the Java heap into a higher area of address space or using the -Xmcrs option to reserve space in the lowest 4 GB of address space for compressed references.

    To turn off compressed references, use the -Xnocompressedrefs command-line option.

    "},{"location":"aot/","title":"AOT Compiler","text":""},{"location":"aot/#ahead-of-time-aot-compiler","title":"Ahead-Of-Time (AOT) compiler","text":"

    The AOT compiler dynamically compiles Java methods into native AOT code at runtime and stores them in the shared classes cache. This activity enables the VM to start an application faster the next time it runs because it doesn't need to spend time interpreting Java methods. The VM automatically chooses which methods should be AOT-compiled based on heuristics that identify the start-up phase of large applications. AOT code is always used in combination with class data sharing and is enabled automatically when -Xshareclasses is set on the command line. When a cached AOT method is run it might also be optimized further by the Just-In-Time (JIT) compiler.

    If you want to turn off AOT compilation and disable the use of AOT-compiled code, set the -Xnoaot suboption. When the AOT compiler is disabled, the JIT compiles frequently used methods into native code. However, because the JIT compiler operates while the application is running, the startup time for an application will increase.

    "},{"location":"aot/#see-also","title":"See also","text":""},{"location":"api-conditionhandling/","title":"Condition exception handling","text":""},{"location":"api-conditionhandling/#condition-handling-api-documentation","title":"Condition Handling API documentation","text":""},{"location":"api-cuda/","title":"CUDA4J","text":""},{"location":"api-cuda/#cuda4j-api-documentation","title":"CUDA4J API documentation","text":""},{"location":"api-daa/","title":"Data access acceleration","text":""},{"location":"api-daa/#data-access-acceleration-api-documentation","title":"Data access acceleration API documentation","text":""},{"location":"api-dtfj/","title":"DTFJ","text":""},{"location":"api-dtfj/#dtfj-api-documentation","title":"DTFJ API documentation","text":""},{"location":"api-gpu/","title":"GPU","text":""},{"location":"api-gpu/#gpu-api-documentation","title":"GPU API documentation","text":""},{"location":"api-jdk11/","title":"Java 11 API","text":""},{"location":"api-jdk11/#openj9-jdk-11-api-documentation","title":"OpenJ9 JDK 11 API documentation","text":""},{"location":"api-jdk17/","title":"Java 17 API","text":""},{"location":"api-jdk17/#openj9-jdk-17-api-documentation","title":"OpenJ9 JDK 17 API documentation","text":""},{"location":"api-jdk21/","title":"Java 21 API","text":""},{"location":"api-jdk21/#openj9-jdk-21-api-documentation","title":"OpenJ9 JDK 21 API documentation","text":""},{"location":"api-jdk23/","title":"Java 23 API","text":""},{"location":"api-jdk23/#openj9-jdk-23-api-documentation","title":"OpenJ9 JDK 23 API documentation","text":""},{"location":"api-jvm/","title":"JVM diagnostic utilities","text":""},{"location":"api-jvm/#jvm-diagnostic-utilities-api-documentation","title":"JVM diagnostic utilities API documentation","text":""},{"location":"api-langmgmt/","title":"Monitoring and management","text":""},{"location":"api-langmgmt/#monitoring-and-management-api-documentation","title":"Monitoring and management API documentation","text":""},{"location":"api-overview/","title":"Overview","text":""},{"location":"api-overview/#api-documentation","title":"API documentation","text":"

    The Eclipse OpenJ9\u2122 VM provides supplementary application programming interfaces and extensions, which can be used to improve performance, assist with problem determination, or help monitor and manage the OpenJ9 VM. The documentation also includes links to the API documentation for the Java\u2122 SE and JDK reference implementation.

    "},{"location":"api-overview/#native-data-operations","title":"Native data operations","text":"

    If your Java application manipulates native data, the Data Access Accelerator API package (com.ibm.dataaccess) can help improve application performance. Classes are available for the following types of operation:

    "},{"location":"api-overview/#gpu-acceleration","title":"GPU acceleration","text":"

    You can improve the performance of your applications by offloading certain processing functions from your processor (CPU) to a graphics processing unit (GPU). If your application contains code that would benefit from parallel processing, you can use the CUDA4J API package (com.ibm.cuda) to specify in your code when to offload processing to the GPU. You can also use the GPU API package (com.ibm.gpu) to accelerate certain Java functions, such as sort operations.

    "},{"location":"api-overview/#problem-determination","title":"Problem determination","text":"

    The JVM diagnostic utilities API package (com.ibm.jvm) provides classes for controlling dump, log, and trace operations.

    The Diagnostic Tool Framework for Java (DTFJ) API packages (com.ibm.dtfj.*) allow custom applications to be written that can access a wide range of information in a system dump or a Java dump.

    "},{"location":"api-overview/#monitoring-and-management","title":"Monitoring and management","text":"

    The shared classes API package (com.ibm.oti.shared) provides a large number of classes for managing permissions, finding and storing classes and byte data, and obtaining statistics about a shared classes cache. Classes are also available to enable class sharing for a custom class loader implementation.

    OpenJ9 includes MXBean extensions to the java.lang.management API (com.ibm.lang.management and openj9.lang.management), which can be used to monitor and manage the VM. These extensions provide access to information about the state of the OpenJ9 VM and the environment in which it is running.

    "},{"location":"api-shrc/","title":"Shared classes","text":""},{"location":"api-shrc/#shared-classes-api-documentation","title":"Shared classes API documentation","text":""},{"location":"attachapi/","title":"Java Attach API","text":""},{"location":"attachapi/#java-attach-api","title":"Java Attach API","text":"

    With the Attach API, your application can connect to a running VM and load an agent into that VM to run tasks. The typical use case for this feature is to load an agent that can be used to monitor the application that's running in the target VM.

    For example, if you wanted to start monitoring an application that is already running with the Attach API enabled, you can use a tool such as the IBM Health Center. In this case, a Health Center agent can start in its own VM and attach to the target VM where the application is running to start recording and sending data to the Health Center client.

    The Eclipse OpenJ9\u2122 implementation of the Attach API is equivalent to the reference implementation (API documentation is available on the Oracle website). However, you can use the Attach API only to connect to another OpenJ9 VM.

    When you run a Java\u2122 application, VM support for the Attach API is enabled by default on all platforms except z/OS\u00ae. For security reasons on z/OS, processes that use the default z/OS OMVS segment cannot enable the Attach API.

    To enable or disable the Attach API, use the -Dcom.ibm.tools.attach.enable=[yes|no] command line option.

    "},{"location":"attachapi/#securing-the-attach-api","title":"Securing the Attach API","text":"

    Because the Attach API can be used to connect to a running application, you must control access to it to ensure that only authorized users or processes can use it. Disable the Attach API if you do not intend to use it.

    If you do not want to disable the Attach API but want to control the unauthorized dynamic loading of agents into the VM by using the Attach API, use the -XX:-EnableDynamicAgentLoading option.

    On Windows\u2122 systems, the Attach API uses the system temporary directory, which is typically C:\\Users\\<USERNAME>\\AppData\\Local\\Temp. The Attach API creates a common subdirectory, which is .com_ibm_tools_attach by default. Because files and directories in the system temporary directory are handled by Windows security, only the process owner can connect to their processes.

    On UNIX systems, the Attach API uses /tmp and creates a common subdirectory, which is .com_ibm_tools_attach by default. The common subdirectory must be on a local drive, not a network drive. Security is handled by POSIX file permissions. The Attach API directory must be owned by root user and must have read, write, and execute file permissions for user, group, and other (drwxrwxrwx). The sticky bit is set so that only the owner and root can delete or rename files or directories within it. A process that uses the Java Attach API must be owned by the same UNIX user ID as the target process.

    ~/tmp $ ls -al\ntotal 0\ndrwxr-xr-x   3 user_a staff    96  6 Aug 17:11 .\ndrwxr-xr-x+ 89 user_a staff  2848  6 Aug 17:11 ..\ndrwxrwxrwx+  7 root   staff   224  6 Aug 17:22 .com_ibm_tools_attach\n

    In the default Attach API directory, you can find certain files that start with an underscore _*, which are involved in synchronization. By default, any user that has read and write permissions can own these files. The files are empty and are automatically re-created if deleted. A user might interfere with the functioning of the Attach API by modifying the file permissions. To prevent such an interference, you can protect the file permissions by setting root as the owner of the files.

    When your application attaches to a VM, a process directory is created.

    ~/tmp/.com_ibm_tools_attach $ ls -l\ntotal 3\n-rw-rw-rw-  1 user_a  staff    0  6 Aug 17:12 _attach_lock\n-rw-rw-rw-  1 user_a  staff    0  6 Aug 17:12 _controller\n-rw-rw-rw-  1 user_a  staff    0  6 Aug 17:12 _notifier\ndrwx--x--x  6 user_b  staff  192  6 Aug 17:21 process_a\n

    The files in the subdirectory for a process, with the exception of a lock file, are accessible only by the owner of a process. The permissions for these files are rwxr-xr-x with the exception of the attachNotificationSync file, as shown in the following example.

    ~/tmp/.com_ibm_tools_attach/process_a $ ls -l\ntotal 4\n-rwxrw-rw-  1 user_b  staff  0  6 Aug 17:18 attachNotificationSync\n-rwxr-xr-x  1 user_b  staff  0  6 Aug 17:21 file_a\n-rwxr-xr-x  1 user_b  staff  0  6 Aug 17:21 file_b\n-rwxr-xr-x  1 user_b  staff  0  6 Aug 17:21 file_c\n

    Notes for z/OS:

    "},{"location":"attachapi/#configuring","title":"Configuring","text":"

    A number of system properties are available to configure the Attach API when you start a Java application, as shown in the following table:

    System property Description -Dcom.ibm.tools.attach.directory=<directory_name> Specify a different common directory for Attach API working files. -Dcom.ibm.tools.attach.displayName=<my_display_name> Change the display name recorded by an agent -Dcom.ibm.tools.attach.id=<my_vm_ID> Change the VM identifier recorded by an agent -Dcom.ibm.tools.attach.timeout=<value_in_milliseconds> Change the connection timeout -Dcom.ibm.tools.attach.shutdown_timeout=<value_in_milliseconds> Specify the timeout for ending the Attach API wait loop thread -Dcom.ibm.tools.attach.command_timeout=<value_in_milliseconds> Specify the timeout for sending a command to the target VM after initial attachment -Dcom.ibm.tools.attach.retry=<number_of_retries> Specify the number of times the jcmd tool retries attaching to a running VM when the tool encounters the SocketException error on Windows platform

    To learn more about each property, click the link in the table.

    "},{"location":"attachapi/#troubleshooting","title":"Troubleshooting","text":"

    Problems with the Attach API generate one of the following exceptions:

    Exceptions from agents on the target VM go to stderr or stdout for the target VM. These exceptions are not reported in the output of the attaching VM.

    Here are some problems that you might encounter:

    If you have checked for these potential issues but you are still experiencing problems, a number of command line system properties are available to help narrow down the cause. These options are shown in the following table:

    System property Description -Dcom.ibm.tools.attach.logging=<yes|no> Turn on tracing of attach API events -Dcom.ibm.tools.attach.log.name=<my_log_name> Specify the path and prefix for the log files

    To learn more about each property, click the link in the table.

    "},{"location":"builds/","title":"OpenJ9 builds","text":""},{"location":"builds/#eclipse-openj9-builds","title":"Eclipse OpenJ9 builds","text":"

    Eclipse Foundation projects are not permitted to distribute, market or promote JDK binaries unless they have passed a Java SE Technology Compatibility Kit licensed from Oracle, to which the Eclipse OpenJ9\u2122 project does not currently have access. See the Eclipse Adoptium Project Charter.

    "},{"location":"builds/#supported-platforms","title":"Supported platforms","text":"

    The community develops and maintains a test infrastructure for the OpenJ9 source across a broad range of platforms. For information about the platforms and minimum operating system levels supported, see the Platform support matrix.

    "},{"location":"builds/#building-your-own-binaries","title":"Building your own binaries","text":"

    If you want to build your own binaries of OpenJDK with OpenJ9, a complete set of build instructions for several platforms can be found in the OpenJ9 GitHub repository.

    "},{"location":"builds/#installation-pre-requisites","title":"Installation pre-requisites","text":"

    Note the following:

    "},{"location":"cmdline_general/","title":"Standard options","text":""},{"location":"cmdline_general/#standard-command-line-options","title":"Standard command-line options","text":"

    The Eclipse OpenJ9\u2122 virtual machine supports the standard Java\u2122 options that are common to all Java virtual machine implementations, including Oracle's HotSpot VM. Some of the common options supported are summarised in the following table:

    Standard option name Purpose -classpath:<resource_name>[:<resource_name>] Sets the search path for application classes and resources (directories and compressed or .jar files). cp can be used instead of classpath. -help, -? Prints a usage message. -fullversion Prints the build and version information for a VM -showversion Prints product version and continues. -verbose:<option>[,<option>] Enables verbose output. Options include class, dynload, gc, init, jni, sizes, stack, and module. (See Notes) -version Prints the full build and version information a VM

    Notes:

    For more information about standard options, see Oracle Java SE Standard Options

    "},{"location":"cmdline_general/#openj9-extensions","title":"OpenJ9 extensions","text":"

    OpenJ9 supports the following extension to the -verbose option:

    "},{"location":"cmdline_migration/","title":"Switching to OpenJ9","text":""},{"location":"cmdline_migration/#switching-to-eclipse-openj9","title":"Switching to Eclipse OpenJ9","text":"

    If you are already familiar with HotSpot command-line options but want the advantages of Eclipse OpenJ9\u2122, the following information will prove helpful. In all cases, check individual topics for minor discrepancies in the way these options might work.

    Note: For information about HotSpot equivalences and differences for items other than command-line options, see New to Eclipse OpenJ9?

    "},{"location":"cmdline_migration/#compatible-options","title":"Compatible options","text":"

    You can use the following command-line options in OpenJ9, just as you did in HotSpot; you can continue to use the HotSpot option in OpenJ9 without having to change your code:

    Option Usage -X Displays help on nonstandard options. -Xbootclasspath Specifies the search path for bootstrap classes and resources. -Xcheck:jni Runs additional checks for JNI functions during VM startup. -Xfuture Turns on strict class-file format checks. -Xint Runs an application in interpreted-only mode. -Xlog Some forms of -Xlog that enable garbage collection logging are recognized. (Equivalent to -Xverbosegclog). -Xmn Sets the initial and maximum size of the new area when using -Xgcpolicy:gencon. -Xms Sets the initial size of the heap. (Equivalent to -XX:InitialHeapSize) -Xmx Specifies the maximum size of the object memory allocation pool. (Equivalent to -XX:MaxHeapSize) -Xnoclassgc Disables class garbage collection (GC). -Xrs Prevents the OpenJ9 run time environment from handling signals. -Xss Sets the Java\u2122 thread stack size. (Equivalent to -XX:ThreadStackSize). Note: Unlike HotSpot, this option applies only to the Java stack. OpenJ9 has a separate native stack for operating system threads (see -Xmso) -Xverify:mode Enables or disables the verifier. -XX:ConcGCThreads Configures the number of GC mutator background threads. -XX:[+|-]AlwaysPreTouch Enables or disables committing of memory during initial heap inflation or heap expansion. -XX:[+|-]CompactStrings Enables or disables String compression. Note: This option is enabled by default in OpenJ9 on Java 11 and later. In the earlier versions, this option is disabled by default. -XX:DiagnoseSyncOnValueBasedClasses=<number> Configure warnings for value-based classes. -XX:[+|-]DisableExplicitGC Enables or disables explicit System.gc() calls. (Alias for -Xdisableexplicitgc / -Xenableexplicitgc) -XX:[+|-]ExitOnOutOfMemoryError Triggers VM shutdown on out-of-memory conditions. -XX:[+|-]HeapDumpOnOutOfMemory Enables or disables dumps on out-of-memory conditions. -XX:HeapDumpPath Specifies a directory for all VM dumps including heap dumps, javacores, and system dumps. (Alias for -Xdump:directory) -XX:[+|-]IgnoreUnrecognizedVMOptions Specifies whether to ignore unrecognized top-level VM options. -XX:InitialHeapSize Sets the initial size of the heap. (Alias for -Xms) -XX:InitialRAMPercentage Sets the initial size of the Java heap as a percentage of total memory. -XX:MaxDirectMemorySize Sets a limit on the amount of memory that can be reserved for all direct byte buffers. -XX:MaxHeapSize Specifies the maximum size of the object memory allocation pool. (Alias for -Xmx) -XX:MaxRAMPercentage Sets the maximum size of the Java heap as a percentage of total memory. -XX:OnOutOfMemoryError Runs specified commands when a java.lang.OutOfMemoryError is thrown. (Equivalent to -Xdump:tool:events=systhrow,filter=java/lang/OutOfMemoryError,exec=) -XX:ParallelCMSThreads Configures the number of GC mutator background threads. -XX:ParallelGCThreads Configures the number of GC threads. -XX:[+|-]PrintCodeCache Prints code cache usage when the application exits. -XX:[+|-]ShowHiddenFrames Specifies whether generated hidden MethodHandle frames are displayed in a stack trace. Note: Unlike HotSpot, this option doesn't require the +UnlockDiagnosticVMOptions option. -XX:[+|-]UseCompressedOops Disables compressed references in 64-bit JVMs. (See also -Xcompressedrefs) -XX:[+|-]UseContainerSupport Sets a larger fraction of memory to the Java heap when the VM detects that it is running in a container."},{"location":"cmdline_migration/#equivalent-options","title":"Equivalent options","text":"

    These HotSpot command-line options have equivalents in OpenJ9 that are not specified in the same way, but perform a related function:

    HotSpot Option OpenJ9 Option Usage -Xcomp -Xjit:count=01 -Xcomp disables interpreted method invocations. -Xgc -Xgcpolicy2 Configuring your garbage collection policy. -XX:+UseNUMA -Xnuma:none3 Controls non-uniform memory architecture (NUMA) awareness.

    Notes:

    1. HotSpot uses -Xcomp to force compilation of methods on first invocation. However, this option is deprecated. Whilst it can be used for compatibility, using -Xjit:count=0 is preferred.

    2. HotSpot uses -Xgc to both select policies and configure them; OpenJ9 uses -Xgcpolicy to select policies, reserving -Xgc for configuration.

    3. In HotSpot, NUMA awareness is turned off by default and is turned on by using the -XX:+UseNUMA option. Conversely, the OpenJ9 VM automatically enables NUMA awareness and uses -Xnuma:none to turn it off.

      • If you were previously using HotSpot in its default mode, you must now explicitly turn off NUMA awareness in OpenJ9.
      • If you are used to using -XX:+UseNUMA in HotSpot, you no longer need to explicitly turn on NUMA awareness; it's on by default.
    "},{"location":"cmdline_migration/#creating-compatible-behavior","title":"Creating compatible behavior","text":"

    You can set the following options to make OpenJ9 behave in the same way as HotSpot.

    Option Usage -Djava.lang.string.substring.nocopy=true Avoid String sharing by String.substring(). -Xnuma:none Disable non-uniform memory architecture (NUMA) awareness. -XX:[+|-]HandleSIGABRT Force handling of SIGABRT signals to be compatible with HotSpot."},{"location":"cmdline_migration/#compatible-environment-variables","title":"Compatible environment variables","text":"

    The JAVA_TOOL_OPTIONS environment variable can be used to set command line options as described in OpenJ9 command-line options and Environment variables.

    "},{"location":"cmdline_specifying/","title":"Specifying options","text":""},{"location":"cmdline_specifying/#eclipse-openj9-command-line-options","title":"Eclipse OpenJ9 command-line options","text":"

    When you start a Java\u2122 application you can specify various options on the command line to configure the runtime environment. These options include:

    Although the command line is the traditional way to specify command-line options, you can also pass options to the Eclipse OpenJ9\u2122 virtual machine (VM) by using a manifest file, options files, and environment variables.

    Options specified on the command line override the equivalent environment variables. For example, specifying java -cp <dir1> completely overrides setting the environment variable CLASSPATH=<dir2>.

    "},{"location":"cmdline_specifying/#quotation-marks","title":"Quotation marks","text":"

    Use single or double quotation marks for command-line options only when explicitly directed to do so. Single and double quotation marks have different meanings on different platforms, operating systems, and shells. Do not use '-X<option>' or \"-X<option>\". Instead, you must use -X<option>. For example, do not use '-Xmx500m' and \"-Xmx500m\". Write this option as -Xmx500m.

    "},{"location":"cmdline_specifying/#precedence","title":"Precedence","text":"

    The sequence of the Java options on the command line defines which options take precedence during startup. Rightmost options have precedence over leftmost options. In the following example, the -Xjit option takes precedence:

    java -Xint -Xjit myClass\n

    At startup, the list of VM arguments is constructed in the following order, with the lowest precedence first:

    1. Certain options are created automatically by the VM, which specify arguments such as search paths and version information. The VM automatically adds -Xoptionsfile=<path>/options.default at the beginning of the command line, where <path> is the path to the VM directory.

      You can modify the options.default file to include any options that you want to specify for your application instead of entering these options on the command line. For more information about the path and construction of the file, see -Xoptionsfile.

    2. Options can be specified in an executable JAR file by using the META-INF/MANIFEST.MF file. Options are placed in the main section in a header named IBM-Java-Options. Only one IBM-Java-Options header is permitted, but the header can contain multiple options, separated by spaces. A long sequence of options can be split using a header continuation but are treated as a single line.

      Example manifest file:

      Manifest-Version: 1.0\nClass-Path: .\nMain-Class: HelloWorld\nIBM-Java-Options: -Xshareclasses:name=mycache,nonfa\n tal,cacheDirPerm=1000 -Dproperty=example -Da.long.system.pro\n perty=\"this is a long system property value to\n  demonstrate long VM arguments\n in the manifest file\"\n

      This example manifest file is parsed as the following string:

      -Xshareclasses:name=mycache,nonfatal,cacheDirPerm=1000\n-Dproperty=example\n-Da.long.system.property=this is a long system property value to\ndemonstrate long VM arguments in the manifest file\n

      Options specified in the manifest file are subject to the same restrictions as options files. For more information, see the -Xoptionsfile topic in the user guide.

    3. Environment variables that are described in OpenJ9 environment variables are translated into command-line options. For example, the following environment variable adds the parameter -Xrs to the list of arguments:

      • On Windows\u2122 systems:

        set IBM_NOSIGHANDLER=<non_null_string>\n
      • On AIX\u00ae, Linux\u00ae, macOS\u00ae, and z/OS\u00ae systems:

        export IBM_NOSIGHANDLER=<non_null_string>\n
    4. The OPENJ9_JAVA_OPTIONS environment variable. You can set command-line options using this environment variable. The options that you specify with this environment variable are added to the command line when a VM starts in that environment. The environment variable can contain multiple blank-delimited argument strings, but must not contain comments. For example:

      • On Windows systems:

        set OPENJ9_JAVA_OPTIONS=-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump\n
      • On AIX, Linux, macOS, and z/OS systems:

        export OPENJ9_JAVA_OPTIONS=\"-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump\"\n

      Note: The environment variable JAVA_TOOL_OPTIONS is equivalent to OPENJ9_JAVA_OPTIONS and is available for compatibility with JVMTI. The equivalent IBM_JAVA_OPTIONS environment variable is deprecated and will be removed in a future release.

    5. Options that are specified on the command line. For example:

      java -Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump MyJavaClass\n

      The Java launcher adds some automatically generated arguments to this list, such as the names of the main class.

    6. The _JAVA_OPTIONS environment variable. You can override previous options using this environment variable. The options that you specify with this environment variable are added to the end of the command line when a VM starts in that environment. The environment variable can contain multiple blank-delimited argument strings, but must not contain comments. For example:

      • On Windows systems:

        set _JAVA_OPTIONS=-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump\n
      • On AIX, Linux, macOS, and z/OS systems:

        export _JAVA_OPTIONS=\"-Dmysysprop1=tcpip -Dmysysprop2=wait -Xdisablejavadump\"\n

    You can also use the -Xoptionsfile parameter to specify VM options. This parameter can be used on the command line, or as part of the OPENJ9_JAVA_OPTIONS environment variable. The contents of an option file are expanded in place during startup. For more information about the structure and contents of this type of file, see -Xoptionsfile.

    To troubleshoot startup problems, you can check which options are used by the OpenJ9 VM. Append the following command-line option, and inspect the Java core file that is generated:

    -Xdump:java:events=vmstart\n

    Here is an extract from a Java core file that shows the options that are used:

        2CIUSERARG               -Xdump:java:file=/home/test_javacore.txt,events=vmstop\n    2CIUSERARG               -Dtest.cmdlineOption=1\n    2CIUSERARG               -XXallowvmshutdown:true\n    2CIUSERARG               -Xoptionsfile=test1.test_options_file\n
    "},{"location":"configuring/","title":"Configuring your system","text":""},{"location":"configuring/#configuring-your-system","title":"Configuring your system","text":"

    Configuring your local system can help you optimize the runtime environment for your Java application. Options include setting operating system environment variables and configuring system resources so that Eclipse OpenJ9\u2122 can exploit the underlying operating system and hardware capabilities.

    When you install a Java\u2122 runtime environment on your system you can set the PATH environment variable so that the operating system can find the Java programs and utilities to run your application. To tell your application where to find user classes, you can use the -cp option or set the CLASSPATH environment variable. However, if you set CLASSPATH globally, all invocations of Java are affected. How to set these environment variables is covered in many publications about Java, such as The Java Tutorials: PATH and CLASSPATH.

    On some systems, a further environment variable might be required if your application requires shared libraries but does not specify their exact location. You can set the following environment variables to specify the directory location of the shared libraries, although setting a global value affects all invocations of Java:

    Although most Java applications should run without changing anything on the underlying system, a unique pre-requisite exists for AIX systems on OpenJDK version 11 and later; you must have the 16.1 XL C++ Runtime installed.

    "},{"location":"configuring/#setting-resource-limits-aix-linux-and-macos","title":"Setting resource limits (AIX, Linux, and macOS)","text":"

    The operating system sets resource limits for a shell, and to processes started by the shell, to ensure that a single process cannot consume all available resources. However, these limits can affect certain operations that might need to run for a Java application, such as producing a dump file.

    "},{"location":"configuring/#setting-ulimit-values","title":"Setting ulimit values","text":"

    Some resource limits are controlled by the ulimit command. A soft limit is the value set by the kernel for a resource and a hard limit imposes a maximum value on the soft limit. A privileged process can change either limit, but an unprivileged process can change only its soft limit (between 0 and the hard limit) or irreversibly lower its hard limit. To see the current limits set for a system, run ulimit -a. The output is similar to the following example:

    core file size          (blocks, -c) 0\ndata seg size           (kbytes, -d) unlimited\nfile size               (blocks, -f) unlimited\nmax locked memory       (kbytes, -l) unlimited\nmax memory size         (kbytes, -m) unlimited\nopen files                      (-n) 256\npipe size            (512 bytes, -p) 1\nstack size              (kbytes, -s) 8192\ncpu time               (seconds, -t) unlimited\nmax user processes              (-u) 2784\nvirtual memory          (kbytes, -v) unlimited\n

    To show hard limits, use ulimit -Ha.

    You can change limits for specific resources on a temporary basis by running the ulimit command. Alternatively, you can store limit settings in a configuration file, which is /etc/security/limits for AIX or etc/security/limits.conf for Linux. For more information about configuring resource limits, refer to the documentation for your operating system.

    The main use case for changing ulimit resources is when enabling a system dump to ensure that all the required data can be collected for analysis. For more information, see Enabling a full system dump.

    "},{"location":"configuring/#setting-shared-memory-values","title":"Setting shared memory values","text":"

    Another use case for changing resource limits is to ensure that there is sufficient shared memory allocated for class data sharing. By default, the shared classes cache consists of memory-mapped files that are created on disk and persist when the system is restarted. If you choose to use non-persistent caches by setting the -Xshareclasses:nonpersistent option, caches are not retained on startup and are allocated by using the System V IPC shared memory mechanism.

    Note: The virtual address space of a process is shared between the shared classes cache and the Java heap. Increasing the maximum size for the shared classes cache might reduce the size of the Java heap that you can create.

    Shared memory limits are also important when configuring large page memory allocation on Linux systems. For more information, see Configuring large page memory allocation: Linux systems.

    "},{"location":"configuring/#setting-resource-limits-zos","title":"Setting resource limits (z/OS)","text":"

    Resource limits imposed by z/OS might affect Java operations. To learn how these resource limits are set, see Customizing the BPXPRMxx member of SYS1.PARMLIB.

    The OpenJ9 class data sharing feature is implemented by using shared memory segments on z/OS. Special consideration should be given to the following parameters that relate to the shared memory and IPC semaphore settings:

    Incorrect or suboptimal settings might prevent shared classes from working or impact performance. By default, the VM attempts to create a 16 MB cache on Java 8 and a 300 MB cache on Java 11 and later. If you set a cache size for your application by specifying the -Xscmx option on the command line, the VM rounds the value up to the nearest megabyte. Ensure that the value set for IPCSHMMPAGES takes this adjustment into consideration.

    To see the current settings, enter the following z/OS operator command:

    D OMVS,O\n

    The suggested minimum values for Java applications are shown in the following table:

    Parameter Value MAXPROCSYS 900 MAXPROCUSER 512 MAXUIDS 500 MAXTHREADS 10000 MAXTHREADTASKS 5000 MAXASSIZE 2147483647 MAXCPUTIME 2147483647 MAXMMAPAREA 40960 IPCSHMSPAGES 262144 IPCSHMMPAGES 25600 IPCSHMNSEGS 10 IPCSEMNIDS 500 IPCSEMNSEMS 1000 SHRLIBRGNSIZE 67 108 864

    Note: The number of threads that can be created by a Java process is limited by the lower of the two values for MAXTHREADS and MAXTHREADSTASKS.

    You can change these settings dynamically without re-IPLing the system. For example, to set MACPROCUSER to 256, run SETOMVS MAXPROCUSER=256

    z/OS uses region sizes to determine the amount of storage available to running programs. For a Java runtime environment, the region size must be sufficiently large to avoid storage related error messages or abends. Rather than restricting region size, allow the VM to use what it needs. Region size can be affected by one of the following parameters: JCL REGION, BPXPRMxx MAXASSIZE, the RACF OMVS segment ASSIZEMAX, or IEFUSI (Step initiation exit).

    SHRLIBRGNSIZE controls how much storage is reserved in each address space for mapping shared DLLs that have the +l extended attribute set. If this storage space is exceeded, DLLs are loaded into the address space instead of using a single copy of z/OS UNIX System Services storage that is shared between the address spaces. The z/OS command D OMVS,L shows the SHRLIBRGNSIZE size and peak usage. If this size is set to a much higher value than is needed, the Java application might have problems acquiring native storage. These problems can cause a z/OS abend, such as 878-10, or a Java OutOfMemoryError.

    "},{"location":"configuring/#configuring-language-environment-runtime-options","title":"Configuring Language Environment runtime options","text":"

    Language Environment\u00ae runtime options affect performance and storage usage. These options can be optimized for your application.

    Runtime options are typically embedded in programs by using #pragma runopts settings. In many cases, these options provide suitable default values that are known to produce good performance results. However, these options can be overridden to tune the runtime environment of your application.

    On 64-bit z/OS systems, the following runtime options affect Java applications:

    A suitable MEMLIMIT value is also required. The OpenJ9 VM requirement is the sum of the following amounts:

    Note: If you intend to use the Concurrent Scavenge mode of the default Generational Concurrent (gencon) garbage collection policy by using hardware-based support, the virtual storage used might exceed the Java maximum heap size. Set the z/OS memory limit to a larger value than the maximum heap size. For more information, see -Xgc:concurrentScavenge.

    The following guides are available to help you configure Language Environment runtime options and callable services:

    Warning: Changing the runtime options can often degrade performance.

    "},{"location":"configuring/#configuring-large-page-memory-allocation","title":"Configuring large page memory allocation","text":"

    If your application allocates a large amount of memory and frequently accesses that memory, you might be able to improve performance by enabling large page support on your system.

    Some Linux kernels implement Transparent HugePage Support (THP), which automates the provision of large pages to back virtual memory, as described in Linux systems. Alternatively, you can configure the VM to use large pages (if the large pages support is enabled on the system) by setting the -Xlp:objectheap and -Xlp:codecache options on the command line when you start your application. These options have the following effects:

    The process for enabling the large page support differs in different operating systems, as explained in the following sections.

    "},{"location":"configuring/#aix-systems","title":"AIX systems","text":"

    AIX supports large page sizes of 64 KB and 16 MB, and a huge page size of 16 GB depending on the underlying system P hardware. To determine which page sizes are supported on a particular system, run pagesize -a.

    To use large pages to back an application's data and heap segments, specify the LDR_CNTRL environment variable. You can set different page sizes for different purposes. The following variables can be used:

    The following example sets 4 KB for text and 64 KB for stack, native data, and heap areas:

    LDR_CNTRL=TEXTPSIZE=4K@STACKPSIZE=64K@DATAPSIZE=64K\n

    For more information, including support considerations, see Large pages and Multiple page size support in the AIX documentation.

    The 16 MB and 16 GB page sizes, which are intended for very high performance environments, require special user permissions. You must also configure the number of pages that you require, which cannot be adjusted on demand. For 16 MB large pages, you set the number of large pages by using the vmo command. For 16 GB huge pages you must define the number of pages by using the hardware management console. For more information, see Page sizes for very high-performance environments in the AIX documentation.

    "},{"location":"configuring/#linux-systems","title":"Linux systems","text":"

    Large pages are typically referred to as huge pages on Linux systems. To configure huge page memory allocation, the kernel must support huge pages. If huge pages are supported, the following lines are present in the /proc/meminfo file:

    HugePages_Total:    \nHugePages_Free:     \nHugepagesize:     \n

    If these lines do not exist, update your Linux kernel. If HugePages_Total has a value of 0, huge pages are available, but not enabled. To enable huge pages, add the following line to your /etc/sysctl.conf file and reload the configuration by running sysctl -p:

    vm.nr_hugepages=<number>\n

    Where <number> is the number of huge pages required.

    Configure the number of huge pages that you require at boot time to ensure that the VM has access to sufficient contiguous pages. The following kernel parameters must be set appropriately for your system:

    The user running the Java process must either be ROOT or have permissions to use huge pages. For the appropriate permissions, the user must be a member of a group that has its group identifier (gid) stored in /proc/sys/vm/hugetlb_shm_group. The locked memory limit must also be increased to at least the size of the Java heap by using the ulimit -l command.

    Where huge page support is available, the following default sizes apply for the object heap:

    Transparent HugePage Support (THP) is an automated mechanism of using huge pages to back virtual memory. On Linux kernels that support THP, it is typically enabled by default with the madvise option and can be relied on to provide huge pages as required without any user configuration. To disable THP for your application, use the OpenJ9 -XX:-TransparentHugePage option on the command line. To disable THP system-wide, change the sysfs boot time defaults with the command transparent_hugepage=never. For more information about THP see Transparent HugePage Support.

    "},{"location":"configuring/#windows-systems","title":"Windows systems","text":"

    On Windows systems, large pages are typically 2 MB in size. To use large pages, the VM user must have the Windows Lock pages in memory setting enabled in the Local Security Policy. Applications must also be run with Admin privileges in order to use large page memory allocations.

    For more information, see the following resources from Microsoft:

    "},{"location":"configuring/#zos-systems","title":"z/OS systems","text":"

    When available, 1 MB pageable pages are the default size for the object heap and the code cache. Other page sizes are available for the object heap, depending on the system architecture as shown in the following table:

    Large page size System architecture required -Xlp:codecache -Xlp:objectheap 2 GB nonpageable IBM zEnterprise EC12 processor or later Not supported Supported (64-bit VM only) 1 MB nonpageable System z10 processor or later Not supported Supported (64-bit VM only) 1 MB pageable IBM zEnterprise EC12 processor or later (see Note) Supported Supported

    Note: The Flash Express feature (#0402) helps avoid demoting 1 MB pageable pages to 4 KB pages when there is system paging activity.

    If a particular page size cannot be allocated, a smaller page size is attempted, in descending order. For example, if 2 GB nonpageable pages are requested but not available, the VM tries to allocate 1MB nonpageable pages. If 1 MB nonpageable pages are not available, the VM tries to allocate 1MB pageable pages. If large pages are not available, 4 KB pages are allocated.

    If you want to use nonpageable large pages for the object heap, a system programmer must configure z/OS for nonpageable large pages in the IEASYSxx parmlib member. Users who require large pages must also be authorized to the IARRSM.LRGPAGES resource in the RACF FACILITY class with read authority.

    Use the following z/OS system command to show large page usage for an LPAR:

    MODIFY AXR,IAXDMEM\n

    For more information, see Displaying real storage memory statistics in the z/OS product documentation.

    For usage information, including examples, see -Xlp:objectheap.

    "},{"location":"configuring/#configuring-dynamic-lpar-support-aix-only","title":"Configuring Dynamic LPAR support (AIX only)","text":"

    Dynamic logical partitioning (DLPAR) provides a mechanism to add or remove system resources, such as memory or CPU, to or from the operating system in a logical partition without rebooting. Changing these resources dynamically can have an impact on Java applications that are running on the LPAR.

    To enable an application to respond to DLPAR events, you can use OpenJ9 MXBean extensions to the java.lang.management API. The following classes are available in the com.ibm.lang.management package:

    These extensions can listen for events and trigger any necessary adjustments to the runtime environment. For example, if a Java VM is running in an LPAR with 2GB of memory, but the available memory might be adjusted between 1GB and 8GB, you might set the following options for the Java heap at run time:

    \u2013Xms1g \u2013Xsoftmx2g \u2013Xmx8g\n

    This command-line string sets an initial heap size of 1 GB, a soft (adjustable) maximum heap size of 2 GB, and a maximum heap size of 8 GB. You can then use the MemoryMXBean API to dynamically respond to changes in memory resources. The following classes can be used:

    For more information about the com.ibm.lang.managment package, which extends the jdk.management module, see the API documentation.

    "},{"location":"criusupport/","title":"CRIU support","text":""},{"location":"criusupport/#criu-support","title":"CRIU support","text":"

    (Linux\u00ae x86, Linux on POWER\u00ae (Little Endian), Linux on AArch64, and Linux on IBM Z\u00ae only)

    Notes:

    In OpenJ9, the CRIU support includes an API that you can use to stop the VM at a checkpoint, save its state, and then run the VM from the point where it was stopped. The period of time between when the VM starts and when the application takes a checkpoint is referred to as the checkpoint phase. The application writes the VM state that was saved at the checkpoint to one or more image files. The saved state includes memory pages, methods, file systems, processes, and network connections. You can restore the VM from these files multiple times from the same point and in multiple environments.

    Because the checkpoint image files have the live state of the VM that is used to restore the VM in different systems, they should not contain cryptographically-sensitive security data. If the image files contain sensitive security data, the security components are vulnerable to exploitation even if you don't move the image files between systems. The CRIU technical preview introduces the CRIUSECProvider security provider, which provides the following limited set of security services:

    When you enable CRIU support, all existing security providers are removed from the security provider list during the checkpoint phase, by default and CRIUSECProvider is added. When you restore the VM in the nonportable restore mode (-XX:+CRIURestoreNonPortableMode), CRIUSECProvider is removed from the security provider list and the previous security providers are added back again.

    You can disable CRIUSECProvider during the checkpoint phase with the -XX:-CRIUSecProvider option. For more information, see -XX:[+|-]CRIUSecProvider.

    When the VM starts from the saved point instead of the beginning, the VM startup time improves.

    "},{"location":"criusupport/#enabling-criu-support","title":"Enabling CRIU support","text":"

    CRIU support is not enabled by default. You must enable it by specifying the -XX:+EnableCRIUSupport command-line option when you start your application.

    "},{"location":"criusupport/#configuring-criu-support","title":"Configuring CRIU support","text":"

    You can access the OpenJ9 CRIU support capabilities by specifying different options. The VM enables the addition of VM options on restore through the CRIUSupport.registerRestoreOptionsFile API and environment variables through the CRIUSupport.registerRestoreEnvVariables API. OPENJ9_RESTORE_JAVA_OPTIONS is a special environment variable for adding the VM options on restore.

    There are new options that work at checkpoint as well as at restore and some new options that work at restore only. There are also some existing options that work on restore but some of them behave differently.

    "},{"location":"criusupport/#new-options","title":"New options","text":"

    You can use the following options only during the checkpoint phase:

    You can use the following options only when you restore a VM. If you specify these options when you start the VM (during the checkpoint phase), the VM does not start:

    "},{"location":"criusupport/#existing-options","title":"Existing options","text":"

    Of the existing command-line options, only the following are supported when you run a restored VM and some of these options have changed behavior:

    Options Changed behavior -Xverbosegclog -XcompilationThreads -XsamplingExpirationTime -XX:[+|-]PrintCodeCache -Xtrace If you specify an output file before a checkpoint and another output file for restore, both the files are written according to the -Xtrace options associated with the output file. -Xdump Dump events that are triggered on exception throws or catches cannot be enabled on restore. -Xgcthreads This option is ignored if the number of GC threads is less than the checkpoint GC thread count. -Xjit If -Xint or -Xnoaot and -Xnojit are specified pre-checkpoint, the compiler remains disabled post-restore. -Xaot If -Xnoaot is specified pre-checkpoint, then specifying -Xaot post-restore does not enable AOT compilation or load. -Xjit / -Xaot You can specify the following parameters with the -Xjit and -Xaot options when you run a restored VM:count: Applies only to new methods; existing interpreted methods will not have their counts that are updated. limit, limitFile, exclude: Invalidates the existing compiled methods that do not match the filters. The filters are then enforced for all future JIT and AOT compilations. loadLimit, loadLimitFile, loadExclude: Applies only to future AOT loads; does not impact existing compiled methods. verbose: Effective post-restore; does not override verbose options specified pre-checkpoint. vlog: A vlog file is opened post-restore. If this option was specified pre-checkpoint, the old file is closed first. -Xnoaot Prevents AOT compilations and loads; does not affect the existing compiled methods and does not prevent JIT compilation. -Xnojit Invalidates all existing compiled methods and prevents JIT compilations; does not prevent AOT compilations and loads.

    If you specify an unsupported option, the VM throws a JVMRestoreException error by default. If you specify the -XX:+IgnoreUnrecognizedRestoreOptions option, the VM does not throw any exception and just ignores the unsupported option.

    For more more information on CRIU support, see the openj9.criu module in your OpenJ9 JDK version (OpenJDK 11 and later) API documentation.

    Restrictions:

    "},{"location":"criusupport/#see-also","title":"See Also","text":""},{"location":"d_jvm_commands/","title":"Using System properties","text":""},{"location":"d_jvm_commands/#using-system-property-command-line-options","title":"Using system property command-line options","text":"

    Java\u2122 system properties determine the environment in which a Java program runs by starting a Java virtual machine with a set of values. You can choose to use the default values for Java system properties or you can specify values for them by adding parameters to the command line when you start your application.

    To set a system property from the command line, use:

    java -D<property_name>=<value> <program_name>\n

    For example, to specify the UTF-8 file encoding for your application MyProgram, use:

    java -Dfile.encoding=UTF-8 MyProgram\n
    "},{"location":"dcomibmenableclasscaching/","title":"-Dcom.ibm.enableClassCaching","text":""},{"location":"dcomibmenableclasscaching/#-dcomibmenableclasscaching","title":"-Dcom.ibm.enableClassCaching","text":"

    Setting this property to true enables caching of the Latest User Defined Class Loader (LUDCL).

    "},{"location":"dcomibmenableclasscaching/#syntax","title":"Syntax","text":"
        -Dcom.ibm.enableClassCaching=[true|false]\n
    Setting Effect Default true Enable yes false Disable"},{"location":"dcomibmenableclasscaching/#explanation","title":"Explanation","text":"

    By reducing repeated lookups, Java\u2122 applications that use deserialization extensively can see a performance improvement.

    "},{"location":"dcomibmenableclasscaching/#see-also","title":"See also","text":""},{"location":"dcomibmenablelegacydumpsecurity/","title":"-Dcom.ibm.enableLegacyDumpSecurity","text":""},{"location":"dcomibmenablelegacydumpsecurity/#-dcomibmenablelegacydumpsecurity","title":"-Dcom.ibm.enableLegacyDumpSecurity","text":"

    To improve security, the security checks in the certain com.ibm.jvm.Dump APIs are now enabled by default, when the SecurityManager is enabled. Use this system property to turn off security checking for these APIs.

    "},{"location":"dcomibmenablelegacydumpsecurity/#syntax","title":"Syntax","text":"
        -Dcom.ibm.enableLegacyDumpSecurity=[true|false]\n
    Setting Effect Default true Enable yes false Disable"},{"location":"dcomibmenablelegacydumpsecurity/#explanation","title":"Explanation","text":"

    Security checking is enabled in the following APIs:

    "},{"location":"dcomibmenablelegacydumpsecurity/#see-also","title":"See also","text":""},{"location":"dcomibmenablelegacylogsecurity/","title":"-Dcom.ibm.enableLegacyLogSecurity","text":""},{"location":"dcomibmenablelegacylogsecurity/#-dcomibmenablelegacylogsecurity","title":"-Dcom.ibm.enableLegacyLogSecurity","text":"

    To improve security, the security checks in the certain com.ibm.jvm.Log APIs are now enabled by default, when the SecurityManager is enabled. Use this system property to turn off security checking for these APIs.

    "},{"location":"dcomibmenablelegacylogsecurity/#syntax","title":"Syntax","text":"
        -Dcom.ibm.enableLegacyLogSecurity=[true|false]\n
    Setting Effect Default true Enable yes false Disable"},{"location":"dcomibmenablelegacylogsecurity/#explanation","title":"Explanation","text":"

    Security checking is enabled in the following APIs:

    "},{"location":"dcomibmenablelegacylogsecurity/#see-also","title":"See also","text":""},{"location":"dcomibmenablelegacytracesecurity/","title":"-Dcom.ibm.enableLegacyTraceSecurity","text":""},{"location":"dcomibmenablelegacytracesecurity/#-dcomibmenablelegacytracesecurity","title":"-Dcom.ibm.enableLegacyTraceSecurity","text":"

    To improve security, the security checks in certain com.ibm.jvm.Trace APIs are now enabled by default, when the SecurityManager is enabled. Use this system property to turn off security checking for these APIs.

    "},{"location":"dcomibmenablelegacytracesecurity/#syntax","title":"Syntax","text":"
        -Dcom.ibm.enableLegacyTraceSecurity=[true|false]\n
    Setting Effect Default true Enable yes false Disable"},{"location":"dcomibmenablelegacytracesecurity/#explanation","title":"Explanation","text":"

    Security checking is enabled in the following APIs:

    "},{"location":"dcomibmenablelegacytracesecurity/#see-also","title":"See also","text":""},{"location":"dcomibmgpudisable/","title":"-Dcom.ibm.gpu.disable","text":""},{"location":"dcomibmgpudisable/#-dcomibmgpudisable","title":"-Dcom.ibm.gpu.disable","text":"

    Restriction: This system property is supported only on Java\u2122 11 and later.

    If you have enabled GPU processing with -Dcom.ibm.gpu.enable, use this system property to turn off processing that can be offloaded to a graphics processing unit (GPU).

    "},{"location":"dcomibmgpudisable/#syntax","title":"Syntax","text":"
        -Dcom.ibm.gpu.disable\n
    "},{"location":"dcomibmgpudisable/#explanation","title":"Explanation","text":"

    Because establishing and completing communication with a GPU incurs an additional overhead, not all processing requirements benefit from being offloaded to the GPU. GPU processing is therefore disabled by default. However, if you have enabled GPU processing with -Dcom.ibm.gpu.enable, this property turns GPU processing off.

    "},{"location":"dcomibmgpudisable/#see-also","title":"See also","text":""},{"location":"dcomibmgpuenable/","title":"-Dcom.ibm.gpu.enable","text":""},{"location":"dcomibmgpuenable/#-dcomibmgpuenable","title":"-Dcom.ibm.gpu.enable","text":"

    Restriction: This system property is supported only on Java\u2122 11 and later.

    Use this system property to control the type of processing that can be offloaded to a graphics processing unit (GPU) when processing requirements meet a specific threshold. This feature can improve the performance of certain Java functions.

    "},{"location":"dcomibmgpuenable/#syntax","title":"Syntax","text":"
        -Dcom.ibm.gpu.enable=[all|sort]\n
    Setting Effect all Turns on GPU processing for all possible Java functions. sort Turns on GPU processing only for the Java sort() function.

    By default, this property is not set.

    "},{"location":"dcomibmgpuenable/#explanation","title":"Explanation","text":"

    Because establishing and completing communication with a GPU incurs an additional overhead, not all processing requirements benefit from being offloaded to the GPU. When set, this property enables GPU processing for any array that meets a minimum size.

    "},{"location":"dcomibmgpuenable/#see-also","title":"See also","text":""},{"location":"dcomibmgpuverbose/","title":"-Dcom.ibm.gpu.verbose","text":""},{"location":"dcomibmgpuverbose/#-dcomibmgpuverbose","title":"-Dcom.ibm.gpu.verbose","text":"

    Restriction: This system property is supported only on Java\u2122 11 and later.

    This system property can be used to help identify problems with graphics processing unit (GPU) processing.

    "},{"location":"dcomibmgpuverbose/#syntax","title":"Syntax","text":"
        -Dcom.ibm.gpu.verbose\n

    This property is not set by default.

    "},{"location":"dcomibmgpuverbose/#explanation","title":"Explanation","text":"

    When specified, this option generates verbose output to STDOUT, which can be piped to a file.

    "},{"location":"dcomibmgpuverbose/#see-also","title":"See also","text":""},{"location":"dcomibmlangmanagementosmxbeaniscputime100ns/","title":"-Dcom.ibm.lang.management.OperatingSystemMXBean.isCpuTime100ns","text":""},{"location":"dcomibmlangmanagementosmxbeaniscputime100ns/#-dcomibmlangmanagementoperatingsystemmxbeaniscputime100ns","title":"-Dcom.ibm.lang.management.OperatingSystemMXBean.isCpuTime100ns","text":"

    Changes the unit of the return value of the OperatingSystemMXBean.getProcessCpuTime() method.

    "},{"location":"dcomibmlangmanagementosmxbeaniscputime100ns/#syntax","title":"Syntax","text":"
        -Dcom.ibm.lang.management.OperatingSystemMXBean.isCpuTime100ns=[true|false]\n
    Setting Effect Default true Enable false Disable yes"},{"location":"dcomibmlangmanagementosmxbeaniscputime100ns/#explanation","title":"Explanation","text":"

    The Oracle java.lang.management package includes MBean categories such as Memory, OperatingSystem, and GarbageCollector. The Eclipse OpenJ9\u2122 VM provides additional MXBeans to extend the monitoring and management capabilities. For example, the OperatingSystemMXBean, which monitors operating system settings such as physical and virtual memory size, processor capacity, and processor utilization.

    The OperatingSystemMXBean.getProcessCpuTime() method returns a value in nanoseconds (10-9 s), for compatibility with the com.sun.management.OperatingSystemMXBean and UnixOperatingSystemMXBean interfaces.

    In earlier VM releases, the return value was in hundreds of nanoseconds. If you want to revert to this behavior, set the -Dcom.ibm.lang.management.OperatingSystemMXBean.isCpuTime100ns property to true.

    The default value for this property is false.

    "},{"location":"dcomibmlangmanagementosmxbeaniscputime100ns/#see-also","title":"See also","text":""},{"location":"dcomibmlangmanagementverbose/","title":"-Dcom.ibm.lang.management.verbose","text":""},{"location":"dcomibmlangmanagementverbose/#-dcomibmlangmanagementverbose","title":"-Dcom.ibm.lang.management.verbose","text":"

    Enables verbose information from java.lang.management operations to be written to the output channel during VM operations.

    "},{"location":"dcomibmlangmanagementverbose/#syntax","title":"Syntax","text":"
        -Dcom.ibm.lang.management.verbose\n

    There are no options for this system property.

    "},{"location":"dcomibmotisharedsharedclassglobalfilterclass/","title":"-Dcom.ibm.oti.shared.SharedClassGlobalFilterClass","text":""},{"location":"dcomibmotisharedsharedclassglobalfilterclass/#-dcomibmotisharedsharedclassglobalfilterclass","title":"-Dcom.ibm.oti.shared.SharedClassGlobalFilterClass","text":"

    This system property applies a global filter to all non-bootstrap class loaders that share classes.

    "},{"location":"dcomibmotisharedsharedclassglobalfilterclass/#syntax","title":"Syntax","text":"
        -Dcom.ibm.oti.shared.SharedClassGlobalFilterClass=<filter_class_name>\n

    This property is not set by default.

    "},{"location":"dcomibmotisharedsharedclassglobalfilterclass/#explanation","title":"Explanation","text":"

    A filter can be used to decide which classes are found and stored by a custom class loader in a shared classes cache. The filter is applied to a particular package by implementing the SharedClassFilter interface.

    "},{"location":"dcomibmotisharedsharedclassglobalfilterclass/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachcommand_timeout/","title":"-Dcom.ibm.tools.attach.command_timeout","text":""},{"location":"dcomibmtoolsattachcommand_timeout/#-dcomibmtoolsattachcommand_timeout","title":"-Dcom.ibm.tools.attach.command_timeout","text":"

    Specify the timeout for sending a command to the target VM after the initial attachment.

    "},{"location":"dcomibmtoolsattachcommand_timeout/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.command_timeout=<ms>\n
    Setting Value Default <ms> [1 millisecond or greater] 0 milliseconds (no timeout)"},{"location":"dcomibmtoolsattachcommand_timeout/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachdirectory/","title":"-Dcom.ibm.tools.attach.directory","text":""},{"location":"dcomibmtoolsattachdirectory/#-dcomibmtoolsattachdirectory","title":"-Dcom.ibm.tools.attach.directory","text":"

    Specify a different common directory for Attach API working files.

    "},{"location":"dcomibmtoolsattachdirectory/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.directory=<directory_name>\n
    Setting Value Default <directory_name> [string] .com_ibm_tools_attach

    To change the value for directory_name, specify a different directory name. If the directory does not exist, it is created. However, if a parent directory is specified, it must exist. The common directory must be on a local drive, not a network drive.

    "},{"location":"dcomibmtoolsattachdirectory/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachdisplayname/","title":"-Dcom.ibm.tools.attach.displayName","text":""},{"location":"dcomibmtoolsattachdisplayname/#-dcomibmtoolsattachdisplayname","title":"-Dcom.ibm.tools.attach.displayName","text":"

    Change the default display name for the target virtual machine.

    "},{"location":"dcomibmtoolsattachdisplayname/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.displayName=<my_display_name>\n
    Setting Value <my_display_name> [string]

    To change the value for <my_display_name> that is recorded by an agent, enter a character string of your choice.

    If the display name is not set through the -Dcom.ibm.tools.attach.displayName system property, then the main class name along with the application arguments is set as the default display name. For more information, see Java diagnostic command (jcmd) tool.

    "},{"location":"dcomibmtoolsattachdisplayname/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachenable/","title":"-Dcom.ibm.tools.attach.enable","text":""},{"location":"dcomibmtoolsattachenable/#-dcomibmtoolsattachenable","title":"-Dcom.ibm.tools.attach.enable","text":"

    Enable the Attach API for this application.

    "},{"location":"dcomibmtoolsattachenable/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.enable=[yes|no]\n

    On AIX\u00ae, Linux\u00ae, macOS\u00ae, and Windows\u2122 systems, the following default applies:

    Value Effect Default yes Enable yes no Disable

    On z/OS\u00ae systems, the following default applies:

    Value Effect Default yes Enable no Disable yes"},{"location":"dcomibmtoolsattachenable/#explanation","title":"Explanation","text":"

    A useful reference for information about the Java\u2122 Attach API can be found at http://docs.oracle.com/javase/8/docs/technotes/guides/attach/index.html. The following extract is taken from the Oracle documentation:

    The Attach API is an extension that provides a mechanism to attach to a Java virtual machine. A tool written in the Java Language, uses this API to attach to a target virtual machine and load its tool agent into that virtual machine.

    A usage example is to late attach the IBM\u00ae Health Center agent to a virtual machine (VM) that is already running.

    The Eclipse OpenJ9\u2122 implementation of the Attach API is equivalent to the Oracle implementation. However, the OpenJ9 implementation cannot be used to attach to, or accept attach requests from, other VM implementations.

    "},{"location":"dcomibmtoolsattachenable/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachfileaccessupdatetime/","title":"-Dcom.ibm.tools.attach.fileAccessUpdateTime","text":""},{"location":"dcomibmtoolsattachfileaccessupdatetime/#-dcomibmtoolsattachfileaccessupdatetime","title":"-Dcom.ibm.tools.attach.fileAccessUpdateTime","text":"

    Linux\u00ae only

    This option enables Attach API to update the control file access times at specific intervals, for long-running applications.

    "},{"location":"dcomibmtoolsattachfileaccessupdatetime/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.fileAccessUpdateTime=<sleep days>\n

    where <sleep days> is the number of interval days after which Attach API updates the control file access times for long-running applications. The default value for <sleep days> is 8.

    "},{"location":"dcomibmtoolsattachfileaccessupdatetime/#explanation","title":"Explanation","text":"

    By default, the Attach API of a VM places its control files in the system temporary directory, /tmp/.com_ibm_tools_attach. The long-running Attach API uses the control files to operate. But, the VM does not open, modify, or read from these files after the files are created, if there is no attempt to attach to a target VM.

    This causes a problem in Linux environments because by default systemd-tmpfiles automatically deletes all files and directories that are stored in the /tmp/ folder that are not changed or read within a specific time period. By default, the files in the /tmp/ folder are cleaned up after 10 days by systemd-tmpfiles.

    You can prevent Linux systemd-tmpfiles from deleting the Attach API control files within the /tmp/ folder with the -Dcom.ibm.tools.attach.fileAccessUpdateTime system property. You can specify the interval days after which Attach API updates the control file access times with the -Dcom.ibm.tools.attach.fileAccessUpdateTime system property.

    If 0 is specified as the number of <sleep days>, the control file access times are not updated and if systemd-tmpfiles is enabled, it deletes the files in the /tmp/ folder.

    You can specify a different location outside of the /tmp/ folder to place the Attach API control files with the -Dcom.ibm.tools.attach.directory system property, if you do not want to use the -Dcom.ibm.tools.attach.fileAccessUpdateTime system property.

    "},{"location":"dcomibmtoolsattachfileaccessupdatetime/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachid/","title":"-Dcom.ibm.tools.attach.id","text":""},{"location":"dcomibmtoolsattachid/#-dcomibmtoolsattachid","title":"-Dcom.ibm.tools.attach.id","text":"

    Specify a different virtual machine (VM) identifier.

    "},{"location":"dcomibmtoolsattachid/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.id=<my_vm_ID>\n
    Setting Value Default <my_vm_ID> [string] Target VM process ID

    To change the VM identifier recorded by an agent, change the value for <my_vm_ID>. The string must start with an alphabetic character. The remaining characters must be alphanumeric or underscore. Case-sensitivity is system dependent. If the VM identifier is already in use, the attach API modifies it to create a unique value.

    "},{"location":"dcomibmtoolsattachid/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachlogging/","title":"-Dcom.ibm.tools.attach.logging","text":""},{"location":"dcomibmtoolsattachlogging/#-dcomibmtoolsattachlogging","title":"-Dcom.ibm.tools.attach.logging","text":"

    Enable logging for Attach API events.

    "},{"location":"dcomibmtoolsattachlogging/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.logging=[yes|no]\n
    Value Effect Default yes Enable no Disable yes"},{"location":"dcomibmtoolsattachlogging/#explanation","title":"Explanation","text":"

    Turn on tracing and logging of Attach API events to help diagnose problems. One timestamped log file is created for each Java\u2122 process in the current directory for the running JVM .

    "},{"location":"dcomibmtoolsattachlogging/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachlogname/","title":"-Dcom.ibm.tools.attach.log.name","text":""},{"location":"dcomibmtoolsattachlogname/#-dcomibmtoolsattachlogname","title":"-Dcom.ibm.tools.attach.log.name","text":"

    Specify the path and prefix for the log files.

    "},{"location":"dcomibmtoolsattachlogname/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.log.name=<path/prefix>\n
    Setting Value Default <path/prefix> [string] VM process directory

    By default, when -Dcom.ibm.tools.attach.logging=true is set, timestamped log files are written to the current directory for the running VM. Use the -Dcom.ibm.tools.attach.log.name option to change the path and prefix for the logfiles.

    "},{"location":"dcomibmtoolsattachlogname/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachretry/","title":"-Dcom.ibm.tools.attach.retry","text":""},{"location":"dcomibmtoolsattachretry/#-dcomibmtoolsattachretry","title":"-Dcom.ibm.tools.attach.retry","text":"

    Windows\u2122 only

    This option specifies the number of times the jcmd tool retries attaching to a running VM when the tool encounters the SocketException error.

    "},{"location":"dcomibmtoolsattachretry/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.retry=<number_of_retries>\n

    The default value for <number_of_retries> is 3.

    "},{"location":"dcomibmtoolsattachretry/#explanation","title":"Explanation","text":"

    When the jcmd tool sends a command to a running VM, the command might throw the Socket Exception error in case of issues, such as a network failure or a connection reset. Instead of failing the attaching request, you can specify the number of times the tool retries attaching to the target VM with the -Dcom.ibm.tools.attach.retry system property.

    "},{"location":"dcomibmtoolsattachretry/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachshutdown_timeout/","title":"-Dcom.ibm.tools.attach.shutdown_timeout","text":""},{"location":"dcomibmtoolsattachshutdown_timeout/#-dcomibmtoolsattachshutdown_timeout","title":"-Dcom.ibm.tools.attach.shutdown_timeout","text":"

    Specify a timeout before ending the Attach API wait loop thread.

    "},{"location":"dcomibmtoolsattachshutdown_timeout/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.shutdown_timeout=<ms>\n
    Setting Value Default <ms> [1 millisecond or greater] 10000 milliseconds (10 seconds)"},{"location":"dcomibmtoolsattachshutdown_timeout/#see-also","title":"See also","text":""},{"location":"dcomibmtoolsattachtimeout/","title":"-Dcom.ibm.tools.attach.timeout","text":""},{"location":"dcomibmtoolsattachtimeout/#-dcomibmtoolsattachtimeout","title":"-Dcom.ibm.tools.attach.timeout","text":"

    Specify a time that an application should wait when attempting to connect to a target virtual machine (VM) before ending.

    "},{"location":"dcomibmtoolsattachtimeout/#syntax","title":"Syntax","text":"
        -Dcom.ibm.tools.attach.timeout=<ms>\n
    Setting Value Default <ms> [501 milliseconds or greater] 120000 milliseconds (120 seconds)

    If you specify a value of 500 milliseconds or lower, no connection attempt is made.

    "},{"location":"dcomibmtoolsattachtimeout/#example","title":"Example","text":"

    To timeout after 60 seconds, specify:

    -Dcom.ibm.tools.attach.timeout=60000

    "},{"location":"dcomibmtoolsattachtimeout/#see-also","title":"See also","text":""},{"location":"dfileencoding/","title":"-Dfile.encoding","text":""},{"location":"dfileencoding/#-dfileencoding","title":"-Dfile.encoding","text":"

    Use this OpenJDK property to define the file encoding that is required.

    "},{"location":"dfileencoding/#syntax","title":"Syntax","text":"
        -Dfile.encoding=<value>\n
    Setting Value Default <value> [string] Unicode 3.0 standards where <value> defines the file encoding that is required."},{"location":"dfileencoding/#explanation","title":"Explanation","text":"

    By default the GBK converter follows Unicode 3.0 standards. To force the GBK converter to follow Unicode 2.0 standards, use a value of bestfit936.

    "},{"location":"diag_overview/","title":"Overview","text":""},{"location":"diag_overview/#diagnostic-data-and-tooling","title":"Diagnostic data and tooling","text":"

    Eclipse OpenJ9\u2122 contains a broad range of diagnostic capabilities to help identify, isolate, and solve run time problems. These capabilities include dump files, verbose logs, and trace files, which are supported by a variety of diagnostic tools and interfaces.

    "},{"location":"diag_overview/#dumps","title":"Dumps","text":"

    Various types of dumps are produced by default in response to certain events, such as a GPF fault or an OutOfMemoryError exception. You can also trigger the production of dumps by using the com.ibm.jvm.Dump API or by specifying -Xdump options on the command line.

    All dumps are produced by dump agents, which are initialized when the OpenJ9 VM starts. Different dumps target different areas of the runtime environment. If you want to generate a dump to diagnose a particular type of problem, you need to understand what data the dump will provide. The following dumps are typically used for problem diagnosis:

    Other types of dump include binary JIT dumps, stack dumps, and snap dumps. For a complete list of dump agents and the diagnostic data they produce, see Dump agents.

    "},{"location":"diag_overview/#verbose-log-files","title":"Verbose log files","text":"

    Some components of OpenJ9 can also produce verbose output or log files to assist with problem determination.

    "},{"location":"diag_overview/#trace-files","title":"Trace files","text":"

    The OpenJ9 trace facility can be used to trace applications, Java methods, or internal JVM operations with minimal impact on performance. Trace is configured by using the -Xtrace command line option, which allows you to control what is traced and when.

    Trace data is produced in binary format and must be processed by the OpenJ9 trace formatter to convert it to a readable form. For more information, see Trace formatter.

    "},{"location":"diag_overview/#diagnostic-tools","title":"Diagnostic tools","text":"

    A number of diagnostic tools are available with OpenJ9 to assist with the analysis of dump and trace files.

    "},{"location":"diag_overview/#dump-extractor","title":"Dump extractor","text":"

    The dump extractor (jpackcore) supports a full analysis of core files on specific platforms by collecting key files from a system and packaging them into an archive along with a core dump. This archive file is extremely useful when reporting issues to the OpenJ9 community, helping to ensure a faster analysis and turnaround. For more information, see Dump extractor.

    "},{"location":"diag_overview/#dump-viewer","title":"Dump viewer","text":"

    Because system dumps are binary files, OpenJ9 provides a dump viewer tool (jdmpview) to analyze the contents. This tool can work with dumps from any platforms independently of a system debugger. For more information, see Dump viewer.

    "},{"location":"diag_overview/#trace-formatter","title":"Trace formatter","text":"

    The trace formatter tool converts binary trace point data in a trace file into a readable format for analysis. For more information, see Trace formatter.

    "},{"location":"diag_overview/#option-builder","title":"Option builder","text":"

    OpenJ9 contains an extensive set of command-line options to assist with problem diagnosis. Certain options are complex, containing many sub-options with numerous parameters. Whilst these offer a great degree of flexibility, the syntax can be difficult to construct. Option builder tools are available that provide a simple graphical user interface to help you construct your command-line argument. For more information, see Option builder.

    "},{"location":"diag_overview/#hotspot-compatible-tools","title":"HotSpot-compatible tools","text":"

    A number of tools are available for compatibility with the reference implementation. These tools are independently implemented by OpenJ9 but have similar functions, allowing users to migrate more easily. The available tools are listed in the Tools section.

    Note: If you are already familiar with tools that are provided with HotSpot, see Switching to OpenJ9, which explains some of the differences you might encounter when using OpenJ9.

    "},{"location":"diag_overview/#eclipse-marketplace-tools","title":"Eclipse marketplace tools","text":"

    OpenJ9 provides support for a number of monitoring and diagnostic tools that can be found in the Eclipse marketplace. Each tool provides a graphical user interface to help you visualize data and, in some cases, can provide tuning or debugging recommendations.

    If you are familiar with using HotSpot as part of an Oracle JDK or OpenJDK, the Java VisualVM utility is functionally similar to Health Center.

    "},{"location":"diag_overview/#interfaces","title":"Interfaces","text":""},{"location":"diag_overview/#jvm-tool-interface-jvmti","title":"JVM tool interface (JVMTI)","text":"

    OpenJ9 supports the Java Virtual Machine Tool Interface (JVMTI) and provides extensions that allow JVMTI tools to obtain diagnostic information or trigger diagnostic operations in the VM. For more information, see Java Virtual Machine Tool Interface.

    "},{"location":"diag_overview/#dtfj-interface","title":"DTFJ Interface","text":"

    OpenJ9 includes the Diagnostic Tool Framework for Java (DTFJ) API. Custom applications can be written that use this API to access a wide range of information in a system dump or a Java dump. DTFJ can be used with the Eclipse Memory Analyzer tool (MAT) to examine the Java object heap for memory leaks and to reduce memory consumption. For more information, see Diagnostic Tool Framework for Java.

    "},{"location":"diag_overview/#language-management-interface","title":"Language Management interface","text":"

    OpenJ9 provides MXBean additions and extensions to the standard java.lang.management API, which enables you to use tools such as JConsole to monitor and manage your Java applications. For more information, see Language management interface.

    "},{"location":"diag_overview/#jpda-tools","title":"JPDA tools","text":"

    OpenJ9 is compliant with the Java Platform Debugging Architecture (JPDA), which means you can use any JPDA tool for diagnosis, including Eclipse JDT Debug.

    "},{"location":"djavacompiler/","title":"-Djava.compiler","text":""},{"location":"djavacompiler/#-djavacompiler","title":"-Djava.compiler","text":"

    This Oracle HotSpot property is used for loading a JIT compiler from a named, native library. This option can be used on the command line to specify the JIT compiler for the Eclipse OpenJ9\u2122 VM.

    "},{"location":"djavacompiler/#syntax","title":"Syntax","text":"
        -Djava.compiler=j9jit29\n
    "},{"location":"djavalangstringbuffergrowaggressively/","title":"-Djava.lang.stringBuffer.growAggressively","text":""},{"location":"djavalangstringbuffergrowaggressively/#-djavalangstringbuffergrowaggressively","title":"-Djava.lang.stringBuffer.growAggressively","text":"

    Restriction: This system property is supported only on Java\u2122 8.

    Setting this property to false reverts to the behavior (Eclipse OpenJ9\u2122 0.18 and earlier) of growing a 1 G char[] or larger StringBuffer or StringBuilder only as much as necessary to accommodate the String being added. The default behavior is to immediately grow to the maximum possible size, similarly to Java 11 and later. The default behavior is compatible with the Oracle HotSpot VM.

    "},{"location":"djavalangstringbuffergrowaggressively/#syntax","title":"Syntax","text":"
        -Djava.lang.stringBufferAndBuilder.growAggressively=[true|false]\n
    Setting Effect Default true Above 1 G, grow to the maximum size yes false Above 1 G, grow only as required"},{"location":"djavalangstringsubstringnocopy/","title":"-Djava.lang.string.substring.nocopy","text":""},{"location":"djavalangstringsubstringnocopy/#-djavalangstringsubstringnocopy","title":"-Djava.lang.string.substring.nocopy","text":"

    Restriction: This system property is supported only on Java\u2122 8. String sharing cannot be enabled on Java 11 and later.

    Setting this property to true avoids sharing a String object when substring() is used to subset a String beginning from offset zero. Avoiding sharing is compatible with the Oracle HotSpot VM.

    "},{"location":"djavalangstringsubstringnocopy/#syntax","title":"Syntax","text":"
        -Djava.lang.string.substring.nocopy=[true|false]\n
    Setting Effect Default true No sharing false Sharing yes"},{"location":"djdknativecbc/","title":"-Djdk.nativeCBC","text":""},{"location":"djdknativecbc/#-djdknativecbc","title":"-Djdk.nativeCBC","text":"

    This option enables or disables OpenSSL native cryptographic support for the CBC algorithm.

    "},{"location":"djdknativecbc/#syntax","title":"Syntax","text":"
        -Djdk.nativeCBC=[true|false]\n
    Setting value Default -Djdk.nativeCBC true yes -Djdk.nativeCBC false"},{"location":"djdknativecbc/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the CBC algorithm. If you want to turn off this algorithm only, set this option to false. To turn off all the algorithms, see the -Djdk.nativeCrypto system property command line option.

    "},{"location":"djdknativechacha20/","title":"-Djdk.nativeChaCha20","text":""},{"location":"djdknativechacha20/#-djdknativechacha20","title":"-Djdk.nativeChaCha20","text":"

    This option enables or disables OpenSSL native cryptographic support for the ChaCha20 and ChaCha20-Poly1305 algorithms.

    Restrictions:

    "},{"location":"djdknativechacha20/#syntax","title":"Syntax","text":"
        -Djdk.nativeChaCha20=[true|false]\n
    Setting value Default -Djdk.nativeChaCha20 true yes -Djdk.nativeChaCha20 false"},{"location":"djdknativechacha20/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the ChaCha20 and ChaCha20-Poly1305 algorithms. If you want to turn off support for these algorithms only, set this option to false. To turn off support for these and other algorithms, see the -Djdk.nativeCrypto system property command line option.

    "},{"location":"djdknativecrypto/","title":"-Djdk.nativeCrypto","text":""},{"location":"djdknativecrypto/#-djdknativecrypto","title":"-Djdk.nativeCrypto","text":"

    This option controls the use of OpenSSL native cryptographic support.

    "},{"location":"djdknativecrypto/#syntax","title":"Syntax","text":"
        -Djdk.nativeCrypto=[true|false]\n
    Setting value Default -Djdk.nativeCrypto true yes -Djdk.nativeCrypto false"},{"location":"djdknativecrypto/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the following algorithms:

    If you want to turn off the OpenSSL implementation, set the -Djdk.nativeCrypto option to false.

    Restrictions:

    If you want to turn off the algorithms individually, use the following system properties:

    "},{"location":"djdknativedigest/","title":"-Djdk.nativeDigest","text":""},{"location":"djdknativedigest/#-djdknativedigest","title":"-Djdk.nativeDigest","text":"

    This option enables or disables OpenSSL native cryptographic support for the MD5, SHA-224, SHA-256, SHA-384, and SHA-512 digest algorithms.

    "},{"location":"djdknativedigest/#syntax","title":"Syntax","text":"
        -Djdk.nativeDigest=[true|false]\n
    Setting value Default -Djdk.nativeDigest true yes -Djdk.nativeDigest false"},{"location":"djdknativedigest/#explanation","title":"Explanation","text":"

    To turn off all the algorithms, see the -Djdk.nativeCrypto system property command-line option.

    Note: The MD5 digest algorithm is not supported for OpenSSL on AIX\u00ae. The Java implementation is always used for the MD5 digest algorithm on AIX.

    "},{"location":"djdknativeec/","title":"-Djdk.nativeEC","text":""},{"location":"djdknativeec/#-djdknativeec","title":"-Djdk.nativeEC","text":"

    This option enables or disables OpenSSL native cryptographic support for the ECDH key agreement algorithm.

    "},{"location":"djdknativeec/#syntax","title":"Syntax","text":"
        -Djdk.nativeEC=[true|false]\n
    Setting value Default -Djdk.nativeEC true yes -Djdk.nativeEC false"},{"location":"djdknativeec/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the ECDH key agreement algorithm. If you want to turn off support for this algorithm only, set this option to false. To turn off support for this and other algorithms, see the -Djdk.nativeCrypto system property command line option.

    "},{"location":"djdknativeeckeygen/","title":"-Djdk.nativeECKeyGen","text":""},{"location":"djdknativeeckeygen/#-djdknativeeckeygen","title":"-Djdk.nativeECKeyGen","text":"

    This option enables or disables OpenSSL native cryptographic support for the EC key generation algorithm.

    "},{"location":"djdknativeeckeygen/#syntax","title":"Syntax","text":"
        -Djdk.nativeECKeyGen=[true|false]\n
    Setting value Default -Djdk.nativeECKeyGen true yes -Djdk.nativeECKeyGen false"},{"location":"djdknativeeckeygen/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the EC key generation algorithm. If you want to turn off support for this algorithm only, set this option to false. To turn off support for this and other algorithms, see the -Djdk.nativeCrypto system property command line option.

    Note: The EC key generation algorithm is not supported for OpenSSL on AIX\u00ae. This option is ignored on AIX and the Java implementation is always used.

    "},{"location":"djdknativegcm/","title":"-Djdk.nativeGCM","text":""},{"location":"djdknativegcm/#-djdknativegcm","title":"-Djdk.nativeGCM","text":"

    This option enables or disables OpenSSL native cryptographic support for the GCM algorithm.

    "},{"location":"djdknativegcm/#syntax","title":"Syntax","text":"
        -Djdk.nativeGCM=[true|false]\n
    Setting value Default -Djdk.nativeGCM true yes -Djdk.nativeGCM false"},{"location":"djdknativegcm/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the GCM algorithm. If you want to turn off this algorithm only, set this option to false. To turn off all the algorithms, see the -Djdk.nativeCrypto system property command line option.

    "},{"location":"djdknativersa/","title":"-Djdk.nativeRSA","text":""},{"location":"djdknativersa/#-djdknativersa","title":"-Djdk.nativeRSA","text":"

    This option enables or disables OpenSSL native cryptographic support for the RSA algorithm.

    "},{"location":"djdknativersa/#syntax","title":"Syntax","text":"
        -Djdk.nativeRSA=[true|false]\n
    Setting value Default -Djdk.nativeRSA true yes -Djdk.nativeRSA false"},{"location":"djdknativersa/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the RSA algorithm. If you want to turn off support for this algorithm only, set this option to false. To turn off all the algorithms, see the -Djdk.nativeCrypto system property command line option.

    "},{"location":"djdknativexdhkeyagreement/","title":"-Djdk.nativeXDHKeyAgreement","text":""},{"location":"djdknativexdhkeyagreement/#-djdknativexdhkeyagreement","title":"-Djdk.nativeXDHKeyAgreement","text":"

    This option enables or disables OpenSSL native cryptographic support for the XDH key agreement algorithm.

    Restrictions:

    "},{"location":"djdknativexdhkeyagreement/#syntax","title":"Syntax","text":"
        -Djdk.nativeXDHKeyAgreement=[true|false]\n
    Setting value Default -Djdk.nativeXDHKeyAgreement true yes -Djdk.nativeXDHKeyAgreement false"},{"location":"djdknativexdhkeyagreement/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the XDH key agreement algorithm. If you want to turn off support for this algorithm only, set this option to false. To turn off support for this and other algorithms, see the -Djdk.nativeCrypto system property command line option.

    Note: The XDH key agreement algorithm is not supported for OpenSSL on AIX\u00ae. This option is ignored on AIX and the Java implementation is always used.

    "},{"location":"djdknativexdhkeygen/","title":"-Djdk.nativeXDHKeyGen","text":""},{"location":"djdknativexdhkeygen/#-djdknativexdhkeygen","title":"-Djdk.nativeXDHKeyGen","text":"

    This option enables or disables OpenSSL native cryptographic support for the XDH key generation algorithm.

    Restrictions:

    "},{"location":"djdknativexdhkeygen/#syntax","title":"Syntax","text":"
        -Djdk.nativeXDHKeyGen=[true|false]\n
    Setting value Default -Djdk.nativeXDHKeyGen true yes -Djdk.nativeXDHKeyGen false"},{"location":"djdknativexdhkeygen/#explanation","title":"Explanation","text":"

    OpenSSL support is enabled by default for the XDH key generation algorithm. If you want to turn off support for this algorithm only, set this option to false. To turn off support for this and other algorithms, see the -Djdk.nativeCrypto system property command line option.

    Note: The XDH key generation algorithm is not supported for OpenSSL on AIX\u00ae. This option is ignored on AIX and the Java implementation is always used.

    "},{"location":"dorgeclipseopenj9criuimmutableenvvars/","title":"-Dorg.eclipse.openj9.criu.ImmutableEnvVars","text":""},{"location":"dorgeclipseopenj9criuimmutableenvvars/#-dorgeclipseopenj9criuimmutableenvvars","title":"-Dorg.eclipse.openj9.criu.ImmutableEnvVars","text":"

    This system property specifies the environment variables that you want to add to the ImmutableEnvVars list.

    Restrictions: This option takes effect only when the -XX:+EnableCRIUSupport option is enabled. This option can be used only during the checkpoint phase.

    "},{"location":"dorgeclipseopenj9criuimmutableenvvars/#syntax","title":"Syntax","text":"
        -Dorg.eclipse.openj9.criu.ImmutableEnvVars=<environment_variables>\n

    Where <environment_variables> is a comma-separated list of environment variables. For example:

    -Dorg.eclipse.openj9.criu.ImmutableEnvVars=INVOKED,WLP_USER_DIR,WLP_OUTPUT_DIR,LOG_DIR,X_LOG_DIR,LOG_FILE,X_LOG_FILE,VARIABLE_SOURCE_DIRS,X_CMD\n

    The following environment variables are included in the list by default and cannot be removed:

    "},{"location":"dorgeclipseopenj9criuimmutableenvvars/#explanation","title":"Explanation","text":"

    The environment variables are a property of the operating system environment and not the VM. The VM considers these properties as immutable and does not allow the environment variables to change values between checkpoint and restore.

    During the checkpoint and restore phases, the VM can detect the environment variables that are in the immutableEnvvars list. You can add any other immutable variables that you want the VM to detect in the ImmutableEnvVars list with the -Dorg.eclipse.openj9.criu.ImmutableEnvVars option. If an environment variable is not in the list, the VM does not detect that variable even if the underlying system has defined it. These environment variables exist for the entire lifetime of the VM (checkpoint and restore).

    At restore, the VM can also detect the environment variables that are added through the CRIUSupport.registerRestoreEnvVariables API.

    For more information about how environment variables are handled during the checkpoint and restore process, see the Environment Variables section in the OpenJ9 CRIU Support: A look under the hood\u202f(part II) blog post.

    "},{"location":"dorgeclipseopenj9criuimmutableenvvars/#see-also","title":"See also","text":""},{"location":"dump_heapdump/","title":"Heap dump","text":""},{"location":"dump_heapdump/#heap-dump","title":"Heap dump","text":"

    Heap dumps contain a snapshot of all the live objects that are being used by a running Java\u2122 application on the Java heap. You can obtain detailed information for each object instance, such as the address, type, class name, or size, and whether the instance has references to other objects.

    There are two formats for heap dumps; the classic format and the Portable Heap Dump (PHD) format, which is the default. Whilst the classic format is generated in ascii text and can be read, the PHD format is binary and and must be processed for analysis.

    "},{"location":"dump_heapdump/#obtaining-dumps","title":"Obtaining dumps","text":"

    Heap dumps are generated by default in PHD format when the Java heap runs out of space. If you want to trigger the production of a heap dump in response to other situations, or in classic format, you can use one of the following options:

    "},{"location":"dump_heapdump/#analyzing-dumps","title":"Analyzing dumps","text":"

    The best method to analyze a PHD heap dump is to use the Eclipse Memory Analyzer\u2122 tool (MAT) or the IBM Memory Analyzer tool. These tools process the dump file and provide a visual representation of the objects in the Java Heap. Both tools require the Diagnostic Tool Framework for Java (DTFJ) plug-in. To install the DTFJ plug-in in the Eclipse IDE, select the following menu items:

    Help > Install New Software > Work with \"IBM Diagnostic Tool Framework for Java\" > IBM Monitoring and Diagnostic Tools > Diagnostic Tool Framework for Java   \n

    The following sections contain detailed information about the content of each type of heap dump file.

    "},{"location":"dump_heapdump/#portable-heap-dump-phd-format","title":"Portable Heap Dump (PHD) format","text":"

    A PHD format dump file contains a header section and a body section. The body section can contain information about object, array, or class records. Primitive numbers are used to describe the file format, as detailed in the following table:

    Primitive number Length in bytes byte 1 short 2 int 4 long 8 word 4 (32-bit platforms) or 8 (64-bit platforms)"},{"location":"dump_heapdump/#general-structure","title":"General structure","text":"

    The following structure comprises the header section of a PHD file:

    The body of a PHD file is indicated by a byte that contains a tag with a value of 2, after which there are a number of dump records. Dump records are preceded by a 1 byte tag with the following record types:

    These records are described in more detail in the sections that follow.

    The end of the PHD body is indicated by a byte that contains a tag with a value of 3.

    "},{"location":"dump_heapdump/#object-records","title":"Object records","text":"

    Object records can be short, medium, or long, depending on the number of object references in the heap dump.

    1. Short object record

    The following information is contained within the tag byte:

    2. Medium object record

    These records provide the actual address of the class rather than a cache index. The following format is used:

    3. Long object record

    This record format is used when there are more than 7 references, or if there are extra flags or a hash code. The following format is used:

    "},{"location":"dump_heapdump/#array-records","title":"Array records","text":"

    PHD arrays can be primitive arrays or object arrays, as described in the sections that follow.

    1. Primitive array record

    The following information is contained in an array record:

    2. Long primitive array record

    This type of record is used when a primitive array has been hashed.

    3. Object array record

    The following format applies:

    "},{"location":"dump_heapdump/#class-records","title":"Class records","text":"

    The PHD class record encodes a class object and contains the following format:

    "},{"location":"dump_heapdump/#classic-heap-dump-format","title":"Classic Heap Dump format","text":"

    Classic heap dumps are produced in ascii text on all platforms except z/OS, which are encoded in EBCDIC. The dump is divided into the following sections:

    "},{"location":"dump_heapdump/#header-record","title":"Header record","text":"

    A single string containing information about the runtime environment, platform, and build levels, similar to the following example:

    // Version: JRE 1.8.0 Linux amd64-64 (build 1.8.0_232-b09)\n
    "},{"location":"dump_heapdump/#object-records_1","title":"Object records","text":"

    A record of each object instance in the heap with the following format:

    <object address, in hexadecimal> [<length in bytes of object instance, in decimal>] OBJ <object type>\n<heap reference, in hexadecimal> <heap reference, in hexadecimal> ...\n

    The following object types (object type) might be shown:

    These types are abbreviated in the record. To determine the type, see the Java VM Type Signature table.

    Any references found are also listed, excluding references to an object's class or NULL references.

    The following example shows an object instance (16 bytes in length) of type java/lang/String, with a reference to a char array:

    0x00000000E0000AF0 [16] OBJ java/lang/String\n    0x00000000E0000B00\n

    The object instance (length 32 bytes) of type char array, as referenced from the java/lang/String, is shown in the following example:

    0x00000000E0000B00 [32] OBJ [C\n

    The following example shows an object instance (24 bytes in length) of type array of java/lang/String:

    0x00000000FFF07498 [24] OBJ [Ljava/lang/String;\n    0x00000000E0005D78 0x00000000E0005D50 0x00000000E0005D28 0x00000000E0005D00\n
    "},{"location":"dump_heapdump/#class-records_1","title":"Class records","text":"

    A record of each class in the following format:

    <class object address, in hexadecimal> [<length in bytes of class object, in decimal>] CLS <class type>\n<heap reference, in hexadecimal> <heap reference, in hexadecimal>...\n

    The following class types (<class type>) might be shown:

    These types are abbreviated in the record. To determine the type, see the Java VM Type Signature table.

    Any references found in the class block are also listed, excluding NULL references.

    The following example shows a class object (80 bytes in length) for java/util/Date, with heap references:

    0x00000000E00174F0 [80] CLS java/util/Date\n    0x00000000FFF1BB60 0x00000000FFF29630\n
    "},{"location":"dump_heapdump/#trailer-record-1","title":"Trailer record 1","text":"

    A single record containing record counts, in decimal.

    For example:

    // Breakdown - Classes: 630, Objects: 3692, ObjectArrays: 576, PrimitiveArrays: 2249\n
    "},{"location":"dump_heapdump/#trailer-record-2","title":"Trailer record 2","text":"

    A single record containing totals, in decimal.

    For example:

    // EOF:  Total 'Objects',Refs(null) : 7147,22040(12379)\n

    The values in the example reflect the following counts:

    "},{"location":"dump_heapdump/#java-vm-type-signatures","title":"Java VM Type Signatures","text":"

    The following table shows the abbreviations used for different Java types in the heap dump records:

    Java VM Type Signature Java Type Z boolean B byte C char S short I int J long F float D double L<fully-qualified class>; <fully-qualified class> [<type> <type>[](array of <type>) (<arg-types>)<ret-type> method"},{"location":"dump_heapdump/#see-also","title":"See also","text":""},{"location":"dump_javadump/","title":"Java dump","text":""},{"location":"dump_javadump/#java-dump","title":"Java dump","text":"

    Java\u2122 dumps, sometimes referred to as Java cores, are produced when the VM ends unexpectedly because of an operating system signal, OutOfMemoryError, or a user-initiated keystroke combination. You can also generate a Java dump by calling the Dump API programmatically from your application or specifying the -Xdump:java option on the command line.

    If your Java application crashes or hangs, Java dumps can provide useful information to help you diagnose the root cause.

    To help you understand how a Java dump can help you with problem diagnosis, this topic includes a few scenarios to help you interpret the data:

    "},{"location":"dump_javadump/#java-dump-contents","title":"Java dump contents","text":"

    Java dumps summarize the state of the VM when the event occurs, with most of the information relating to components of the VM. The file is made up of a number of sections that provide different types of information.

    "},{"location":"dump_javadump/#title","title":"TITLE","text":"

    The first section of the Java dump file provides information about the event that triggered the production of the dump. In the following example, you can see that a vmstop event triggered the dump at a specified date and time.

    0SECTION       TITLE subcomponent dump routine\nNULL           ===============================\n1TICHARSET     UTF-8\n1TISIGINFO     Dump Event \"vmstop\" (00000002) Detail \"#0000000000000000\" received\n1TIDATETIMEUTC Date: 2021/04/23 at 18:02:44:017 (UTC)\n1TIDATETIME    Date: 2021/04/23 at 14:02:44:017\n1TITIMEZONE    Timezone: UTC-4 (EDT)\n1TINANOTIME    System nanotime: 379202644260787\n1TIFILENAME    Javacore filename:    /home/doc-javacore/javacore.20210423.140244.1175.0001.txt\n1TIREQFLAGS    Request Flags: 0x81 (exclusive+preempt)\n1TIPREPSTATE   Prep State: 0x106 (vm_access+exclusive_vm_access+trace_disabled)\n
    "},{"location":"dump_javadump/#gpinfo","title":"GPINFO","text":"

    The GPINFO section provides general information about the system that the VM is running on. The following example is taken from a Java dump that was generated on a Linux system.

    NULL           ------------------------------------------------------------------------\n0SECTION       GPINFO subcomponent dump routine\nNULL           ================================\n2XHOSLEVEL     OS Level         : Linux 3.10.0-862.11.6.el7.x86_64\n2XHCPUS        Processors -\n3XHCPUARCH       Architecture   : amd64\n3XHNUMCPUS       How Many       : 4\n3XHNUMASUP       NUMA is either not supported or has been disabled by user\nNULL\n1XHERROR2      Register dump section only produced for SIGSEGV, SIGILL or SIGFPE.\nNULL\n

    The content of this section can vary, depending on the cause of the dump. For example, if the dump was caused by a general protection fault (gpf), the library in which the crash occurred is also recorded, together with a value shown as VM flags. This value can provide some clues about which component of the VM might have been involved. Look for the following line in the output:

    1XHFLAGS       VM flags:0000000000000000\n

    The hexadecimal number that is recorded for VM flags ends in MSSSS, where M is the VM component and SSSS is component-specific code as shown in the following table:

    Component Code value INTERPRETER 0x10000 GC 0x20000 GROW_STACK 0x30000 JNI 0x40000 JIT_CODEGEN 0x50000 BCVERIFY 0x60000 RTVERIFY 0x70000 SHAREDCLASSES 0x80000

    A value of 0000000000000000 (0x00000) indicates that a crash occurred outside of the VM.

    "},{"location":"dump_javadump/#envinfo","title":"ENVINFO","text":"

    This section contains useful information about the environment in which the crash took place, including the following data:

    For clarity, the following example shows a shortened version of this section, where ... indicates that lines are removed:

    NULL           ------------------------------------------------------------------------\n0SECTION       ENVINFO subcomponent dump routine\nNULL           =================================\n1CIJAVAVERSION JRE 9 Linux amd64-64 (build 9.0.4-internal+0-adhoc..openj9-openjdk-jdk9)\n1CIVMVERSION   20180830_000000\n1CIJ9VMVERSION 8e7c6ec\n1CIJITVERSION  8e7c6ec\n1CIOMRVERSION  553811b_CMPRSS\n1CIJCLVERSION  ec1d223 based on jdk-9.0.4+12\n1CIJITMODES    JIT enabled, AOT enabled, FSD disabled, HCR enabled\n1CIRUNNINGAS   Running as a standalone JVM\n1CIVMIDLESTATE VM Idle State: ACTIVE\n1CICONTINFO    Running in container : FALSE\n1CICGRPINFO    JVM support for cgroups enabled : TRUE\n1CISTARTTIME   JVM start time: 2018/08/30 at 21:55:47:387\n1CISTARTNANO   JVM start nanotime: 22012135233549\n1CIPROCESSID   Process ID: 30285 (0x764D)\n1CICMDLINE     [not available]\n1CIJAVAHOMEDIR Java Home Dir:   /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk\n1CIJAVADLLDIR  Java DLL Dir:    /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/bin\n1CISYSCP       Sys Classpath:\n1CIUSERARGS    UserArgs:\n2CIUSERARG               -Xoptionsfile=/home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/options.default\n...\n1CIIGNOREDARGS Ignored Args:\n2CIIGNOREDARG            -XX:+UseCompressedOop\n2CIIGNOREDARG            -XX:CompressedClassSpaceSize=528482304\nNULL\n1CIUSERLIMITS  User Limits (in bytes except for NOFILE and NPROC)\nNULL           ------------------------------------------------------------------------\nNULL           type                            soft limit           hard limit\n2CIUSERLIMIT   RLIMIT_AS                        unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_CORE                              0            unlimited\n2CIUSERLIMIT   RLIMIT_CPU                       unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_DATA                      unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_FSIZE                     unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_LOCKS                     unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_MEMLOCK                       65536                65536\n2CIUSERLIMIT   RLIMIT_NOFILE                         4096                 4096\n2CIUSERLIMIT   RLIMIT_NPROC                          4096                30592\n2CIUSERLIMIT   RLIMIT_RSS                       unlimited            unlimited\n2CIUSERLIMIT   RLIMIT_STACK                       8388608            unlimited\n2CIUSERLIMIT   RLIMIT_MSGQUEUE                     819200               819200\n2CIUSERLIMIT   RLIMIT_NICE                              0                    0\n2CIUSERLIMIT   RLIMIT_RTPRIO                            0                    0\n2CIUSERLIMIT   RLIMIT_SIGPENDING                    30592                30592\nNULL\n1CIENVVARS     Environment Variables\nNULL           ------------------------------------------------------------------------\n2CIENVVAR      XDG_VTNR=1\n2CIENVVAR      SSH_AGENT_PID=2653\n...\nNULL\n1CISYSINFO     System Information\nNULL           ------------------------------------------------------------------------\n2CISYSINFO     /proc/sys/kernel/core_pattern = core\n2CISYSINFO     /proc/sys/kernel/core_uses_pid = 1\nNULL\n1CICPUINFO     CPU Information\nNULL           ------------------------------------------------------------------------\n2CIPHYSCPU     Physical CPUs: 8\n2CIONLNCPU     Online CPUs: 8\n2CIBOUNDCPU    Bound CPUs: 8\n2CIACTIVECPU   Active CPUs: 0\n2CITARGETCPU   Target CPUs: 8\n2CIJITFEATURE  CPU features (JIT): fpu cx8 cmov mmx sse sse2 ssse3 fma sse4_1 popcnt aesni osxsave avx avx2 rdt_m\n2CIAOTFEATURE  CPU features (AOT): fpu cx8 cmov mmx sse sse2 ssse3 fma sse4_1 popcnt aesni osxsave avx avx2 rdt_m\nNULL\n1CICGRPINFO    Cgroup Information\nNULL           ------------------------------------------------------------------------\n2CICGRPINFO    subsystem : cpu\n2CICGRPINFO    cgroup name : /\n3CICGRPINFO    CPU Period : 100000 microseconds\n3CICGRPINFO    CPU Quota : Not Set\n3CICGRPINFO    CPU Shares : 1024\n3CICGRPINFO    Period intervals elapsed count : 0\n3CICGRPINFO    Throttled count : 0\n3CICGRPINFO    Total throttle time : 0 nanoseconds\n2CICGRPINFO    subsystem : cpuset\n2CICGRPINFO    cgroup name : /\n3CICGRPINFO    CPU exclusive : 1\n3CICGRPINFO    Mem exclusive : 1\n3CICGRPINFO    CPUs : 0-7\n3CICGRPINFO    Mems : 0\n2CICGRPINFO    subsystem : memory\n2CICGRPINFO    cgroup name : /\n3CICGRPINFO    Memory Limit : Not Set\n3CICGRPINFO    Memory + Swap Limit : Not Set\n3CICGRPINFO    Memory Usage : 5363396608 bytes\n3CICGRPINFO    Memory + Swap Usage : 5363396608 bytes\n3CICGRPINFO    Memory Max Usage : 0 bytes\n3CICGRPINFO    Memory + Swap Max Usage : 0 bytes\n3CICGRPINFO    Memory limit exceeded count : 0\n3CICGRPINFO    Memory + Swap limit exceeded count : 0\n3CICGRPINFO    OOM Killer Disabled : 0\n3CICGRPINFO    Under OOM : 0\nNULL\n
    "},{"location":"dump_javadump/#nativememinfo","title":"NATIVEMEMINFO","text":"

    This section records information about native memory that is requested by using library functions such as malloc() and mmap(). Values are provided as a breakdown, per component, indicating the total number of bytes allocated and the number of native memory allocations. In the following example, 4,682,840 bytes of native memory are allocated (but not yet freed) to VM Classes, which correspond to 141 allocations.

    NULL           ------------------------------------------------------------------------\n0SECTION       NATIVEMEMINFO subcomponent dump routine\nNULL           =================================\n0MEMUSER\n1MEMUSER       JRE: 2,569,088,312 bytes / 4653 allocations\n1MEMUSER       |\n2MEMUSER       +--VM: 2,280,088,336 bytes / 2423 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Classes: 4,682,840 bytes / 141 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Memory Manager (GC): 2,054,966,784 bytes / 433 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Java Heap: 2,014,113,792 bytes / 1 allocation\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 40,852,992 bytes / 432 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Threads: 10,970,016 bytes / 156 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Java Stack: 197,760 bytes / 16 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Native Stack: 10,616,832 bytes / 17 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 155,424 bytes / 123 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Trace: 180,056 bytes / 263 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JVMTI: 17,776 bytes / 13 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JNI: 36,184 bytes / 52 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Port Library: 208,179,632 bytes / 72 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Unused <32bit allocation regions: 208,168,752 bytes / 1 allocation\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 10,880 bytes / 71 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Other: 1,055,048 bytes / 1293 allocations\n1MEMUSER       |\n2MEMUSER       +--JIT: 288,472,816 bytes / 140 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JIT Code Cache: 268,435,456 bytes / 1 allocation\n2MEMUSER       |  |\n3MEMUSER       |  +--JIT Data Cache: 2,097,216 bytes / 1 allocation\n2MEMUSER       |  |\n3MEMUSER       |  +--Other: 17,940,144 bytes / 138 allocations\n1MEMUSER       |\n2MEMUSER       +--Class Libraries: 13,432 bytes / 25 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--VM Class Libraries: 13,432 bytes / 25 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--sun.misc.Unsafe: 3,184 bytes / 13 allocations\n4MEMUSER       |  |  |  |\n5MEMUSER       |  |  |  +--Direct Byte Buffers: 1,056 bytes / 12 allocations\n4MEMUSER       |  |  |  |\n5MEMUSER       |  |  |  +--Other: 2,128 bytes / 1 allocation\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 10,248 bytes / 12 allocations\n1MEMUSER       |\n2MEMUSER       +--Unknown: 513,728 bytes / 2065 allocations\nNULL\n

    This section does not record memory that is allocated by application or JNI code and is typically a little less than the value recorded by operating system tools.

    "},{"location":"dump_javadump/#meminfo","title":"MEMINFO","text":"

    This section relates to memory management, providing a breakdown of memory usage in the VM for the object heap, internal memory, memory used for classes, the JIT code cache, and JIT data cache in decimal and hexadecimal format. You can also find out which garbage collection policy is in use when the dump is produced.

    The object memory area (1STHEAPTYPE) records each memory region in use, its start and end address, and region size. Further information is recorded about the memory segments that are used for internal memory, class memory, the JIT code cache, and JIT data cache (1STSEGMENT). This information includes the address of the segment control data structure, the start and end address of the native memory segment, as well as the segment size.

    For clarity, the following example shows a shortened version of this section, where ... indicates that lines are removed:

    NULL           ------------------------------------------------------------------------\n0SECTION       MEMINFO subcomponent dump routine\nNULL           =================================\nNULL\n1STHEAPTYPE    Object Memory\nNULL           id                 start              end                size               space/region\n1STHEAPSPACE   0x00007FF4F00744A0         --                 --                 --         Generational\n1STHEAPREGION  0x00007FF4F0074CE0 0x0000000087F40000 0x0000000088540000 0x0000000000600000 Generational/Tenured Region\n1STHEAPREGION  0x00007FF4F0074930 0x00000000FFE00000 0x00000000FFF00000 0x0000000000100000 Generational/Nursery Region\n1STHEAPREGION  0x00007FF4F0074580 0x00000000FFF00000 0x0000000100000000 0x0000000000100000 Generational/Nursery Region\nNULL\n1STHEAPTOTAL   Total memory:                     8388608 (0x0000000000800000)\n1STHEAPINUSE   Total memory in use:              2030408 (0x00000000001EFB48)\n1STHEAPFREE    Total memory free:                6358200 (0x00000000006104B8)\nNULL\n1STSEGTYPE     Internal Memory\nNULL           segment            start              alloc              end                type       size\n1STSEGMENT     0x00007FF4F004CBC8 0x00007FF4CD33C000 0x00007FF4CD33C000 0x00007FF4CE33C000 0x01000440 0x0000000001000000\n1STSEGMENT     0x00007FF4F004CB08 0x00007FF4DE43D030 0x00007FF4DE517770 0x00007FF4DE53D030 0x00800040 0x0000000000100000\nNULL\n1STSEGTOTAL    Total memory:                    17825792 (0x0000000001100000)\n1STSEGINUSE    Total memory in use:               894784 (0x00000000000DA740)\n1STSEGFREE     Total memory free:               16931008 (0x00000000010258C0)\nNULL\n1STSEGTYPE     Class Memory\nNULL           segment            start              alloc              end                type       size\n1STSEGMENT     0x00007FF4F03B5638 0x0000000001053D98 0x000000000105BD98 0x000000000105BD98 0x00010040 0x0000000000008000\n1STSEGMENT     0x00007FF4F03B5578 0x0000000001048188 0x0000000001050188 0x0000000001050188 0x00010040 0x0000000000008000\n...\nNULL\n1STSEGTOTAL    Total memory:                     3512520 (0x00000000003598C8)\n1STSEGINUSE    Total memory in use:              3433944 (0x00000000003465D8)\n1STSEGFREE     Total memory free:                  78576 (0x00000000000132F0)\nNULL\n1STSEGTYPE     JIT Code Cache\nNULL           segment            start              alloc              end                type       size\n1STSEGMENT     0x00007FF4F00961F8 0x00007FF4CE43D000 0x00007FF4CE445790 0x00007FF4DE43D000 0x00000068 0x0000000010000000\nNULL\n1STSEGTOTAL    Total memory:                   268435456 (0x0000000010000000)\n1STSEGINUSE    Total memory in use:                34704 (0x0000000000008790)\n1STSEGFREE     Total memory free:              268400752 (0x000000000FFF7870)\n1STSEGLIMIT    Allocation limit:               268435456 (0x0000000010000000)\nNULL\n1STSEGTYPE     JIT Data Cache\nNULL           segment            start              alloc              end                type       size\n1STSEGMENT     0x00007FF4F0096668 0x00007FF4CC553030 0x00007FF4CC753030 0x00007FF4CC753030 0x00000048 0x0000000000200000\nNULL\n1STSEGTOTAL    Total memory:                     2097152 (0x0000000000200000)\n1STSEGINUSE    Total memory in use:              2097152 (0x0000000000200000)\n1STSEGFREE     Total memory free:                      0 (0x0000000000000000)\n1STSEGLIMIT    Allocation limit:               402653184 (0x0000000018000000)\nNULL\n1STGCHTYPE     GC History\nNULL\n

    In the example, the GC History (1STGCHTYPE) section is blank. This section is populated if a garbage collection cycle occurred in a VM that is being diagnosed with the trace facility.

    "},{"location":"dump_javadump/#locks","title":"LOCKS","text":"

    This section of the Java dump provides information about locks, which protect shared resources from being accessed by more than one entity at a time. The information is essential in a deadlock situation, where two threads attempt to synchronize on an object and lock an instance of a class. Precise information is recorded about the threads that are causing the problem, which enables you to identify the root cause.

    The following example shows a typical LOCKS section, where no deadlocks existed at the time the dump was triggered. For clarity, the following example shows a shortened version of this section, where ... indicates that lines are removed:

    NULL           ------------------------------------------------------------------------\n0SECTION       LOCKS subcomponent dump routine\nNULL           ===============================\nNULL\n1LKPOOLINFO    Monitor pool info:\n2LKPOOLTOTAL     Current total number of monitors: 3\nNULL\n1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors):\n2LKMONINUSE      sys_mon_t:0x00007FF4B0001D78 infl_mon_t: 0x00007FF4B0001DF8:\n3LKMONOBJECT       java/lang/ref/ReferenceQueue@0x00000000FFE26A10: <unowned>\n3LKNOTIFYQ            Waiting to be notified:\n3LKWAITNOTIFY            \"Common-Cleaner\" (J9VMThread:0x0000000000FD0100)\nNULL\n1LKREGMONDUMP  JVM System Monitor Dump (registered monitors):\n2LKREGMON          Thread global lock (0x00007FF4F0004FE8): <unowned>\n2LKREGMON          &(PPG_mem_mem32_subAllocHeapMem32.monitor) lock (0x00007FF4F0005098): <unowned>\n2LKREGMON          NLS hash table lock (0x00007FF4F0005148): <unowned>\n...\nNULL\n
    "},{"location":"dump_javadump/#threads","title":"THREADS","text":"

    The THREADS section of a Java dump file provides summary information about the VM thread pool and detailed information about Java threads, native threads, and stack traces. Understanding the content of this section can help you diagnose problems that are caused by blocked or waiting threads.

    A Java thread runs on a native thread. Several lines are recorded for each Java thread in the Thread Details subsection, which include the following key pieces of information:

    Java thread priorities are mapped to operating system priority values. Thread states are shown in the following table:

    Thread state value Status Description R Runnable The thread is able to run CW Condition Wait The thread is waiting S Suspended The thread is suspended by another thread Z Zombie The thread is destroyed P Parked The thread is parked by java.util.concurrent B Blocked The thread is waiting to obtain a lock

    For threads that are parked (P), blocked (B), or waiting (CW), an additional line (3XMTHREADBLOCK) is included in the output that shows what the thread is parked on, blocked on, or waiting for. For threads that are waiting for a class initialization lock (java/lang/J9VMInternals$ClassInitializationLock), this line includes the name of the thread that is currently working to progress the initialization of the class. You can use this information to diagnose deadlocks that are caused by class initialization, which might not be detected and reported in the LOCKS section.

    For clarity, the following example shows a shortened version of a typical THREADS section, where ... indicates that lines are removed:

    NULL           ------------------------------------------------------------------------\n0SECTION       THREADS subcomponent dump routine\nNULL           =================================\nNULL\n1XMPOOLINFO    JVM Thread pool info:\n2XMPOOLTOTAL       Current total number of pooled threads: 19\n2XMPOOLLIVE        Current total number of live threads: 18\n2XMPOOLDAEMON      Current total number of live daemon threads: 15\nNULL\n1XMTHDINFO     Thread Details\nNULL\n...\n3XMTHREADINFO      \"JIT Diagnostic Compilation Thread-007 Suspended\" J9VMThread:0x0000000000035200, omrthread_t:0x00007F3F8C0D02C8, java/lang/Thread:0x00000000FFF42120, state:R, prio=10\n3XMJAVALTHREAD            (java/lang/Thread getId:0x9, isDaemon:true)\n3XMJAVALTHRCCL            sun/misc/Launcher$AppClassLoader(0x00000000FFF3BF98)\n3XMTHREADINFO1            (native thread ID:0x618F, native priority:0xB, native policy:UNKNOWN, vmstate:CW, vm thread flags:0x00000081)\n3XMTHREADINFO2            (native stack address range from:0x00007F3F879C5000, to:0x00007F3F87AC5000, size:0x100000)\n3XMCPUTIME               CPU usage total: 0.052410771 secs, current category=\"JIT\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           No Java callstack associated with this thread\n...\nNULL\n...\n3XMTHREADINFO      \"Class Initialization Thread 2\" J9VMThread:0x0000000000124D00, omrthread_t:0x00007F3F8C1494C8, java/lang/Thread:0x00000000FFF53EE8, state:CW, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x13, isDaemon:false)\n3XMJAVALTHRCCL            sun/misc/Launcher$AppClassLoader(0x00000000FFF3BF98)\n3XMTHREADINFO1            (native thread ID:0x6199, native priority:0x5, native policy:UNKNOWN, vmstate:CW, vm thread flags:0x00000181)\n3XMTHREADINFO2            (native stack address range from:0x00007F3F74AB4000, to:0x00007F3F74AF4000, size:0x40000)\n3XMCPUTIME               CPU usage total: 0.008712260 secs, current category=\"Application\"\n3XMTHREADBLOCK     Waiting on: java/lang/J9VMInternals$ClassInitializationLock@0x00000000FFF61C90 Owned by: <unowned> Initializing thread: \"Class Initialization Thread 1\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=4096 (0x1000)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at java/lang/Class.forNameImpl(Native Method)\n4XESTACKTRACE                at java/lang/Class.forName(Class.java:339)\n4XESTACKTRACE                at ClassInitLockBug$ClassInitThread.run(ClassInitLockBug.java:16)\n...\nNULL\n...\nNULL\n3XMTHREADINFO      \"Class Initialization Thread 1\" J9VMThread:0x0000000000124100, omrthread_t:0x00007F3F8C148F50, java/lang/Thread:0x00000000FFF53D80, state:CW, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x12, isDaemon:false)\n3XMJAVALTHRCCL            sun/misc/Launcher$AppClassLoader(0x00000000FFF3BF98)\n3XMTHREADINFO1            (native thread ID:0x6198, native priority:0x5, native policy:UNKNOWN, vmstate:CW, vm thread flags:0x00000481)\n3XMTHREADINFO2            (native stack address range from:0x00007F3F74AF5000, to:0x00007F3F74B35000, size:0x40000)\n3XMCPUTIME               CPU usage total: 0.010221701 secs, current category=\"Application\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=12736 (0x31C0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at java/lang/Thread.sleepImpl(Native Method)\n4XESTACKTRACE                at java/lang/Thread.sleep(Thread.java:983)\n4XESTACKTRACE                at java/lang/Thread.sleep(Thread.java:966)\n4XESTACKTRACE                at TestClass.<clinit>(ClassInitLockBug.java:29)\n4XESTACKTRACE                at java/lang/Class.forNameImpl(Native Method)\n4XESTACKTRACE                at java/lang/Class.forName(Class.java:339)\n4XESTACKTRACE                at ClassInitLockBug$ClassInitThread.run(ClassInitLockBug.java:16)\n...\nNULL\n...\nNULL\n1XMTHDSUMMARY  Threads CPU Usage Summary\nNULL           =========================\nNULL\n1XMTHDCATINFO  Warning: to get more accurate CPU times for the GC, the option -XX:-ReduceCPUMonitorOverhead can be used. See the user guide for more information.\nNULL\n1XMTHDCATEGORY All JVM attached threads: 0.698865000 secs\n1XMTHDCATEGORY |\n2XMTHDCATEGORY +--System-JVM: 0.653723000 secs\n2XMTHDCATEGORY |  |\n3XMTHDCATEGORY |  +--GC: 0.047248000 secs\n2XMTHDCATEGORY |  |\n3XMTHDCATEGORY |  +--JIT: 0.512971000 secs\n1XMTHDCATEGORY |\n2XMTHDCATEGORY +--Application: 0.045142000 secs\n
    "},{"location":"dump_javadump/#hooks","title":"HOOKS","text":"

    This section shows internal VM event callbacks, which are used for diagnosing performance problems in the VM. Multiple hook interfaces are listed, which include their individual hook events.

    The following example shows data for the J9VMHookInterface, including the total time for all previous events, the call site location (<source file>:<line number>), start time, and duration of the last callback and the longest callback (all times measured in microseconds). The hook data is reset after each Java dump.

    NULL           ------------------------------------------------------------------------\nSECTION HOOK   subcomponent dump routine\nNULL           =========================\n1NOTE          These data are reset every time a javacore is taken\n1HKINTERFACE   MM_OMRHookInterface\nNULL           ------------------------------------------------------------------------\n1HKINTERFACE   MM_PrivateHookInterface\nNULL           ------------------------------------------------------------------------\n1HKINTERFACE   MM_HookInterface\nNULL           ------------------------------------------------------------------------\n1HKINTERFACE   J9VMHookInterface\nNULL           ------------------------------------------------------------------------\n2HKEVENTID     1\n3HKCALLCOUNT       1239\n3HKTOTALTIME       219564us\n3HKLAST            Last Callback\n4HKCALLSITE            trcengine.c:395\n4HKSTARTTIME           Start Time: 2019-10-18T00:15:14.664\n4HKDURATION            Duration : 16us\n3HKLONGST          Longest Callback\n4HKCALLSITE            trcengine.c:395\n4HKSTARTTIME           Start Time: 2019-10-18T21:28:34.895\n4HKDURATION            Duration : 5012us\nNULL\n...\n1HKINTERFACE   J9VMZipCachePoolHookInterface\nNULL           ------------------------------------------------------------------------\n1HKINTERFACE   J9JITHookInterface\nNULL           ------------------------------------------------------------------------\n2HKEVENTID     3\n3HKCALLCOUNT       3113\n3HKTOTALTIME       4904us\n3HKLAST            Last Callback\n4HKCALLSITE            common/mgmtinit.c:193\n4HKSTARTTIME           Start Time: 2019-10-18T16:04:15.320\n4HKDURATION            Duration : 3us\n3HKLONGST          Longest Callback\n4HKCALLSITE            common/mgmtinit.c:193\n4HKSTARTTIME           Start Time: 2019-10-18T16:37:17.633\n4HKDURATION            Duration : 27us\nNULL\n...\n
    "},{"location":"dump_javadump/#shared-classes","title":"SHARED CLASSES","text":"

    If the shared classes cache is enabled at run time, the information that is provided in a Java dump file describes settings that were used when creating the cache, together with summary information about the size and content of the cache.

    In the following example, the shared classes cache was created with a Class Debug Area (-Xnolinenumbers=false). Byte code instrumentation (BCI) is enabled, which is the default, and VMs sharing the cache are allowed to store classpaths, which is also the default.

    The Cache Summary shows a cache size (2SCLTEXTCSZ) of 16776608 bytes, with a soft maximum size (2SCLTEXTSMB) also of 16776608 bytes, which leaves 12691668 bytes of free space (2SCLTEXTFRB). The size of the Class Debug Area (2SCLTEXTDAS) is 1331200 bytes and only 11% of this space is used.

    In the Cache Memory Status subsection, the line 2SCLTEXTCMDT indicates the name and location of the shared cache and cr indicates that the cache is a 64-bit compressed references cache.

    NULL           ------------------------------------------------------------------------\n0SECTION       SHARED CLASSES subcomponent dump routine\nNULL           ========================================\nNULL\n1SCLTEXTCRTW   Cache Created With\nNULL           ------------------\nNULL\n2SCLTEXTXNL        -Xnolinenumbers       = false\n2SCLTEXTBCI        BCI Enabled           = true\n2SCLTEXTBCI        Restrict Classpaths   = false\nNULL\n1SCLTEXTCSUM   Cache Summary\nNULL           ------------------\nNULL\n2SCLTEXTNLC        No line number content                    = false\n2SCLTEXTLNC        Line number content                       = true\nNULL\n2SCLTEXTRCS        ROMClass start address                    = 0x00007F423061C000\n2SCLTEXTRCE        ROMClass end address                      = 0x00007F42307B9A28\n2SCLTEXTMSA        Metadata start address                    = 0x00007F42313D42FC\n2SCLTEXTCEA        Cache end address                         = 0x00007F4231600000\n2SCLTEXTRTF        Runtime flags                             = 0x00102001ECA6028B\n2SCLTEXTCGN        Cache generation                          = 35\nNULL\n2SCLTEXTCSZ        Cache size                                = 16776608\n2SCLTEXTSMB        Softmx bytes                              = 16776608\n2SCLTEXTFRB        Free bytes                                = 12691668\n2SCLTEXTRCB        ROMClass bytes                            = 1694248\n2SCLTEXTAOB        AOT code bytes                            = 0\n2SCLTEXTADB        AOT data bytes                            = 0\n2SCLTEXTAHB        AOT class hierarchy bytes                 = 32\n2SCLTEXTATB        AOT thunk bytes                           = 0\n2SCLTEXTARB        Reserved space for AOT bytes              = -1\n2SCLTEXTAMB        Maximum space for AOT bytes               = -1\n2SCLTEXTJHB        JIT hint bytes                            = 308\n2SCLTEXTJPB        JIT profile bytes                         = 2296\n2SCLTEXTJRB        Reserved space for JIT data bytes         = -1\n2SCLTEXTJMB        Maximum space for JIT data bytes          = -1\n2SCLTEXTNOB        Java Object bytes                         = 0\n2SCLTEXTZCB        Zip cache bytes                           = 919328\n2SCLTEXTSHB        Startup hint bytes                        = 0\n2SCLTEXTRWB        ReadWrite bytes                           = 114080\n2SCLTEXTJCB        JCL data bytes                            = 0\n2SCLTEXTBDA        Byte data bytes                           = 0\n2SCLTEXTMDA        Metadata bytes                            = 23448\n2SCLTEXTDAS        Class debug area size                     = 1331200\n2SCLTEXTDAU        Class debug area % used                   = 11%\n2SCLTEXTDAN        Class LineNumberTable bytes               = 156240\n2SCLTEXTDAV        Class LocalVariableTable bytes            = 0\nNULL\n2SCLTEXTNRC        Number ROMClasses                         = 595\n2SCLTEXTNAM        Number AOT Methods                        = 0\n2SCLTEXTNAD        Number AOT Data Entries                   = 0\n2SCLTEXTNAH        Number AOT Class Hierarchy                = 1\n2SCLTEXTNAT        Number AOT Thunks                         = 0\n2SCLTEXTNJH        Number JIT Hints                          = 14\n2SCLTEXTNJP        Number JIT Profiles                       = 20\n2SCLTEXTNCP        Number Classpaths                         = 1\n2SCLTEXTNUR        Number URLs                               = 0\n2SCLTEXTNTK        Number Tokens                             = 0\n2SCLTEXTNOJ        Number Java Objects                       = 0\n2SCLTEXTNZC        Number Zip Caches                         = 5\n2SCLTEXTNSH        Number Startup Hint Entries               = 0\n2SCLTEXTNJC        Number JCL Entries                        = 0\n2SCLTEXTNST        Number Stale classes                      = 0\n2SCLTEXTPST        Percent Stale classes                     = 0%\nNULL\n2SCLTEXTCPF        Cache is 24% full\nNULL\n1SCLTEXTCMST   Cache Memory Status\nNULL           ------------------\n1SCLTEXTCNTD       Cache Name                    Feature                  Memory type              Cache path\nNULL\n2SCLTEXTCMDT       sharedcc_doc-javacore         CR                       Memory mapped file       /tmp/javasharedresources/C290M4F1A64P_sharedcc_doc-javacore_G35\nNULL\n1SCLTEXTCMST   Cache Lock Status\nNULL           ------------------\n1SCLTEXTCNTD       Lock Name                     Lock type                TID owning lock\nNULL\n2SCLTEXTCWRL       Cache write lock              File lock                Unowned\n2SCLTEXTCRWL       Cache read/write lock         File lock                Unowned\nNULL\n

    The following example shows information for a layered cache:

    NULL           ------------------------------------------------------------------------\n0SECTION       SHARED CLASSES subcomponent dump routine\nNULL           ========================================\nNULL\n1SCLTEXTCSTL   Cache Statistics for Top Layer\nNULL\n1SCLTEXTCRTW       Cache Created With\nNULL               ------------------\nNULL\n2SCLTEXTXNL            -Xnolinenumbers       = false\n2SCLTEXTBCI            BCI Enabled           = true\n2SCLTEXTBCI            Restrict Classpaths   = false\nNULL\n1SCLTEXTCSUM       Cache Summary\nNULL               ------------------\nNULL\n2SCLTEXTNLC            No line number content                    = false\n2SCLTEXTLNC            Line number content                       = false\nNULL\n2SCLTEXTRCS            ROMClass start address                    = 0x00007F0EDB567000\n2SCLTEXTRCE            ROMClass end address                      = 0x00007F0EDB567000\n2SCLTEXTMSA            Metadata start address                    = 0x00007F0EDC40241C\n2SCLTEXTCEA            Cache end address                         = 0x00007F0EDC54B000\n2SCLTEXTRTF            Runtime flags                             = 0x80102001ECA602BB\n2SCLTEXTCGN            Cache generation                          = 41\n2SCLTEXTCLY            Cache layer                               = 1\nNULL\n2SCLTEXTCSZ            Cache size                                = 16776608\n2SCLTEXTSMB            Softmx bytes                              = 16776608\n2SCLTEXTFRB            Free bytes                                = 15315996\n2SCLTEXTARB            Reserved space for AOT bytes              = -1\n2SCLTEXTAMB            Maximum space for AOT bytes               = -1\n2SCLTEXTJRB            Reserved space for JIT data bytes         = -1\n2SCLTEXTJMB            Maximum space for JIT data bytes          = -1\n2SCLTEXTRWB            ReadWrite bytes                           = 114080\n2SCLTEXTDAS            Class debug area size                     = 1331200\n2SCLTEXTDAU            Class debug area % used                   = 0%\n2SCLTEXTDAN            Class LineNumberTable bytes               = 0\n2SCLTEXTDAV            Class LocalVariableTable bytes            = 0\nNULL\n2SCLTEXTCPF            Cache is 8% full\nNULL\n1SCLTEXTCMST       Cache Memory Status\nNULL               ------------------\n1SCLTEXTCNTD           Cache Name                    Feature                  Memory type              Cache path\nNULL\n2SCLTEXTCMDT           Cache1                        CR                       Memory mapped file       /tmp/javasharedresources/C290M4F1A64P_Cache1_G41L01\nNULL\n1SCLTEXTCMST       Cache Lock Status\nNULL               ------------------\n1SCLTEXTCNTD           Lock Name                     Lock type                TID owning lock\nNULL\n2SCLTEXTCWRL           Cache write lock              File lock                Unowned\n2SCLTEXTCRWL           Cache read/write lock         File lock                Unowned\nNULL\n1SCLTEXTCSAL   Cache Statistics for All Layers\nNULL\n2SCLTEXTRCB            ROMClass bytes                            = 1459040\n2SCLTEXTAOB            AOT code bytes                            = 57624\n2SCLTEXTADB            AOT data bytes                            = 272\n2SCLTEXTAHB            AOT class hierarchy bytes                 = 1840\n2SCLTEXTATB            AOT thunk bytes                           = 632\n2SCLTEXTJHB            JIT hint bytes                            = 484\n2SCLTEXTJPB            JIT profile bytes                         = 0\n2SCLTEXTNOB            Java Object bytes                         = 0\n2SCLTEXTZCB            Zip cache bytes                           = 1134016\n2SCLTEXTSHB            Startup hint bytes                        = 0\n2SCLTEXTJCB            JCL data bytes                            = 0\n2SCLTEXTBDA            Byte data bytes                           = 0\nNULL\n2SCLTEXTNRC            Number ROMClasses                         = 503\n2SCLTEXTNAM            Number AOT Methods                        = 16\n2SCLTEXTNAD            Number AOT Data Entries                   = 1\n2SCLTEXTNAH            Number AOT Class Hierarchy                = 28\n2SCLTEXTNAT            Number AOT Thunks                         = 11\n2SCLTEXTNJH            Number JIT Hints                          = 15\n2SCLTEXTNJP            Number JIT Profiles                       = 0\n2SCLTEXTNCP            Number Classpaths                         = 1\n2SCLTEXTNUR            Number URLs                               = 0\n2SCLTEXTNTK            Number Tokens                             = 0\n2SCLTEXTNOJ            Number Java Objects                       = 0\n2SCLTEXTNZC            Number Zip Caches                         = 21\n2SCLTEXTNSH            Number Startup Hint Entries               = 0\n2SCLTEXTNJC            Number JCL Entries                        = 0\n2SCLTEXTNST            Number Stale classes                      = 0\n2SCLTEXTPST            Percent Stale classes                     = 0%\n
    "},{"location":"dump_javadump/#classes","title":"CLASSES","text":"

    The classes section shows information about class loaders. The first part is a summary that records each available class loader (2CLTEXTCLLOADER) followed by the number of libraries and classes that it loaded. This information is followed by a more detailed list of libraries (1CLTEXTCLLIB) and classes (1CLTEXTCLLO) that are loaded.

    In the example you can see that the java/lang/InternalAnonymousClassLoader loaded two classes, jdk/internal/loader/BuiltinClassLoader$$Lambda$2/00000000F03876A0(0x0000000001030F00) and jdk/internal/loader/BuiltinClassLoader$$Lambda$1/00000000F00D2460(0x0000000001018A00).

    NULL           ------------------------------------------------------------------------\n0SECTION       CLASSES subcomponent dump routine\nNULL           =================================\n1CLTEXTCLLOS    Classloader summaries\n1CLTEXTCLLSS        12345678: 1=primordial,2=extension,3=shareable,4=middleware,5=system,6=trusted,7=application,8=delegating\n2CLTEXTCLLOADER     p---st-- Loader *System*(0x00000000FFE1D258)\n3CLNMBRLOADEDLIB        Number of loaded libraries 5\n3CLNMBRLOADEDCL         Number of loaded classes 638\n2CLTEXTCLLOADER     -x--st-- Loader jdk/internal/loader/ClassLoaders$PlatformClassLoader(0x00000000FFE1D4F0), Parent *none*(0x0000000000000000)\n3CLNMBRLOADEDLIB        Number of loaded libraries 0\n3CLNMBRLOADEDCL         Number of loaded classes 0\n2CLTEXTCLLOADER     ----st-- Loader java/lang/InternalAnonymousClassLoader(0x00000000FFE1DFD0), Parent *none*(0x0000000000000000)\n3CLNMBRLOADEDLIB        Number of loaded libraries 0\n3CLNMBRLOADEDCL         Number of loaded classes 2\n2CLTEXTCLLOADER     -----ta- Loader jdk/internal/loader/ClassLoaders$AppClassLoader(0x00000000FFE1DAD0), Parent jdk/internal/loader/ClassLoaders$PlatformClassLoader(0x00000000FFE1D4F0)\n3CLNMBRLOADEDLIB        Number of loaded libraries 0\n3CLNMBRLOADEDCL         Number of loaded classes 0\n1CLTEXTCLLIB    ClassLoader loaded libraries\n2CLTEXTCLLIB        Loader *System*(0x00000000FFE1D258)\n3CLTEXTLIB              /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/compressedrefs/jclse9_29\n3CLTEXTLIB              /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/java\n3CLTEXTLIB              /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/compressedrefs/j9jit29\n3CLTEXTLIB              /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/zip\n3CLTEXTLIB              /home/me/openj9-openjdk-jdk9/build/linux-x86_64-normal-server-release/images/jdk/lib/nio\n1CLTEXTCLLOD    ClassLoader loaded classes\n2CLTEXTCLLOAD       Loader *System*(0x00000000FFE1D258)\n3CLTEXTCLASS            [Ljava/lang/Thread$State;(0x0000000001056400)\n...\n2CLTEXTCLLOAD       Loader jdk/internal/loader/ClassLoaders$PlatformClassLoader(0x00000000FFE1D4F0)\n2CLTEXTCLLOAD       Loader java/lang/InternalAnonymousClassLoader(0x00000000FFE1DFD0)\n3CLTEXTCLASS            jdk/internal/loader/BuiltinClassLoader$$Lambda$2/00000000F03876A0(0x0000000001030F00)\n3CLTEXTCLASS            jdk/internal/loader/BuiltinClassLoader$$Lambda$1/00000000F00D2460(0x0000000001018A00)\n2CLTEXTCLLOAD       Loader jdk/internal/loader/ClassLoaders$AppClassLoader(0x00000000FFE1DAD0)\n
    "},{"location":"dump_javadump/#scenarios","title":"Scenarios","text":""},{"location":"dump_javadump/#general-protection-fault","title":"General Protection Fault","text":"

    In this scenario, a Java application has crashed due to a General Protection Fault (GPF), automatically generating a Java dump file.

    The first section of the file (TITLE) tells you that the GPF triggered the Java dump.

    0SECTION       TITLE subcomponent dump routine\nNULL           ===============================\n1TICHARSET     UTF-8\n1TISIGINFO     Dump Event \"gpf\" (00002000) received\n1TIDATETIMEUTC Date: 2021/04/23 at 18:02:44:017 (UTC)\n1TIDATETIME    Date: 2021/04/23 at 14:02:44:017\n1TITIMEZONE    Timezone: UTC-4 (EDT)\n1TINANOTIME    System nanotime: 379202644260787\n1TIFILENAME    Javacore filename:    /home/test/JNICrasher/javacore.20210423.140244.29399.0002.txt\n1TIREQFLAGS    Request Flags: 0x81 (exclusive+preempt)\n1TIPREPSTATE   Prep State: 0x100 (trace_disabled)\n1TIPREPINFO    Exclusive VM access not taken: data may not be consistent across javacore sections\n

    To troubleshoot this problem, you need to know which thread caused the GPF to occur. The thread that was running at the time of the crash is reported as the current thread in the THREADS section of the Java dump. Here is an extract from the THREADS section:

    NULL           ------------------------------------------------------------------------\n0SECTION       THREADS subcomponent dump routine\nNULL           =================================\nNULL\n1XMPOOLINFO    JVM Thread pool info:\n2XMPOOLTOTAL       Current total number of pooled threads: 16\n2XMPOOLLIVE        Current total number of live threads: 15\n2XMPOOLDAEMON      Current total number of live daemon threads: 14\nNULL\n1XMCURTHDINFO  Current thread\n3XMTHREADINFO      \"main\" J9VMThread:0xB6B60E00, omrthread_t:0xB6B049D8, java/lang/Thread:0xB55444D0, state:R, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x1, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x72D8, native priority:0x5, native policy:UNKNOWN, vmstate:R, vm thread flags:0x00000000)\n3XMTHREADINFO2            (native stack address range from:0xB6CE3000, to:0xB74E4000, size:0x801000)\n3XMCPUTIME               CPU usage total: 0.319865924 secs, current category=\"Application\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=778008 (0xBDF18)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at JNICrasher.doSomethingThatCrashes(Native Method)\n4XESTACKTRACE                at JNICrasher.main(JNICrasher.java:7)\n3XMTHREADINFO3           Native callstack:\n4XENATIVESTACK               (0xB6C6F663 [libj9prt29.so+0x3b663])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB6C6F1CE [libj9prt29.so+0x3b1ce])\n4XENATIVESTACK               (0xB6C6F2C6 [libj9prt29.so+0x3b2c6])\n4XENATIVESTACK               (0xB6C6ED93 [libj9prt29.so+0x3ad93])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB6C6ED07 [libj9prt29.so+0x3ad07])\n4XENATIVESTACK               (0xB6C6AA3D [libj9prt29.so+0x36a3d])\n4XENATIVESTACK               (0xB6C6C3A4 [libj9prt29.so+0x383a4])\n4XENATIVESTACK               (0xB667FA19 [libj9dmp29.so+0xfa19])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB66878CF [libj9dmp29.so+0x178cf])\n4XENATIVESTACK               (0xB6688083 [libj9dmp29.so+0x18083])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB6680C0D [libj9dmp29.so+0x10c0d])\n4XENATIVESTACK               (0xB667F9D7 [libj9dmp29.so+0xf9d7])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB668B02F [libj9dmp29.so+0x1b02f])\n4XENATIVESTACK               (0xB668B4D3 [libj9dmp29.so+0x1b4d3])\n4XENATIVESTACK               (0xB66740F1 [libj9dmp29.so+0x40f1])\n4XENATIVESTACK               (0xB66726FA [libj9dmp29.so+0x26fa])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB66726A9 [libj9dmp29.so+0x26a9])\n4XENATIVESTACK               (0xB6676AE4 [libj9dmp29.so+0x6ae4])\n4XENATIVESTACK               (0xB668D75A [libj9dmp29.so+0x1d75a])\n4XENATIVESTACK               (0xB6A28DD4 [libj9vm29.so+0x81dd4])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB6A289EE [libj9vm29.so+0x819ee])\n4XENATIVESTACK               (0xB6A29A40 [libj9vm29.so+0x82a40])\n4XENATIVESTACK               (0xB6C52B6A [libj9prt29.so+0x1eb6a])\n4XENATIVESTACK               __kernel_rt_sigreturn+0x0 (0xB7747410)\n4XENATIVESTACK               (0xB75330B6 [libffi29.so+0x50b6])\n4XENATIVESTACK               ffi_raw_call+0xad (0xB7531C53 [libffi29.so+0x3c53])\n4XENATIVESTACK               (0xB69BE4AB [libj9vm29.so+0x174ab])\n4XENATIVESTACK               (0xB6A665BC [libj9vm29.so+0xbf5bc])\n4XENATIVESTACK               (0xB6A15552 [libj9vm29.so+0x6e552])\n4XENATIVESTACK               (0xB6A30894 [libj9vm29.so+0x89894])\n4XENATIVESTACK               (0xB6A6F169 [libj9vm29.so+0xc8169])\n4XENATIVESTACK               (0xB6C52F6E [libj9prt29.so+0x1ef6e])\n4XENATIVESTACK               (0xB6A6F1FA [libj9vm29.so+0xc81fa])\n4XENATIVESTACK               (0xB6A30994 [libj9vm29.so+0x89994])\n4XENATIVESTACK               (0xB6A2CE4C [libj9vm29.so+0x85e4c])\n4XENATIVESTACK               (0xB770487D [libjli.so+0x787d])\n4XENATIVESTACK               (0xB7719F72 [libpthread.so.0+0x6f72])\n4XENATIVESTACK               clone+0x5e (0xB763543E [libc.so.6+0xee43e])\n

    The extract tells you that the current thread was java/lang/Thread, and information is provided about the Java call stack and native call stack (3XMTHREADINFO3) at the point at which the crash occurred. To simulate a crash caused by a bug in an application, this example calls a JNI method whose native implementation causes a crash. The Java call stack shows the call to the JNI native method (JNIcrasher), and the native call stack shows the point of failure. In this example, the native call stack does not include any function names to help you isolate the error in the native code. You can get this information from a system dump, which is usually produced alongside the Java dump. Open the system dump with the Dump viewer and use the info thread command to print the Java and native stack for the current thread.

    The next time you run the application, you can use the -XX:+ShowNativeStackSymbols=all command line option to display the corresponding function names in the native call stack.

    4XENATIVESTACK               protectedBacktrace+0x12 (0x00007F3F9213E312 [libj9prt29.so+0x25312])\n4XENATIVESTACK               omrsig_protect+0x1e3 (0x00007F3F92142AD3 [libj9prt29.so+0x29ad3])\n4XENATIVESTACK               omrintrospect_backtrace_thread_raw+0xbf (0x00007F3F9213E80F [libj9prt29.so+0x2580f])\n4XENATIVESTACK               omrsig_protect+0x1e3 (0x00007F3F92142AD3 [libj9prt29.so+0x29ad3])\n4XENATIVESTACK               omrintrospect_backtrace_thread+0x70 (0x00007F3F9213E1D0 [libj9prt29.so+0x251d0])\n4XENATIVESTACK               setup_native_thread+0x1d2 (0x00007F3F9213F652 [libj9prt29.so+0x26652])\n4XENATIVESTACK               omrintrospect_threads_startDo_with_signal+0x474 (0x00007F3F921403F4 [libj9prt29.so+0x273f4])\n4XENATIVESTACK               omrsig_protect+0x1e3 (0x00007F3F92142AD3 [libj9prt29.so+0x29ad3])\n
    "},{"location":"dump_javadump/#java-outofmemoryerror","title":"Java OutOfMemoryError","text":"

    In this scenario, the Java heap runs out of memory, causing an OutOfMemoryError, which automatically generates a Java dump file.

    The first section of the file (TITLE) tells you that a systhrow event triggered the Java dump as a result of an OOM (java/lang/OutOfMemoryError) for Java heap space.

    0SECTION       TITLE subcomponent dump routine\nNULL           ===============================\n1TICHARSET     UTF-8\n1TISIGINFO     Dump Event \"systhrow\" (00040000) Detail \"java/lang/OutOfMemoryError\" \"Java heap space\" received\n1TIDATETIMEUTC Date: 2021/04/23 at 18:02:44:017 (UTC)\n1TIDATETIME    Date: 2021/04/23 at 14:02:44:017\n1TITIMEZONE    Timezone: UTC-4 (EDT)\n1TINANOTIME    System nanotime: 379202644260787\n1TIFILENAME    Javacore filename:    /home/cheesemp/test/javacore.20210423.140244.18885.0003.txt\n1TIREQFLAGS    Request Flags: 0x81 (exclusive+preempt)\n1TIPREPSTATE   Prep State: 0x104 (exclusive_vm_access+trace_disabled)\n

    The MEMINFO section records how much memory is allocated to the Java heap (1STHEAPTYPE Object Memory), how much is in use, and how much is free. Solving your problem might be as simple as setting a larger heap size when you start your application.

    If you don't know what size the Java heap was set to, you might find that information in the ENVINFO section, which records the command-line options that were used when the application started. Look or search for the 1CIUSERARGS UserArgs: string and review the entries that are recorded for all lines that start 2CIUSERARG. The Java heap size is set by the -Xmx option. If the size has not been set on the command line by -Xmx, the default value applies, which you can find in Default Settings.

    In this scenario, the solution to the problem is not an adjustment to the Java heap size. Here is the MEMINFO section:

    0SECTION       MEMINFO subcomponent dump routine\nNULL           =================================\nNULL\n1STHEAPTYPE    Object Memory\nNULL           id         start      end        size       space/region\n1STHEAPSPACE   0xB6B49D20     --         --         --     Generational\n1STHEAPREGION  0xB6B4A078 0x95750000 0xB5470000 0x1FD20000 Generational/Tenured Region\n1STHEAPREGION  0xB6B49F10 0xB5470000 0xB54C0000 0x00050000 Generational/Nursery Region\n1STHEAPREGION  0xB6B49DA8 0xB54C0000 0xB5750000 0x00290000 Generational/Nursery Region\nNULL\n1STHEAPTOTAL   Total memory:         536870912 (0x20000000)\n1STHEAPINUSE   Total memory in use:  302603160 (0x12095B98)\n1STHEAPFREE    Total memory free:    234267752 (0x0DF6A468)\n

    The output shows that only 56% of the Java heap is in use, so this suggests that the application is trying to do something suboptimal. To investigate further, you need to work out which thread was the current thread when the OOM occurred to see what it was trying to do. As in the previous scenario, you can find the current thread in the THREADS section. Here is an extract from the output:

    0SECTION       THREADS subcomponent dump routine\nNULL           =================================\nNULL\n1XMPOOLINFO    JVM Thread pool info:\n2XMPOOLTOTAL       Current total number of pooled threads: 16\n2XMPOOLLIVE        Current total number of live threads: 16\n2XMPOOLDAEMON      Current total number of live daemon threads: 15\nNULL\n1XMCURTHDINFO  Current thread\n3XMTHREADINFO      \"main\" J9VMThread:0xB6B60C00, omrthread_t:0xB6B049D8, java/lang/Thread:0x95764520, state:R, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x1, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x49C6, native priority:0x5, native policy:UNKNOWN, vmstate:R, vm thread flags:0x00001020)\n3XMTHREADINFO2            (native stack address range from:0xB6CB5000, to:0xB74B6000, size:0x801000)\n3XMCPUTIME               CPU usage total: 8.537823831 secs, current category=\"Application\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at java/lang/StringBuffer.ensureCapacityImpl(StringBuffer.java:696)\n4XESTACKTRACE                at java/lang/StringBuffer.append(StringBuffer.java:486(Compiled Code))\n5XESTACKTRACE                   (entered lock: java/lang/StringBuffer@0x957645B8, entry count: 1)\n4XESTACKTRACE                at java/lang/StringBuffer.append(StringBuffer.java:428(Compiled Code))\n4XESTACKTRACE                at HeapBreaker.main(HeapBreaker.java:34(Compiled Code))\n3XMTHREADINFO3           Native callstack:\n4XENATIVESTACK               (0xB6C535B3 [libj9prt29.so+0x3b5b3])\n4XENATIVESTACK               (0xB6C36F3E [libj9prt29.so+0x1ef3e])\n4XENATIVESTACK               (0xB6C5311E [libj9prt29.so+0x3b11e])\n4XENATIVESTACK               (0xB6C53216 [libj9prt29.so+0x3b216])\n4XENATIVESTACK               (0xB6C52CE3 [libj9prt29.so+0x3ace3])\n4XENATIVESTACK               (0xB6C36F3E [libj9prt29.so+0x1ef3e])\n4XENATIVESTACK               (0xB6C52C57 [libj9prt29.so+0x3ac57])\n4XENATIVESTACK               (0xB6C4E9CD [libj9prt29.so+0x369cd])\n4XENATIVESTACK               (0xB6C502FA [libj9prt29.so+0x382fa])\n

    To simulate a Java OutOfMemoryError, this example application repeatedly appends characters to a StringBuffer object in an infinite loop. The Java call stack shows the HeapBreaker.main method appending characters (java/lang/StringGuffer.append) until the method java/lang/StringBuffer.ensureCapacityImpl() throws the OutOfMemoryError.

    StringBuffer objects are wrappers for character arrays (char[]) and when the capacity of the underlying array is reached, the contents are automatically copied into a new, larger array. The new array is created in the StringBuffer.ensureCapacity() method, which more or less doubles the size of the old array. In this scenario, the array takes up all the remaining space in the Java heap.

    The MEMINFO section of the Java dump file can also tell you when an unexpectedly large allocation request causes an OOM. Look for the GC History (1STGCHTYPE) section, which details allocation requests that trigger GC activity. In the sample output you can see that a large allocation request (requestedbytes=603979784) triggered a global GC. When the GC could not free up sufficient space in the heap to satisfy the request, the allocation failure generated the OOM.

    1STGCHTYPE     GC History\n3STHSTTYPE     14:29:29:580239000 GMT j9mm.101 -   J9AllocateIndexableObject() returning NULL! 0 bytes requested for object of class B6BBC300 from memory space 'Generational' id=B6B49D20\n3STHSTTYPE     14:29:29:579916000 GMT j9mm.134 -   Allocation failure end: newspace=2686912/3014656 oldspace=231597224/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:579905000 GMT j9mm.470 -   Allocation failure cycle end: newspace=2686912/3014656 oldspace=231597224/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:579859000 GMT j9mm.475 -   GlobalGC end: workstackoverflow=0 overflowcount=0 memory=234284136/536870912\n3STHSTTYPE     14:29:29:579807000 GMT j9mm.90 -   GlobalGC collect complete\n3STHSTTYPE     14:29:29:579776000 GMT j9mm.137 -   Compact end: bytesmoved=301989896\n3STHSTTYPE     14:29:29:313899000 GMT j9mm.136 -   Compact start: reason=compact to meet allocation\n3STHSTTYPE     14:29:29:313555000 GMT j9mm.57 -   Sweep end\n3STHSTTYPE     14:29:29:310772000 GMT j9mm.56 -   Sweep start\n3STHSTTYPE     14:29:29:310765000 GMT j9mm.94 -   Class unloading end: classloadersunloaded=0 classesunloaded=0\n3STHSTTYPE     14:29:29:310753000 GMT j9mm.60 -   Class unloading start\n3STHSTTYPE     14:29:29:310750000 GMT j9mm.55 -   Mark end\n3STHSTTYPE     14:29:29:306013000 GMT j9mm.54 -   Mark start\n3STHSTTYPE     14:29:29:305957000 GMT j9mm.474 -   GlobalGC start: globalcount=9\n3STHSTTYPE     14:29:29:305888000 GMT j9mm.475 -   GlobalGC end: workstackoverflow=0 overflowcount=0 memory=234284136/536870912\n3STHSTTYPE     14:29:29:305837000 GMT j9mm.90 -   GlobalGC collect complete\n3STHSTTYPE     14:29:29:305808000 GMT j9mm.137 -   Compact end: bytesmoved=189784\n3STHSTTYPE     14:29:29:298042000 GMT j9mm.136 -   Compact start: reason=compact to meet allocation\n3STHSTTYPE     14:29:29:297695000 GMT j9mm.57 -   Sweep end\n3STHSTTYPE     14:29:29:291696000 GMT j9mm.56 -   Sweep start\n3STHSTTYPE     14:29:29:291692000 GMT j9mm.55 -   Mark end\n3STHSTTYPE     14:29:29:284994000 GMT j9mm.54 -   Mark start\n3STHSTTYPE     14:29:29:284941000 GMT j9mm.474 -   GlobalGC start: globalcount=8\n3STHSTTYPE     14:29:29:284916000 GMT j9mm.135 -   Exclusive access: exclusiveaccessms=0.016 meanexclusiveaccessms=0.016 threads=0 lastthreadtid=0xB6B61100 beatenbyotherthread=0\n3STHSTTYPE     14:29:29:284914000 GMT j9mm.469 -   Allocation failure cycle start: newspace=2678784/3014656 oldspace=80601248/533856256 loa=5338112/5338112 requestedbytes=603979784\n3STHSTTYPE     14:29:29:284893000 GMT j9mm.470 -   Allocation failure cycle end: newspace=2678784/3014656 oldspace=80601248/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:284858000 GMT j9mm.560 -   LocalGC end: rememberedsetoverflow=0 causedrememberedsetoverflow=0 scancacheoverflow=0 failedflipcount=0 failedflipbytes=0 failedtenurecount=0 failedtenurebytes=0 flipcount=2 flipbytes=64 newspace=2678784/3014656 oldspace=80601248/533856256 loa=5338112/5338112 tenureage=0\n3STHSTTYPE     14:29:29:284140000 GMT j9mm.140 -   Tilt ratio: 89\n3STHSTTYPE     14:29:29:283160000 GMT j9mm.64 -   LocalGC start: globalcount=8 scavengecount=335 weakrefs=0 soft=0 phantom=0 finalizers=0\n3STHSTTYPE     14:29:29:283123000 GMT j9mm.135 -   Exclusive access: exclusiveaccessms=0.016 meanexclusiveaccessms=0.016 threads=0 lastthreadtid=0xB6B61100 beatenbyotherthread=0\n3STHSTTYPE     14:29:29:283120000 GMT j9mm.469 -   Allocation failure cycle start: newspace=753616/3014656 oldspace=80601248/533856256 loa=5338112/5338112 requestedbytes=603979784\n3STHSTTYPE     14:29:29:283117000 GMT j9mm.133 -   Allocation failure start: newspace=753616/3014656 oldspace=80601248/533856256 loa=5338112/5338112 requestedbytes=603979784\n3STHSTTYPE     14:29:29:269762000 GMT j9mm.134 -   Allocation failure end: newspace=2686928/3014656 oldspace=80601248/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:269751000 GMT j9mm.470 -   Allocation failure cycle end: newspace=2686976/3014656 oldspace=80601248/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:269718000 GMT j9mm.560 -   LocalGC end: rememberedsetoverflow=0 causedrememberedsetoverflow=0 scancacheoverflow=0 failedflipcount=0 failedflipbytes=0 failedtenurecount=0 failedtenurebytes=0 flipcount=0 flipbytes=0 newspace=2686976/3014656 oldspace=80601248/533856256 loa=5338112/5338112 tenureage=0\n3STHSTTYPE     14:29:29:268981000 GMT j9mm.140 -   Tilt ratio: 89\n3STHSTTYPE     14:29:29:268007000 GMT j9mm.64 -   LocalGC start: globalcount=8 scavengecount=334 weakrefs=0 soft=0 phantom=0 finalizers=0\n3STHSTTYPE     14:29:29:267969000 GMT j9mm.135 -   Exclusive access: exclusiveaccessms=0.016 meanexclusiveaccessms=0.016 threads=0 lastthreadtid=0xB6B61100 beatenbyotherthread=0\n3STHSTTYPE     14:29:29:267966000 GMT j9mm.469 -   Allocation failure cycle start: newspace=0/3014656 oldspace=80601248/533856256 loa=5338112/5338112 requestedbytes=48\n3STHSTTYPE     14:29:29:267963000 GMT j9mm.133 -   Allocation failure start: newspace=0/3014656 oldspace=80601248/533856256 loa=5338112/5338112 requestedbytes=48\n3STHSTTYPE     14:29:29:249015000 GMT j9mm.134 -   Allocation failure end: newspace=2686928/3014656 oldspace=80601248/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:249003000 GMT j9mm.470 -   Allocation failure cycle end: newspace=2686976/3014656 oldspace=80601248/533856256 loa=5338112/5338112\n3STHSTTYPE     14:29:29:248971000 GMT j9mm.560 -   LocalGC end: rememberedsetoverflow=0 causedrememberedsetoverflow=0 scancacheoverflow=0 failedflipcount=0 failedflipbytes=0 failedtenurecount=0 failedtenurebytes=0 flipcount=0 flipbytes=0 newspace=2686976/3014656 oldspace=80601248/533856256 loa=5338112/5338112 tenureage=0\n

    Although the Java code that was used in this scenario deliberately triggered an OutOfMemoryError in a pronounced way, similar allocation issues can and do occur when dealing with large data sets such as XML files.

    The next step in diagnosing the problem is to open the system dump that gets generated automatically when an OutOfMemoryError occurs. Open the dump with the Eclipse Memory Analyzer\u2122 tool (MAT) and search for the StringBuffer object, which should provide further clues about what went wrong. A common example is seeing the same String duplicated over and over again, which might indicate that code is stuck in a loop.

    Note: If you want to use MAT to analyze your system dump, you must install the Diagnostic Tool Framework for Java (DTFJ) plug-in in the Eclipse IDE. Select the following menu items:

    Help > Install New Software > Work with \"IBM Diagnostic Tool Framework for Java\" >\n

    If, unlike the previous scenario, you receive an OutOfMemoryError and the MEMINFO section shows that there is very little space left on the Java heap, the current thread information is typically not important. The current thread is simply the thread that happened to be current when the space ran out. In this situation, you might want to increase your Java heap size. For help with this task, see How to do heap sizing.

    "},{"location":"dump_javadump/#native-outofmemoryerror","title":"Native OutOfMemoryError","text":"

    In this scenario, the VM runs out of native memory. Native memory is memory that is used by the VM for storing all virtualized resources and data that it needs for VM operations. Native memory that is available to the VM process is limited by the operating system. The native memory available to the VM might also be subject to additional limits imposed by the operating system, for example Unix ulimits.

    When a NativeOutOfMemoryError occurs, a Java dump is generated by default. The first section of the file (TITLE) tells you that a systhrow event triggered the Java dump as a result of an OOM (java/lang/OutOfMemoryError) for native memory.

    0SECTION       TITLE subcomponent dump routine\nNULL           ===============================\n1TICHARSET     UTF-8\n1TISIGINFO     Dump Event \"systhrow\" (00040000) Detail \"java/lang/OutOfMemoryError\" \"native memory exhausted\" received\n1TIDATETIMEUTC Date: 2021/04/23 at 18:02:44:017 (UTC)\n1TIDATETIME    Date: 2021/04/23 at 14:02:44:017\n1TITIMEZONE    Timezone: UTC-4 (EDT)\n1TINANOTIME    System nanotime: 379202644260787\n1TIFILENAME    Javacore filename:    /home/cheesemp/test/javacore.20210423.140244.19708.0003.txt\n1TIREQFLAGS    Request Flags: 0x81 (exclusive+preempt)\n1TIPREPSTATE   Prep State: 0x104 (exclusive_vm_access+trace_disabled)\n

    Sometimes, the current thread is responsible for causing the NativeOutOfMemoryError. Information about the current thread can be found in the THREADS section, as shown in the following output.

    0SECTION       THREADS subcomponent dump routine\nNULL           =================================\nNULL\n1XMPOOLINFO    JVM Thread pool info:\n2XMPOOLTOTAL       Current total number of pooled threads: 16\n2XMPOOLLIVE        Current total number of live threads: 16\n2XMPOOLDAEMON      Current total number of live daemon threads: 15\nNULL\n1XMCURTHDINFO  Current thread\n3XMTHREADINFO      \"main\" J9VMThread:0xB6C60C00, omrthread_t:0xB6C049D8, java/lang/Thread:0xB55E3C10, state:R, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x1, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x4CFD, native priority:0x5, native policy:UNKNOWN, vmstate:R, vm thread flags:0x00001020)\n3XMTHREADINFO2            (native stack address range from:0xB6D4E000, to:0xB754F000, size:0x801000)\n3XMCPUTIME               CPU usage total: 3.654896026 secs, current category=\"Application\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at sun/misc/Unsafe.allocateDBBMemory(Native Method)\n4XESTACKTRACE                at java/nio/DirectByteBuffer.<init>(DirectByteBuffer.java:127(Compiled Code))\n4XESTACKTRACE                at java/nio/ByteBuffer.allocateDirect(ByteBuffer.java:311)\n4XESTACKTRACE                at NativeHeapBreaker.main(NativeHeapBreaker.java:9)\n3XMTHREADINFO3           Native callstack:\n4XENATIVESTACK               (0xB6A9F5B3 [libj9prt29.so+0x3b5b3])\n...\n4XENATIVESTACK               (0xB582CC9C [libjclse7b_29.so+0x40c9c])\n4XENATIVESTACK               Java_sun_misc_Unsafe_allocateDBBMemory+0x88 (0xB5827F6B [libjclse7b_29.so+0x3bf6b])\n4XENATIVESTACK               (0x94A2084A [<unknown>+0x0])\n4XENATIVESTACK               (0xB6B2538B [libj9vm29.so+0x6c38b])\n4XENATIVESTACK               (0xB6B4074C [libj9vm29.so+0x8774c])\n4XENATIVESTACK               (0xB6B7F299 [libj9vm29.so+0xc6299])\n4XENATIVESTACK               (0xB6A82F3E [libj9prt29.so+0x1ef3e])\n4XENATIVESTACK               (0xB6B7F32A [libj9vm29.so+0xc632a])\n4XENATIVESTACK               (0xB6B4084C [libj9vm29.so+0x8784c])\n4XENATIVESTACK               (0xB6B3CD0C [libj9vm29.so+0x83d0c])\n4XENATIVESTACK               (0xB776F87D [libjli.so+0x787d])\n4XENATIVESTACK               (0xB7784F72 [libpthread.so.0+0x6f72])\n4XENATIVESTACK               clone+0x5e (0xB76A043E [libc.so.6+0xee43e])\n

    For clarity in the Native callstack output, ... indicates that some lines are removed.

    The Java call stack shows the transition from Java to native code (sun/misc/Unsafe.allocateDBBMemory(Native Method)), indicating a request for Direct Byte Buffer (DBB) storage. DBB storage is backed by native memory, with the Java heap containing only a reference to the native heap buffer. In this scenario, DBB storage is the likely culprit for this NativeOutOfMemoryError.

    The next step is to investigate the NATIVEMEMINFO section of the Java dump file, which reports the amount of memory used by the JRE process, broken down into component areas.

    0SECTION       NATIVEMEMINFO subcomponent dump routine\nNULL           =================================\n0MEMUSER\n1MEMUSER       JRE: 3,166,386,688 bytes / 4388 allocations\n1MEMUSER       |\n2MEMUSER       +--VM: 563,176,824 bytes / 1518 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Classes: 3,104,416 bytes / 120 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Memory Manager (GC): 548,181,888 bytes / 398 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Java Heap: 536,932,352 bytes / 1 allocation\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 11,249,536 bytes / 397 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Threads: 10,817,120 bytes / 147 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Java Stack: 115,584 bytes / 16 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Native Stack: 10,616,832 bytes / 17 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 84,704 bytes / 114 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Trace: 163,688 bytes / 268 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JVMTI: 17,320 bytes / 13 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JNI: 23,296 bytes / 55 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Port Library: 8,576 bytes / 74 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Other: 860,520 bytes / 443 allocations\n1MEMUSER       |\n2MEMUSER       +--JIT: 3,744,728 bytes / 122 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--JIT Code Cache: 2,097,152 bytes / 1 allocation\n2MEMUSER       |  |\n3MEMUSER       |  +--JIT Data Cache: 524,336 bytes / 1 allocation\n2MEMUSER       |  |\n3MEMUSER       |  +--Other: 1,123,240 bytes / 120 allocations\n1MEMUSER       |\n2MEMUSER       +--Class Libraries: 2,599,463,024 bytes / 2732 allocations\n2MEMUSER       |  |\n3MEMUSER       |  +--Harmony Class Libraries: 1,024 bytes / 1 allocation\n2MEMUSER       |  |\n3MEMUSER       |  +--VM Class Libraries: 2,599,462,000 bytes / 2731 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--sun.misc.Unsafe: 2,598,510,480 bytes / 2484 allocations\n4MEMUSER       |  |  |  |\n5MEMUSER       |  |  |  +--Direct Byte Buffers: 2,598,510,480 bytes / 2484 allocations\n3MEMUSER       |  |  |\n4MEMUSER       |  |  +--Other: 951,520 bytes / 247 allocations\n1MEMUSER       |\n2MEMUSER       +--Unknown: 2,112 bytes / 16 allocations\nNULL\n

    In the VM Class Libraries section, the amount of memory allocated for Direct Byte Buffers is shown. Because the NativeOutOfMemoryError was received on a small 32-bit system, a value of 2,598,510,480 bytes indicates that the operating system has run out of memory. On a larger UNIX\u00ae system, the process might have run out of memory because of the ulimit setting. Increasing the value for ulimit might avoid the error, which you can do temporarily by setting ulimit -f unlimited in your current session.

    The theoretical maximum size for a 32-bit process is the size of the 32-bit address space, which is 4 GB. On most operating systems, a portion of the address space for each process is used by the kernel, such that the real limit for 32-bit processes is actually significantly less than 4 GB. As a result, running out of native memory with a 32-bit VM is quite common.

    The same 4 GB limit is also important if you are using a 64-bit VM with compressed references. In compressed references mode, all references to objects, classes, threads, and monitors are represented by 32-bit values for performance reasons, so these structures can be allocated only at 32-bit addresses. However, the operating system might place other allocations within this 4 GB of address space, and if this area becomes sufficiently full or fragmented, the VM throws a native NativeOutOfMemoryError error. These errors typically occur when the VM tries to create a new thread or load a class. The Current Thread History section should contain more information about what the thread was doing at the VM level when the NativeOutOfMemoryError error occurred.

    You can usually avoid this type of problem by using the -Xmcrs option to reserve a contiguous area of memory within the lowest 4 GB of memory at VM startup.

    Another common cause of a NativeOutOfMemoryError is when an application loads duplicate classes. Classes are allocated outside of the Java heap in native memory. If the value reported for Classes in the NATIVEMEMINFO section is very large, duplicate classes might be the cause of your problem. The Eclipse Memory Analyzer tool (MAT) can tell you if you have duplicate classes by using the Class Loader Explorer feature. Because a system dump is automatically generated as well as a Java dump in response to a NativeOutOfMemoryError, simply open the system dump in MAT to continue your diagnosis.

    "},{"location":"dump_javadump/#deadlock","title":"Deadlock","text":"

    Deadlocks occur when two threads attempt to synchronize on an object and lock an instance of a class. When this happens, your application stops responding and hangs. Generating a Java dump file will quickly tell you whether you have a deadlock situation. Trigger the Java dump by sending a SIGQUIT signal (kill -3) to the VM.

    The VM can detect the most common types of deadlock scenario involving Java monitors. If this type of deadlock is detected, information is provided in the LOCKS section. More complex deadlocks, including those that involve a mixture of native mutexes and Java monitors, are not detected.

    Here is the output from the code that was used to cause a common deadlock scenario:

    NULL\n1LKDEADLOCK    Deadlock detected !!!\nNULL           ---------------------\nNULL\n2LKDEADLOCKTHR  Thread \"Worker Thread 2\" (0x94501D00)\n3LKDEADLOCKWTR    is waiting for:\n4LKDEADLOCKMON      sys_mon_t:0x08C2B344 infl_mon_t: 0x08C2B384:\n4LKDEADLOCKOBJ      java/lang/Object@0xB5666698\n3LKDEADLOCKOWN    which is owned by:\n2LKDEADLOCKTHR  Thread \"Worker Thread 3\" (0x94507500)\n3LKDEADLOCKWTR    which is waiting for:\n4LKDEADLOCKMON      sys_mon_t:0x08C2B3A0 infl_mon_t: 0x08C2B3E0:\n4LKDEADLOCKOBJ      java/lang/Object@0xB5666678\n3LKDEADLOCKOWN    which is owned by:\n2LKDEADLOCKTHR  Thread \"Worker Thread 1\" (0x92A3EC00)\n3LKDEADLOCKWTR    which is waiting for:\n4LKDEADLOCKMON      sys_mon_t:0x08C2B2E8 infl_mon_t: 0x08C2B328:\n4LKDEADLOCKOBJ      java/lang/Object@0xB5666688\n3LKDEADLOCKOWN    which is owned by:\n2LKDEADLOCKTHR  Thread \"Worker Thread 2\" (0x94501D00)\n

    This output tells you that Worker Thread 2 is waiting for Worker Thread 3, which is waiting for Worker Thread 1. Because Worker Thread 1 is also waiting for Worker Thread 2, there is a deadlock. The next place to look is the output for Java and native stacks, in the THREADS section. By looking at the stack for each of these worker threads, you can trace the problem back to specific lines in your application code.

    In this example, you can see from the following output that for all worker threads, the stack traces (4XESTACKTRACE/5XESTACKTRACE) indicate a problem in line 35 of the application DeadLockTest.java:

    3XMTHREADINFO      \"Worker Thread 1\" J9VMThread:0x92A3EC00, omrthread_t:0x92A3C2B0, java/lang/Thread:0xB5666778, state:B, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x13, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x52CF, native priority:0x5, native policy:UNKNOWN, vmstate:B, vm thread flags:0x00000201)\n3XMTHREADINFO2            (native stack address range from:0x9297E000, to:0x929BF000, size:0x41000)\n3XMCPUTIME               CPU usage total: 0.004365543 secs, current category=\"Application\"\n3XMTHREADBLOCK     Blocked on: java/lang/Object@0xB5666688 Owned by: \"Worker Thread 2\" (J9VMThread:0x94501D00, java/lang/Thread:0xB56668D0)\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at WorkerThread.run(DeadLockTest.java:35)\n5XESTACKTRACE                   (entered lock: java/lang/Object@0xB5666678, entry count: 1)\n...\n3XMTHREADINFO      \"Worker Thread 2\" J9VMThread:0x94501D00, omrthread_t:0x92A3C8F0, java/lang/Thread:0xB56668D0, state:B, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x14, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x52D0, native priority:0x5, native policy:UNKNOWN, vmstate:B, vm thread flags:0x00000201)\n3XMTHREADINFO2            (native stack address range from:0x946BF000, to:0x94700000, size:0x41000)\n3XMCPUTIME               CPU usage total: 0.004555580 secs, current category=\"Application\"\n3XMTHREADBLOCK     Blocked on: java/lang/Object@0xB5666698 Owned by: \"Worker Thread 3\" (J9VMThread:0x94507500, java/lang/Thread:0xB5666A18)\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at WorkerThread.run(DeadLockTest.java:35)\n5XESTACKTRACE                   (entered lock: java/lang/Object@0xB5666688, entry count: 1)\n...\n3XMTHREADINFO      \"Worker Thread 3\" J9VMThread:0x94507500, omrthread_t:0x92A3CC10, java/lang/Thread:0xB5666A18, state:B, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x15, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x52D1, native priority:0x5, native policy:UNKNOWN, vmstate:B, vm thread flags:0x00000201)\n3XMTHREADINFO2            (native stack address range from:0x9467E000, to:0x946BF000, size:0x41000)\n3XMCPUTIME               CPU usage total: 0.003657010 secs, current category=\"Application\"\n3XMTHREADBLOCK     Blocked on: java/lang/Object@0xB5666678 Owned by: \"Worker Thread 1\" (J9VMThread:0x92A3EC00, java/lang/Thread:0xB5666778)\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at WorkerThread.run(DeadLockTest.java:35)\n5XESTACKTRACE                   (entered lock: java/lang/Object@0xB5666698, entry count: 1)\n
    "},{"location":"dump_javadump/#hang","title":"Hang","text":"

    An application can hang for a number of reasons but the most common cause is excessive global garbage collection (GC) activity, where your application is repeatedly paused because your Java heap has almost run out of memory. You can identify this problem by looking at verbose GC output. Collect this output by specifying the -verbose:gc option.

    Deadlock situations can also manifest themselves as hangs. For more information on diagnosing this type of problem from a Java dump, see the deadlock scenario.

    If you have eliminated verbose GC activity and deadlocks, another common hang scenario involves threads that compete and wait for Java object locks. This type of problem can usually be diagnosed by examining a Java dump. The simplest hang scenario involving Java object locks is where a thread acquires a lock that other threads are waiting for, but it doesn't release the lock for some reason.

    The first place to look in the Java dump output is the LOCKS section. This section lists all the monitors and shows which threads have acquired a lock and which threads are waiting. If the hang is caused by a thread not releasing a lock that other threads need, you can see a list of waiting threads in the output.

    In this example scenario, the Java dump LOCKS section shows that Worker Thread 0 (3LKMONOBJECT) has acquired a lock and there are 19 other worker threads waiting to obtain the lock.

    NULL           ------------------------------------------------------------------------\n0SECTION       LOCKS subcomponent dump routine\nNULL           ===============================\nNULL\n1LKPOOLINFO    Monitor pool info:\n2LKPOOLTOTAL     Current total number of monitors: 1\nNULL\n1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors):\n2LKMONINUSE      sys_mon_t:0x92711200 infl_mon_t: 0x92711240:\n3LKMONOBJECT       java/lang/Object@0xB56658D8: Flat locked by \"Worker Thread 0\" (J9VMThread:0x92A3EC00), entry count 1\n3LKWAITERQ            Waiting to enter:\n3LKWAITER                \"Worker Thread 1\" (J9VMThread:0x92703F00)\n3LKWAITER                \"Worker Thread 2\" (J9VMThread:0x92709C00)\n3LKWAITER                \"Worker Thread 3\" (J9VMThread:0x92710A00)\n3LKWAITER                \"Worker Thread 4\" (J9VMThread:0x92717F00)\n3LKWAITER                \"Worker Thread 5\" (J9VMThread:0x9271DC00)\n3LKWAITER                \"Worker Thread 6\" (J9VMThread:0x92723A00)\n3LKWAITER                \"Worker Thread 7\" (J9VMThread:0x92729800)\n3LKWAITER                \"Worker Thread 8\" (J9VMThread:0x92733700)\n3LKWAITER                \"Worker Thread 9\" (J9VMThread:0x92739400)\n3LKWAITER                \"Worker Thread 10\" (J9VMThread:0x92740200)\n3LKWAITER                \"Worker Thread 11\" (J9VMThread:0x92748100)\n3LKWAITER                \"Worker Thread 12\" (J9VMThread:0x9274DF00)\n3LKWAITER                \"Worker Thread 13\" (J9VMThread:0x92754D00)\n3LKWAITER                \"Worker Thread 14\" (J9VMThread:0x9275AA00)\n3LKWAITER                \"Worker Thread 15\" (J9VMThread:0x92760800)\n3LKWAITER                \"Worker Thread 16\" (J9VMThread:0x92766600)\n3LKWAITER                \"Worker Thread 17\" (J9VMThread:0x9276C300)\n3LKWAITER                \"Worker Thread 18\" (J9VMThread:0x92773100)\n3LKWAITER                \"Worker Thread 19\" (J9VMThread:0x92778F00)\nNULL\n

    The next step is to determine why Worker Thread 0 is not releasing the lock. The best place to start is the stack trace for this thread, which you can find by searching on the thread name or J9VMThread ID in the THREADS section.

    The following extract shows the details for \"Worker Thread 0\" (J9VMThread:0x92A3EC00):

    NULL\n3XMTHREADINFO      \"Worker Thread 0\" J9VMThread:0x92A3EC00, omrthread_t:0x92A3C280, java/lang/Thread:0xB56668B8, state:CW, prio=5\n3XMJAVALTHREAD            (java/lang/Thread getId:0x13, isDaemon:false)\n3XMTHREADINFO1            (native thread ID:0x511F, native priority:0x5, native policy:UNKNOWN, vmstate:CW, vm thread flags:0x00000401)\n3XMTHREADINFO2            (native stack address range from:0x9297E000, to:0x929BF000, size:0x41000)\n3XMCPUTIME               CPU usage total: 0.000211878 secs, current category=\"Application\"\n3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)\n3XMTHREADINFO3           Java callstack:\n4XESTACKTRACE                at java/lang/Thread.sleep(Native Method)\n4XESTACKTRACE                at java/lang/Thread.sleep(Thread.java:941)\n4XESTACKTRACE                at WorkerThread.doWork(HangTest.java:37)\n4XESTACKTRACE                at WorkerThread.run(HangTest.java:31)\n5XESTACKTRACE                   (entered lock: java/lang/Object@0xB56658D8, entry count: 1)\n

    In the last line of this output, you can see where the thread acquired the lock. Working up from this line, you can see that WorkerThread.run was called, which in turn called WorkerThread.doWork. The stack shows that the thread then entered a call to java/lang/Thread.sleep in HangTest.java on line 37, which is preventing the thread from completing its work and releasing the lock. In this example, the sleep call was added to induce a hang, but in real-world scenarios the cause could be any blocking operation, such as reading from an input stream or socket. Another possibility is that the thread is waiting for another lock owned by yet another thread.

    It is important to remember that each Java dump represents a single snapshot in time. You should generate at least three Java dumps separated by a short pause, for example 30 seconds, and compare the output. This comparison tells you whether the threads involved are stuck in a fixed state or whether they are moving.

    In this example, the threads do not move and the investigation needs to focus on the logic in WorkerThread.doWork to understand why Worker Thread 0 entered the java/lang/Thread.sleep call.

    Another common scenario is where each Java dump shows a number of threads waiting for a lock owned by another thread, but the list of waiting threads and the lock-owning thread change over time. In this case, the cause is likely to be a bottleneck caused by thread contention, where the threads are continually competing for the same lock. In severe cases, the lock is held only for a small amount of time but there are lots of threads trying to obtain it. Because more time is spent handling the lock and scheduling the thread than executing application code, the degradation in performance is manifested as a hang. Thread contention is usually caused by an application design problem. You can use a similar approach to the one used in this scenario to determine which lines of code are responsible for the contention.

    "},{"location":"dump_systemdump/","title":"System dump","text":""},{"location":"dump_systemdump/#system-dump","title":"System dump","text":"

    System dumps, often known as core dumps, are platform-specific and contain a raw binary dump of the process memory. This type of dump has a complete copy of the Java heap, including the contents of all Java objects in the application.

    "},{"location":"dump_systemdump/#obtaining-system-dumps","title":"Obtaining system dumps","text":"

    System dumps are produced in response to specific events. To discover which events generate a dump, run the -Xdump:what command. The following output captures the information shown for a system dump:

    -Xdump:system:\n    events=gpf+abort+traceassert+corruptcache,\n    label=/home/user/core.%Y%m%d.%H%M%S.%pid.%seq.dmp,\n    range=1..0,\n    priority=999,\n    request=serial\n

    This output shows that events such as a general protection fault (gpf) or native abort() call can trigger a system dump. For more information about controlling the behavior of dump agents, see Dump agents.

    "},{"location":"dump_systemdump/#enabling-a-full-system-dump-aix-linux-and-macos","title":"Enabling a full system dump (AIX, Linux, and macOS)","text":"

    If you require a system dump that contains details of all the native threads that are running, you must change the resource limits for your operating system. Otherwise, the native thread details that are stored in the dump are only for the native thread that was running when the VM ended.

    1. Set the system resource limits by running the following commands: ulimit -c unlimited; ulimit -n unlimited; ulimit -d unlimited; ulimit -f unlimited;

      Where:

    1. For AIX systems, use the system management interface tool (SMIT) to enable a full CORE dump that is not a pre-430 style CORE dump. You can also set this configuration with the following command line option:

    chdev -l sys0 -a fullcore='true' -a pre430core='false'

    "},{"location":"dump_systemdump/#analyzing-a-system-dump","title":"Analyzing a system dump","text":"

    To examine a system dump you can use the Dump viewer (jdmpview), a platform-specific debugging tool, or the Eclipse Memory Analyzer\u2122 tool (MAT).

    If you want to use MAT to analyze your system dump, you must install the Diagnostic Tool Framework for Java (DTFJ) plug-in in the Eclipse IDE. Select the following menu items:

    Help > Install New Software > Work with \"IBM Diagnostic Tool Framework for Java\" > IBM Monitoring and Diagnostic Tools > Diagnostic Tool Framework for Java   \n
    "},{"location":"enhancementstoopenjdksecurity/","title":"Enhancements to OpenJDK security","text":""},{"location":"enhancementstoopenjdksecurity/#enhancements-to-openjdk-security","title":"Enhancements to OpenJDK security","text":"

    Eclipse OpenJ9\u2122 includes the following enhancements to the OpenJDK security components.

    "},{"location":"enhancementstoopenjdksecurity/#support-for-pkcs11-token-labels","title":"Support for PKCS#11 token labels","text":"

    (z/OS\u00ae and Linux on IBM Z\u00ae only)

    On z/OS and Linux on IBM Z, OpenJ9 supports the use of an extra attribute, tokenlabel, in the SunPKCS11 configuration file. Use this attribute to assign a label to a PKCS#11 token.

    The number of slots and their order depend on the number of tokens in the ICSF token database, their values, and the SAF CRYPTOZ class protection profiles that are currently defined. The ICSF PKCS#11 support ensures that a token resides in its current slot only for the duration of a PKCS#11 session (if the token is not deleted). If you restart an application, or tokens are created or removed, the token might move to a different slot. An application that uses the slot or slotListIndex attributes might fail if it doesn\u2019t first check which slot the token is in. You can avoid this issue by using the tokenlabel attribute instead.

    You can specify only one of the attributes - slot, slotListIndex, or tokenlabel. If you do not specify any of these attributes, the default behavior is that the slotListIndex attribute is set to 0.

    Note: To configure an ICSF token, add the ICSF token to openCryptoki by using the pkcsicsf utility. The openCryptoki library loads the tokens that provide hardware or software specific support for cryptographic functions. An openCryptoki token uses an RSA key pair of public and private keys to encrypt and decrypt data. You must have openCryptoki version 3.22 or later to generate RSA private keys with the ICA, CCA and EP11 tokens that openCryptoki supports.

    For more information about the SunPKCS11 configuration file, see PKCS#11 Reference Guide.

    "},{"location":"env_var/","title":"Environment variables","text":""},{"location":"env_var/#environment-variables","title":"Environment variables","text":"

    Although the Eclipse OpenJ9\u2122 virtual machine (VM) recognizes many environment variables, most are superseded by command-line arguments. Use command-line arguments rather than environment variables, which are retained only for compatibility.

    Note: Environment variables are overridden by command-line arguments.

    "},{"location":"env_var/#finding-and-setting-environment-variables","title":"Finding and setting environment variables","text":"

    To show the current environment, run:

    To show a particular environment variable, run:

    Use values exactly as shown in the documentation. The names of environment variables are case-sensitive in AIX, Linux, macOS, and z/OS.

    To set the environment variable LOGIN_NAME to Fred, run:

    These variables are set only for the current shell or command-line session.

    If you are setting multiple values for an environment variable in a list:

    "},{"location":"env_var/#general-options","title":"General options","text":"

    General VM environment variables are shown in the following table:

    Environment\u00a0variable Usage information OPENJ9_JAVA_COMMAND_LINE This variable is set by the VM after it starts. Using this variable, you can find the command-line parameters set when the VM started. See -XX:[+|-]OpenJ9CommandLineEnv for more information. OPENJ9_JAVA_OPTIONS=<option> Set this variable to store default Java options, including -X, -D, or -verbose:gc style options. For example, -Xms256m -Djava.compiler. Any options set are overridden by equivalent options that are specified when Java is started. This variable does not support certain options, see the list in -Xoptionsfile. If you specify the name of a trace output file either directly, or indirectly, by using a properties file, the output file might be accidentally overwritten if you run utilities such as the trace formatter, dump extractor, or dump viewer. To avoid this problem, add %d, %p or %t to the trace file names. See -Xtrace:output. Note: The equivalent to OPENJ9_JAVA_OPTIONS, IBM_JAVA_OPTIONS is deprecated and will be removed in a future release. JAVA_FONTS=<list of directories> Set this environment variable to specify the font directory. Setting this variable is equivalent to setting the property java.awt.fonts on Windows operating systems, and sun.java2d.fontpath on other operating systems. _JAVA_OPTIONS=<option> Set this variable to add Java options to the end of the command line. Supported options and trace file issues are the same as for OPENJ9_JAVA_OPTIONS."},{"location":"env_var/#dump-agent-options","title":"Dump agent options","text":"

    The preferred mechanism for controlling the production of dumps is by using the -Xdump option. However, these legacy environment variables are preserved and can still be used. The following table describes dump agent options:

    Environment Variable Usage Information JAVA_DUMP_OPTS Used to control the conditions under which dumps are produced.

    If you set agents for a condition by using the JAVA_DUMP_OPTS environment variable, default dump agents for that condition are disabled; however, any -Xdump options that are specified on the command line are used.

    The JAVA_DUMP_OPTS environment variable uses the following syntax:

    JAVA_DUMP_OPTS=\"ON<condition>(<agent>[<count>],<agent>[<count>]),\nON<condition>(<agent>[<count>],...),...)\"\n

    Where:

    JAVA_DUMP_OPTS is parsed by taking the leftmost occurrence of each condition, so duplicates are ignored. The following setting produces a system dump for the first error condition only:

    ONERROR(SYSDUMP[1]),ONERROR(JAVADUMP)\n

    Also, the ONANYSIGNAL condition is parsed before all others, so

    ONINTERRUPT(NONE),ONANYSIGNAL(SYSDUMP)\n

    has the same effect as

    ONANYSIGNAL(SYSDUMP),ONINTERRUPT(NONE)\n

    If the JAVA_DUMP_TOOL environment variable is set, that variable is assumed to specify a valid executable name and is parsed for replaceable fields, such as %pid. If %pid is detected in the string, the string is replaced with the VM's own process ID. The tool that is specified by JAVA_DUMP_TOOL is run after any system dump or heap dump is taken, before anything else.

    The dump settings are applied in the following order. Settings later in the list take precedence:

    1. Default VM dump behavior.
    2. -Xdump command-line options that specify -Xdump:<type>:defaults, see OpenJ9 default options.
    3. DISABLE_JAVADUMP, IBM_HEAPDUMP, and IBM_HEAP_DUMP environment variables.
    4. IBM_JAVADUMP_OUTOFMEMORY and IBM_HEAPDUMP_OUTOFMEMORY environment variables.
    5. JAVA_DUMP_OPTS environment variable.
    6. Remaining -Xdump command-line options.

    Setting JAVA_DUMP_OPTS affects only those conditions that you specify. Actions on other conditions are unchanged.

    "},{"location":"env_var/#signal-mapping","title":"Signal mapping","text":"

    When setting the JAVA_DUMP_OPTS environment variable, the mapping of operating system signals to the \"condition\" is shown in the following table:

    Condition z/OS Windows Linux, macOS, and AIX EXCEPTION SIGTRAP, SIGILL, SIGSEGV, SIGFPE, SIGBUS, SIGSYS, SIGXFSV SIGILL, SIGSEGV, SIGFPE SIGTRAP, SIGILL, SIGSEGV, SIGFPE, SIGBUS, SIGXFSV INTERRUPT SIGINT, SIGTERM, SIGHUP SIGINT, SIGTERM SIGINT, SIGTERM, SIGHUP ERROR SIGABRT SIGABRT SIGABRT DUMP SIGQUIT SIGBREAK SIGQUIT"},{"location":"env_var/#java-dump-options","title":"Java dump options","text":"

    The preferred mechanism for controlling the production of Java dumps is by using the -Xdump:java option. However, these legacy environment variables are preserved and can still be used.

    Environment Variable Usage Information DISABLE_JAVADUMP=[TRUE|FALSE] Setting DISABLE_JAVADUMP to TRUE is the equivalent of using -Xdump:java:none and stops the default production of Java dumps. IBM_JAVACOREDIR=<directory> The default location into which the Java dump is written. On z/OS, the _CEE_DMPTARG environment variable is used instead. IBM_JAVADUMP_OUTOFMEMORY=[TRUE|FALSE] By setting this environment variable to FALSE, you disable Java dumps for an out-of-memory exception. When not set, a Java dump is generated when an out-of-memory exception is thrown but not caught and handled by the application. Set to TRUE to generate a dump when an out-of-memory exception is thrown, even if it is handled by the application. Set to FALSE to disable Java dumps for an out-of-memory exception. TMPDIR=<directory> This variable specifies an alternative temporary directory. This directory is used only when Java dumps and Heap dumps cannot be written to their target directories, or the current working directory. The default is /tmp (C:\\temp for Windows).

    Note: You can use the dump agent JAVA_DUMP_OPTS variable to control the conditions under which Java dumps are produced.

    "},{"location":"env_var/#heap-dump-options","title":"Heap dump options","text":"

    The preferred mechanism for controlling the production of Java dumps is by using the -Xdump:heap option. However, these legacy environment variables are preserved and can still be used.

    Environment Variable Usage Information IBM_HEAPDUMP=[TRUE|FALSE] Setting this option to TRUE enables heap dump production by using signals. IBM_HEAP_DUMP=[TRUE|FALSE] Setting this option to TRUE enables heap dump production by using signals. IBM_HEAPDUMPDIR=<directory> The default location into which the heap dump is written. On z/OS, the _CEE_DMPTARG environment variable is used instead. IBM_HEAPDUMP_OUTOFMEMORY=[TRUE|FALSE] Controls the generation of a heap dump when an out-of-memory exception is thrown. When not set, a heap dump is generated when an out-of-memory exception is thrown but not caught and handled by the application. Set to TRUE to generate a dump when an out-of-memory exception is thrown, even if it is handled by the application. Set to FALSE to disable heap dump for an out-of-memory exception. IBM_JAVA_HEAPDUMP_TEST Use this environment variable to cause the VM to generate both PHD and text versions of heap dumps. Equivalent to opts=PHD+CLASSIC on the -Xdump:heap option. IBM_JAVA_HEAPDUMP_TEXT Use this environment variable to cause the VM to generate a text (human readable) Heap dump. Equivalent to opts=CLASSIC on the -Xdump:heap option. TMPDIR=<directory> This variable specifies an alternative temporary directory. This directory is used only when Java dumps and heap dumps cannot be written to their target directories, or the current working directory. The default is /tmp (C:\\temp for Windows).

    Note: You can use the dump agent JAVA_DUMP_OPTS variable to control the conditions under which Heap dumps are produced.

    "},{"location":"env_var/#other-diagnostic-options","title":"Other diagnostic options","text":"

    The following table lists other environment variables that can be set for diagnostic purposes:

    Environment variable Usage Instructions IBM_COREDIR=<directory> Set this variable to specify an alternative location for system dumps, JIT dumps, and snap trace. On z/OS, _CEE_DMPTARG is used instead for snap trace, and transaction dumps are written to TSO according to JAVA_DUMP_TDUMP_PATTERN. On Linux and macOS, the dump is written to the directory that is specified directory by the operating system before being moved to the specified location. IBM_JAVA_ABEND_ON_FAILURE=Y (z/OS only) This setting tells the Java launcher to mark the Task Control Block (TCB) with an abend code if the OpenJ9 VM fails to load or is terminated by an uncaught exception. By default, the Java launcher does not mark the TCB. JAVA_DUMP_TDUMP_PATTERN=<string> (z/OS only) The specified <string> is passed to IEATDUMP to use as the data/set name for the Transaction Dump. The default <string> is %uid.JVM.TDUMP.%job.D%y%m%d.T%H%M%S (31-bit) or %uid.JVM.%job.D%y%m%d.T%H%M%S.X&amp;DS (64-bit), where %uid is found from the C code fragment shown in Notes. JAVA_THREAD_MODEL=<string> <string> can be defined as one of the following values: NATIVE (all threads are created as _MEDIUM_WEIGHT), HEAVY (all threads are created as _HEAVY_WEIGHT), MEDIUM (same as NATIVE), or NULL. The default is NATIVE. IBM_XE_COE_NAME=<value> Set this variable to generate a system dump when the specified exception occurs. The value that is supplied is the package description of the exception; for example, java/lang/InternalError. A Signal 11 is followed by a JVMXE message and then the VM ends. JAVA_PLUGIN_TRACE=TRUE When this variable is set to TRUE or 1, a Java plug-in trace is produced for the session when an application runs. Traces are produced from both the Java and Native layer. By default, this variable is set to FALSE, so that a Java plug-in trace is not produced.

    Notes: C code fragment to discover %uid for JAVA_DUMP_TDUMP_PATTERN=<string>:

    pwd = getpwuid(getuid());\npwd->pw_name;\n
    "},{"location":"env_var/#deprecated-jit-options","title":"Deprecated JIT options","text":"

    The following table describes deprecated environment variables for the JIT compiler:

    Environment Variable Usage Information IBM_MIXED_MODE_THRESHOLD Use -Xjit:count=<value> instead of this variable. JAVA_COMPILER Use -Djava.compiler=<value> instead of this variable."},{"location":"gc/","title":"GC policies","text":""},{"location":"gc/#garbage-collection-policies","title":"Garbage collection policies","text":"

    Eclipse OpenJ9\u2122 provides several garbage collection (GC) policies that are designed around different application workloads and service level agreements. Each GC policy consists of a set of characteristics and features that aim to optimize one or more performance aspects of a running application. These performance aspects include application throughput, memory footprint, average pause times, worst-case pause times, and startup time.

    Different policies require a Java heap that is configured in different ways in order to achieve different goals. The simplest configuration consists of a single area of memory, often referred to as a flat heap. Other configurations divide the heap into different areas or regions, which might contain objects of different ages (generations) or sizes.

    A GC cycle is a repeatable process that involves a set of GC operations. These operations process all or parts of the Java heap to complete a discrete function and are discussed in more detail in GC operations.

    GC policies use different GC cycles to manage different aspects of the heap. For example, the gencon policy runs a partial GC cycle on the nursery area of the heap to complete a scavenge operation. At other times, gencon also runs a global GC cycle on the entire Java heap to complete mark and sweep (and optionally compact) operations.

    GC cycles might be divided into increments that run over a period of time to reduce maximum pause times. These increments might involve stop-the-world (STW) pauses that must halt application threads to give certain GC operations exclusive access to the Java heap. Alternatively, increments might include GC operations that can run concurrently with application processing.

    The following table shows the heap configuration and the GC cycles and operations used by different policies:

    Policy Heap configuration GC cycles / operations gencon Two areas: nursery and tenure Two generation groups: new/older Global GC cycle: concurrent mark-sweep operations, optionally followed by a compact operation Partial GC cycle: STW scavenge operation or concurrent scavenge operation (if optionally enabled) balanced Multiple regions of equal size Multiple generations Global GC mark cycle: incremental concurrent mark operation (global mark phase) Partial GC cycle: STW copy forward operation and optional mark, sweep, or compact operations optavgpause One area: flat One generation Global GC cycle: concurrent mark-sweep operations, optionally followed by a compact operation optthruput One area: flat One generation Global GC cycle: STW mark-sweep operations, optionally followed by a compact operation metronome Multiple regions by size class One generation Global GC cycle: incremental STW mark-sweep operation in small interruptible steps nogc One area: flat No GC cycles

    Note: All OpenJ9 GC policies support compressed references on 64-bit platforms, which compresses heap pointers to 32 bits if the total heap size does not exceed the theoretical upper bound of 64 GB. Applications that require more heap space can select any heap size within the bounds imposed by the operating system and available system RAM, without using compressed references. For more information, see compressed references.

    "},{"location":"gc/#policy-selection-and-tuning","title":"Policy selection and tuning","text":"

    The default policy is the Generational Concurrent (gencon) GC policy, which suits a broad spectrum of applications. Choosing a different GC policy should be guided by the application dynamics and an observation of how the application interacts with the heap during startup and at steady state. To help with this analysis, all OpenJ9 GC policies are instrumented to collect a wide range of GC-related metric data for reporting in a GC log file.

    To enable GC logging for the OpenJ9 Java runtime, include the -verbose:gc option on the command line. By default, this option prints output to stderr but you can send the output to a log file by using -Xverbosegclog. You can then visualize the output by loading the GC log into the Garbage Collector and Memory Visualizer (GCMV) plug-in for the Eclipse IDE. OpenJ9 Java GC logs can also be analyzed by some online services, such as GCEasy.

    The following sections provide more information about each policy and when you might choose it for your application. To select a GC policy other than gencon, specify the -Xgcpolicy option on the command line. To adjust the initial and maximum size of the Java heap, use the -Xms and -Xmx command line options. For generational GC policies, you can also set the -Xmn, -Xmns, and -Xmnx options.

    "},{"location":"gc/#gencon-policy-default","title":"gencon policy (default)","text":"

    The Generational Concurrent GC policy (-Xgcpolicy:gencon) is probably best suited if you have a transactional application, with many short-lived objects. This policy aims to minimize GC pause times without compromising throughput. This is the default policy employed by the VM, so if you want to use it you don't need to specify it on the command line when you start your application.

    If your application requires the allocation of objects of very different sizes and liveness on the Java heap, you might experience heap fragmentation, which in turn might lead to global heap compaction. In these circumstances, the Balanced GC policy might be more appropriate.

    "},{"location":"gc/#gc-processing","title":"GC processing","text":"

    With the gencon policy, the Java heap is divided into two main areas, the nursery area, where new objects are created and the tenure area, where objects are moved if they have reached tenure age.

    The nursery area is subdivided into two further areas, the allocate space and the survivor space. A partial GC cycle that involves a GC scavenge operation is used to reclaim memory from the nursery area. This process is illustrated in the following diagram, which shows a sequence of four main events:

    1. Objects are created in the allocate space.
    2. The allocate space is full.
    3. A local GC scavenge process runs and reachable objects are either evacuated (copied) into the survivor space or into the tenure area if they have reached tenure age. Any objects that can't be reached are left untouched and subsequently cleared.
    4. The allocate and survivor spaces swap roles. The original survivor space becomes the allocate space where new objects are created, and the original allocate space becomes the survivor space ready for the next local GC scavenge process.

    The relative sizes of the allocate and survivor spaces are dynamically adjusted by a technique called tilting. When the nursery area is first created, it is evenly divided between the allocate and survivor spaces. If, after a GC scavenge operation runs, the amount of space required for the survivor area is comparatively small, the boundary between the two spaces is adjusted by tilting. For example, if the survivor space requires only 10% of the nursery area, the tilt ratio is adjusted to give 90% of the nursery area to the allocate space. With more space available for new objects, the frequency of scavenge cycles is reduced.

    The tenure age of an object is determined by the VM and reflects the number of times that an object has been copied between the allocate space and the survivor space. The age is in the range 1 - 14 and is adjusted dynamically by the VM depending on the object survival rate at particular ages. For example, if an object has a tenure age of 5, it has been copied backwards and forwards between allocate and survivor spaces five times. If the VM sets a tenure age of 5 based on the percentage of space remaining in the nursery area, the next scavenge moves the object from the nursery to the tenure area. You can set an initial tenure age with the -Xgc:scvTenureAge option. You can also prevent the VM dynamically adjusting the tenure age by setting the Xgc:scvNoAdaptiveTenure option so that the initial age is maintained throughout the run time of the VM.

    Within the tenure area, new objects are allocated into the small object area (SOA), which is illustrated in the earlier diagram (see item 3). A large object area (LOA) is set aside for objects greater than 64 KB that cannot be allocated into the SOA to minimize fragmentation. The LOA is allocated by default but is reduced and removed after a few GC cycles if it isn't populated. To prevent the creation of an LOA, you can specify the -Xnoloa option on the command line when you start your application. When the tenure area is close to full a global GC cycle is triggered.

    The partial GC cycle (scavenge) reduces pause times by frequently reclaiming memory in the nursery area which, for a transactional application with many short-lived objects, has the most recyclable space. While most of the objects stay in the nursery area after the scavenge operation is complete, a small fraction are moved to the tenure area. Over time the tenure area might become full. So, whilst a partial GC cycle is operating on the nursery area, a concurrent global GC cycle also runs alongside normal program execution to mark and remove unreachable objects from the tenure area. These two GC approaches combine to provide a good trade-off between shorter pause times and consistent throughput.

    "},{"location":"gc/#concurrent-scavenge","title":"Concurrent Scavenge","text":"

    A special mode of the gencon policy is known as Concurrent Scavenge. This mode aims to further reduce the average time spent in STW pauses by collecting garbage from the nursery area in parallel with running application threads. Whilst aiming to reduce the average time, this mode does not improve the worst case pause time when compared to running gencon without Concurrent Scavenge enabled.

    To enable Concurrent Scavenge, see -Xgc:concurrentScavenge.

    This mode can be enabled with hardware-based support and software-based support:

    More information about Concurrent Scavenge mode can be found in the blog post Concurrent Scavenge Garbage Collection Policy.

    "},{"location":"gc/#balanced-policy","title":"balanced policy","text":"

    (64-bit only)

    The Balanced GC policy (-Xgcpolicy:balanced) evens out pause times and reduces the overhead of some of the costlier operations that are typically associated with garbage collection, such as compaction and class unloading. The Java heap is divided into a large number of regions (1,000 - 2,000), which are managed individually by an incremental generational collector to reduce the maximum pause time on large heaps and increase the efficiency of garbage collection. The aim of the policy is to avoid global garbage collections by matching object allocation and survival rates.

    "},{"location":"gc/#when-to-use","title":"When to use","text":"

    The Balanced policy might be a good alternative for applications that experience unacceptable pause times with gencon.

    However, even though pause times are typically evened out across GC operations, actual pause times are affected by object allocation rates, object survival rates, and fragmentation levels within the heap, and cannot therefore be bound to a certain maximum nor can a certain utilization level be guaranteed.

    "},{"location":"gc/#gc-processing_1","title":"GC processing","text":"

    During VM startup, the GC divides the heap memory into regions of equal size. These regions remain static for the lifetime of the VM and are the basic unit of garbage collection and allocation operations. For example, when the heap is expanded or contracted, the memory committed or released corresponds to a certain number of regions. Although the Java heap is a contiguous range of memory addresses, any region within that range can be committed or released from a pool as required. This enables the Balanced GC to contract the heap more dynamically and aggressively than other garbage collectors, which typically require the committed portion of the heap to be contiguous.

    Regions impose a maximum object size. Objects are always allocated within the bounds of a single region and are never permitted to span regions. The region size is always a power of two; for example, 512 KB, 1 MB, and so on (where KB is 210 bytes and MB is 220 bytes). The region size is selected at startup based on the maximum heap size. The collector chooses the smallest power of two which will result in less than 2048 regions, with a minimum region size of 512 KB. Except for small heaps (less than about 512 MB) the VM aims to have between 1024 and 2047 regions.

    Object ages are tracked for each region with a maximum of 24 possible generations. The following diagram illustrates the structure of the object heap:

    The eden space is a set of regions of age 0, which contain the newest objects allocated. The size of the eden space is determined by the number of regions that it contains. When the region count for the eden space reaches a predetermined threshold (taxation threshold), a partial GC cycle runs to reduce the number of used regions, typically by using a copy forward operation. Empty regions can then be assigned to the eden space from the pool. In specific cases, mark and compact operations might be used, for example, when there are not enough free survivor regions available. The partial GC cycle is a STW operation that always includes the eden space, but might include older regions. Objects from collectible regions of age N are moved into another region of the same age N or to an empty region that is assigned an age of N. Then, the ages of all regions across the heap are incremented by 1, except for the maximum age 24 regions. Regions of age 24 are included in partial GC collection sets in order to defragment them.

    Partial GC cycles work to reclaim free regions in the heap for allocating new objects. Because some objects from eden regions always survive, a partial GC cycle can reclaim only about 90% of this memory. To keep up with object allocation, partial GC cycles also reclaim free regions by defragmenting older regions. For example, a partial GC cycle that moves objects from 5 fragmented older regions into 2 empty regions, reclaims 3 regions for new object allocation. However, over time the overall amount of fragmented memory decreases and records about object liveness in older regions become less accurate. Eventually, the work done by partial GC cycles to reclaim memory cannot keep pace with memory consumption. Free regions become so scarce that a global mark operation (GMP), which is triggered by another taxation threshold, is required to build a new record of object liveness across the heap. A sweep operation uses this record to measure the amount of free memory in fragmented older regions, which later partial GC cycles can act upon to move objects and reclaim free regions.

    A global sweep operation also runs to reclaim memory so that it can create empty regions. The global sweep operation, while logically associated with the global mark operation, runs in the same STW increment as the first partial GC cycle after the mark operation completes. Because the GC cycle responsible for the global mark operation runs concurrently, it might overlap and interleave with a few partial GC cycles.

    With the balanced policy, a global GC cycle is sometimes required in addition to the global mark operations and partial GC cycle. This global GC cycle is rare, occurring only in very tight memory conditions when other GC cycles cannot free enough memory on the heap.

    Most objects are easily contained within the minimum region size of 512 KB. However, to support large arrays, which cannot be contained in a region, the balanced GC policy uses an arraylet representation in the heap. For more information about structure and layout, see Arraylets.

    Note: With arraylets, JNI access to array data might involve reconstituting arraylets as contiguous arrays, which can significantly slow down processing.

    To learn about the default heap size and the tuning options that can be used with the balanced policy, see -Xgcpolicy:balanced.

    "},{"location":"gc/#optavgpause-policy","title":"optavgpause policy","text":"

    The optimize for pause time policy (-Xgcpolicy:optavgpause) uses a global GC to manage a flat heap comprised of a single area and to compact the heap if the heap becomes fragmented. The global GC cycle starts preemptively so that the cycle finishes before the heap is exhausted. By anticipating global collections and initiating some mark operations ahead of collection, the optavgpause policy reduces GC pause times when compared to optthruput. However, the reduction in pause time comes at the expense of some performance throughput.

    "},{"location":"gc/#when-to-use_1","title":"When to use","text":"

    Consider using this policy if you have a large heap size (available on 64-bit platforms), because this policy limits the effect of increasing heap size on the length of the GC pause.

    Although optavgpause uses a write barrier to support concurrent mark operations, it does not use a generational write barrier. For some application workloads, such as those that frequently change large and old reference arrays, this strategy might be of greater benefit. However, in many situations, the default gencon policy offers better performance.

    By using a flat heap, optavgpause avoids potential issues with very large objects. With gencon, the heap is divided into areas (nursery and tenure) in order to manage generations of objects. Although there might be sufficient free space on the overall Java heap for a very large object, it might not fit into the nursery area. If the allocator does succeed in allocating a very large object, further GC cycles might be required to create enough contiguous free space.

    Overall, optavgpause, along with optthruput, is best suited to short-lived applications and to long-running services that involve concurrent sessions with short lifespans. Short-lived applications with adequate heap sizes usually complete without compaction. The flat heap fragments more slowly when session-bound objects are allocated and drop out of the live set in short overlapping clusters.

    "},{"location":"gc/#gc-processing_2","title":"GC processing","text":"

    The optavgpause policy requires a flat Java heap. A global GC cycle runs concurrent mark-sweep operations, optionally followed by compact operations. By running most operations concurrently with application threads, this strategy aims to reduce GC pause times as much as possible.

    "},{"location":"gc/#optthruput-policy","title":"optthruput policy","text":"

    The optimize for throughput policy (-Xgcpolicy:optthruput) uses a global GC cycle to manage a flat heap that is comprised of a single area and to compact the heap if the heap becomes fragmented. The global collector runs mark and sweep operations that are triggered by an allocation failure when the heap is exhausted. As a result, applications stop for long pauses while garbage collection takes place.

    "},{"location":"gc/#when-to-use_2","title":"When to use","text":"

    You might consider using this policy when a large heap application can tolerate longer GC pauses to obtain better overall throughput. Unlike gencon, the optthruput policy does not use object access barriers. In some workloads, the cost of these barriers might be high enough to make optthruput preferable. However, in many situations, the default gencon policy offers better performance.

    By using a flat heap, optthruput avoids potential issues with very large objects. With gencon, the heap is divided into areas (nursery and tenure) in order to manage generations of objects. Although there might be sufficient free space on the overall Java heap for a very large object, it might not fit into the nursery area. If the allocator does succeed in allocating a very large object, further GC cycles might be required to create enough contiguous free space.

    Overall, optthruput, along with optavgpause, is best suited to short-lived applications and to long-running services that involve concurrent sessions with short lifespans. Short-lived applications with adequate heap sizes usually complete without compaction. The flat heap fragments more slowly when session-bound objects are allocated and drop out of the live set in short overlapping clusters.

    "},{"location":"gc/#gc-processing_3","title":"GC processing","text":"

    The optthruput policy requires a flat Java heap. A global GC cycle runs mark-sweep operations, optionally followed by compact operations. The cycle requires exclusive access to the heap, causing application threads to halt while operations take place. As such, long pauses can occur.

    "},{"location":"gc/#metronome-policy","title":"metronome policy","text":"

    (Linux on x86-64 and AIX platforms only)

    The metronome policy (-Xgcpolicy:metronome) is an incremental, deterministic garbage collector with short pause times. Applications that are dependent on precise response times can take advantage of this technology by avoiding potentially long delays from GC activity.

    "},{"location":"gc/#when-to-use_3","title":"When to use","text":"

    metronome is designed for applications that require a precise upper bound on collection pause times as well as specified application utilization: the proportion of time that the application is permitted to use, with the remainder being devoted to GC. The metronome GC runs in short interruptible bursts to avoid long STW pauses.

    "},{"location":"gc/#gc-processing_4","title":"GC processing","text":"

    The Java heap is allocated as a contiguous range of memory, partitioned into small regions of equal size (~64 KB). The metronome policy does not dynamically resize the heap; the heap is always fully expanded, even if -Xms is not set to -Xmx.

    Each region of the heap is either empty, or contains only objects in one of 16 size classes. The heap also supports Arraylets for dealing with large arrays. This organization improves the use of available heap space, reducing the need for heap compaction and defragmentation, and providing more precise control over the incremental sweep operation.

    Note: With arraylets, JNI access to array data might involve reconstituting arraylets as contiguous arrays, which can significantly slow down processing.

    Although high application utilization is desirable for optimal throughput, the GC must be able to keep up with the application's memory allocation rate.

    A higher utilization typically requires a larger heap because the GC isn't allowed to run as much as a lower utilization would permit. The relationship between utilization and heap size is highly application dependent, and striking an appropriate balance requires iterative experimentation with the application and VM parameters. You might need to adjust heap size or pause time or target utilization to achieve an acceptable runtime configuration.

    To learn about default options and tuning options that can be used with the metronome policy, see -Xgcpolicy:metronome.

    "},{"location":"gc/#nogc-policy","title":"nogc policy","text":"

    -Xgcpolicy:nogc handles only memory allocation and heap expansion, but doesn't reclaim any memory. The GC impact on runtime performance is therefore minimized, but if the available Java heap becomes exhausted, an OutOfMemoryError exception is triggered and the VM stops.

    "},{"location":"gc/#when-to-use_4","title":"When to use","text":"

    This policy is not suited to the majority of Java applications. However, the following use cases apply:

    Note: You should be especially careful when using any of the following techniques with nogc because memory is never released under this policy:

    "},{"location":"gc/#troubleshooting","title":"Troubleshooting","text":"

    You can diagnose problems with garbage collection operations by turning on verbose GC logging. By default, the information is printed to STDERR but can be redirected to a file by specifying the -Xverbosegclog option. The log files contain detailed information about all operations, including initialization, STW processing, finalization, reference processing, and allocation failures. For more information, see Verbose GC logs.

    If verbose logs do not provide enough information to help you diagnose GC problems, you can use GC trace to analyze operations at a more granular level. For more information, see -Xtgc.

    "},{"location":"gc_overview/","title":"Garbage Collection (GC)","text":""},{"location":"gc_overview/#garbage-collection","title":"Garbage collection","text":"

    To prevent applications running out of memory, objects in the Java heap that are no longer required must be reclaimed. This process is known as garbage collection (GC). When garbage is collected, the garbage collector must obtain exclusive access to the heap, which causes an application to pause while the cleanup is done. This pause is often referred to as a stop-the-world (STW) pause because an application must halt until the process completes. In general, the first step in the GC process is to mark the objects that are reachable, which means they are still in use. The next step is to sweep away the unmarked objects to reclaim memory. The final step is to compact the heap if the heap is badly fragmented.

    A GC cycle is a repeatable process that involves a set of GC operations. These operations process all or parts of the Java heap. When operating on the whole of the Java heap, the cycle is referred to as a global GC cycle; When operating on part of the heap, the cycle is referred to as a partial GC cycle.

    A global GC cycle can be triggered explicitly or implicitly according to the following rules:

    The System.gc() call triggers the GC cycle twice internally to clear unreachable objects that were not identified during the first GC cycle. This call also triggers finalization to release resources that were used by the unreachable objects so that the resources can be reused.

    Partial GC cycles are triggered only implicitly under the control of a particular GC policy. For more information about the GC policies available with Eclipse OpenJ9\u2122, see Garbage collection policies.

    The GC process is designed to operate without intervention from an application. Developers should not attempt to predict GC behavior, for example, by making calls to System.gc() to trigger a cycle or by using finalizers to clean up objects in memory. Such actions might degrade the performance of an application.

    "},{"location":"gc_overview/#gc-operations","title":"GC operations","text":"

    GC operations run discrete functions on the Java heap. For example, a mark operation traces all objects in the heap to determine which ones are reachable. A sweep operation runs to clear away unreachable objects. Together, a mark and sweep operation are capable of reclaiming used memory as part of a GC cycle. Not all GC cycles include operations to reclaim memory. For example, the balanced GC policy involves a global cycle that includes only a mark operation; reclaiming the memory with a sweep operation occurs as part of a separate partial GC cycle that evacuates younger regions and defragments older regions.

    A GC operation might complete in one step, or it might involve multiple steps. For example, a mark operation consists of three steps, as described in the following section.

    "},{"location":"gc_overview/#gc-mark-operation","title":"GC mark operation","text":"

    A mark operation identifies which objects on the Java heap are reachable from outside of the heap and which objects are unreachable. Reachable objects are in use and must be retained, whereas unreachable objects are not in use and can be cleared away as garbage.

    The process of marking involves a bit array called a mark map that is allocated by the VM at startup, based on the maximum heap size setting. Each bit in the mark map corresponds to 8 bytes of heap space. When an object is marked, its location in the heap is recorded by setting the appropriate bit in the mark map.

    A mark operation can be broken down into the following steps:

    1. Initial

      A root object is an object that is accessible from outside of the heap such as a stack, class static field, or JNI reference. For other objects in the heap to be reachable, they must retain a connection from a root object. In the initial step, tracing identifies all root objects by running a root scan. Root objects are pushed onto a work stack for processing in the next step.

    2. Main

      The list of reachable root objects in the work stack is recursively traced for references to other objects in the heap. Objects that are not marked are new objects and these are added to the work stack. If an object is reachable, the appropriate bit is set in the mark map.

    3. Final

      The final step processes weakly reachable roots such as finalizable objects, weak references, monitor sets, and string sets. For more information about the processing of soft, weak, and phantom references, see Weak reference processing.

    In general, helper threads are used in parallel to speed up mark operations on the heap. The helper threads share the work stack with the application thread and are involved in identifying root objects, tracing objects in the heap, and updating the mark map. By default, the number of helper threads is based on the number of CPUs reported by the operating system. You can control the number of helper threads available by specifying the -Xgcthreads command line option when starting your application.

    In a verbose GC log, this operation is shown by the <gc-op type=\"mark\"> XML element. For more information, see Verbose GC logs.

    "},{"location":"gc_overview/#concurrent-mark-processing","title":"Concurrent mark processing","text":"

    A mark operation can run with exclusive access to the heap, which requires application threads to pause while processing takes place. Alternatively, it can run concurrently with application threads to avoid pauses in application processing.

    With concurrent mark, the process of root scanning is handed over to application stack threads, which populate the work stack with root objects in their stack. The root objects in the work stack are then traced by a background thread and by each application thread during a heap lock allocation to find reachable objects and update the mark map. Because the mark operation runs concurrently with application threads, any changes to objects that are already traced must be updated. This process works by using a write barrier that can flag the update and trigger a further scan of part of the heap.

    To track updates to objects, concurrent mark operations use single-byte cards in a card table. Each card corresponds to a 512-byte section of the Java heap. When an object is updated, the start address for the object in the heap is marked on the appropriate card. These cards are used to determine what must be retraced later in the GC cycle.

    A GC cycle that includes concurrent mark operations aims to trace all reachable objects and complete processing at the same time as the heap is exhausted. Continuous adjustments are made to the start time of each cycle to get as close to heap exhaustion as possible. When the heap is exhausted a sweep operation is able to reclaim memory. This operation requires a STW pause. Before sweep operations start, the root objects are rescanned and the cards are checked to determine which areas of memory must be retraced.

    An advantage of concurrent mark operations over STW mark operations is reduced pause times, because the garbage collector is able to identify garbage without halting application threads. Pause times are also more consistent because the collector is able to tune start times to maximize heap usage.

    Disadvantages of concurrent mark operations include the additional CPU for operating the write barrier and additional work for application threads to trace objects when requesting a heap lock.

    Concurrent mark operations are used by the gencon GC policy and the optavgpause GC policy.

    "},{"location":"gc_overview/#incremental-concurrent-mark-processing","title":"Incremental concurrent mark processing","text":"

    Incremental concurrent mark processing evens out pause times by avoiding global STW garbage collections. This type of marking is also known as the global mark phase, whereby mark operations take place incrementally across the entire heap. The global mark operations are interleaved with a partial GC cycle that is responsible for moving objects and clearing unreachable objects in the heap.

    These operations also use mark map in a card table to manage updates to objects that occur whilst mark operations are in progress. However, unlike the concurrent mark operations used by other policies, application threads are not involved in tracing objects; only background threads are used to trace objects and update the mark map.

    Incremental concurrent mark operations are used by the balanced GC policy.

    "},{"location":"gc_overview/#gc-sweep-operation","title":"GC sweep operation","text":"

    The purpose of a sweep operation is to identify memory that can be reclaimed for object allocation and update a central record, known as the freelist.

    sweep operations occur in 2 steps:

    1. Initial

      This step analyzes the mark map for free memory.

    2. Final

      Based on the analysis, the sections of the heap are connected to the freelist.

    As with mark operations, multiple helper threads can be used to sweep the Java heap in parallel to speed up processing times. Because these helper threads are the same ones that are used for parallel mark operations, the number of threads can be controlled by using the -Xgcthreads option.

    Parallel sweep operations run on 256 KB sections of the heap. Each helper thread scans a section at a time. The results are stored and used to generate a freelist of empty regions.

    In a verbose GC log, this operation is shown by the <gc-op type=\"sweep\"> XML element. For more information, see Verbose GC logs.

    "},{"location":"gc_overview/#concurrent-sweep-processing","title":"Concurrent sweep processing","text":"

    Concurrent sweep processing works in tandem with concurrent mark processing and uses the same mark map. Concurrent sweep operations start after a STW collection and complete a section of the heap before concurrent mark operations continue.

    Concurrent sweep is used by the optavgpause GC policy.

    "},{"location":"gc_overview/#gc-scavenge-operation","title":"GC scavenge operation","text":"

    A GC scavenge operation is triggered by an allocation failure in the nursery area of the heap. The operation occurs in the following 3 steps:

    1. Initial

      A root object is an object that is accessible from outside of the heap such as a stack, class static field, or JNI reference. For other objects in the heap to be reachable, they must retain a connection from a root object. In the initial step, tracing identifies all root objects by running a root scan. Root objects are pushed onto a work stack for processing in the next step.

    2. Main

      The list of reachable root objects in the work stack is recursively traced for references to other objects in the heap by using the hierarchical scan ordering mode (-Xgc:hierarchicalScanOrdering). If new objects are found, they are added to the work stack. If an object is reachable, it is copied from the allocate space to the survivor space in the nursery area or to the tenure area if the object has reached a particular age.

    3. Final

      The final step processes weakly reachable roots such as finalizable objects, weak references, monitor sets, and string sets. For more information about the processing of soft, weak, and phantom references, see Weak reference processing.

    In a verbose GC log, this operation is shown by the <gc-op type=\"scavenge\"> XML element. For more information, see Verbose GC logs.

    The scavenge operation is used by the gencon GC policy.

    "},{"location":"gc_overview/#gc-copy-forward-operation","title":"GC copy forward operation","text":"

    A GC copy forward operation is similar to a scavenge operation but is triggered by a taxation threshold being reached. The operation occurs in the following 3 steps:

    1. Initial

      A root object is an object that is accessible from outside of the heap such as a stack, class static field, or JNI reference. For other objects in the heap to be reachable, they must retain a connection from a root object. In the initial step, tracing identifies all root objects by running a root scan. Root objects are pushed onto a work stack for processing in the next step.

    2. Main

      The list of reachable root objects in the work stack is recursively traced for references to other objects in the heap by using dynamic breadth first scan ordering mode (-Xgc:dynamicBreadthFirstScanOrdering). If new objects are found, they are added to the work stack. If an object is reachable, it is moved to another region of the same age or to an empty region of the same age in the heap. The age of all regions in the heap is then incremented by 1, except for the oldest region (age 24).

    3. Final

      The final step processes weakly reachable roots such as finalizable objects, weak references, monitor sets, and string sets. For more information about the processing of soft, weak, and phantom references, see Weak reference processing.

    The operation aims to empty or evacuate fragmented regions that can then be reclaimed for new object allocation.

    In a verbose GC log, this operation is shown by the <gc-op type=\"copy forward\"> XML element. For more information, see Verbose GC logs.

    The copy forward operation is used by the balanced GC policy.

    "},{"location":"gc_overview/#gc-classunloading-operation","title":"GC classunloading operation","text":"

    The classunloading operation is single threaded, not parallel threaded.

    In a verbose GC log, this operation is shown by the <gc-op type=\"classunload\"> XML element. For more information, see Verbose GC logs.

    "},{"location":"gc_overview/#gc-compact-operation","title":"GC compact operation","text":"

    Compaction of the heap is an expensive operation because when objects are moved to defragment the heap, the references to each object change. Therefore, compact operations do not occur by default but only when the following triggers occur:

    The following two options can be used to control compaction:

    In a verbose GC log, this operation is shown by the <gc-op type=\"compact\"> XML element. For more information, see Verbose GC logs.

    "},{"location":"gc_overview/#weak-reference-processing","title":"Weak reference processing","text":"

    Weak reference processing includes soft references, weak references, and phantom references. These references are created by the user for specific use cases and allow some level of interaction with the garbage collector. For example, a soft reference to an object allows that object to persist in memory for a longer period of time before being cleared. For example, a software cache. The garbage collector handles the reference types in the order shown and with the behavior detailed in the following table:

    Reference type Class Garbage collector behavior soft java.lang.ref.SoftReference A soft reference is cleared only when its referent is not marked for a number of GC cycles or if space on the heap is likely to cause an out of memory error. Use the -Xsoftrefthreshold option to control the collection of soft reference objects. weak java.lang.ref.WeakReference A weak reference is cleared as soon as its referent is not marked by a GC cycle. phantom java.lang.ref.PhantomReference A phantom reference is cleared automatically as soon as its referent is not marked by a GC cycle. The cleared reference is then added to the associated reference queue at the same time or later.

    If your application uses the Java Native Interface (JNI) to interact with other application types, you can also create weak JNI object references. These references have a similar life cycle to a weak Java reference. The garbage collector processes weak JNI references after all other Java reference types.

    "},{"location":"interface_dtfj/","title":"DTFJ","text":""},{"location":"interface_dtfj/#diagnostic-tool-framework-for-java","title":"Diagnostic Tool Framework for Java","text":"

    The Diagnostic Tool Framework for Java\u2122 (DTFJ) is a Java application programming interface (API) that is used to support the building of Java diagnostic tools. DTFJ works with data from a system dump or a Java dump.

    On Linux and AIX\u00ae operating systems, you can get more information from a system dump if you also have copies of executable files and libraries. You can run the jpackcore utility to collect these files into a single archive for use in subsequent problem diagnosis. For more information, see Dump extractor.

    The DTFJ API helps diagnostic tools access the following information:

    If your DTFJ application requests information that is not available in the Java dump, the API will return null or throw a DataUnavailable exception. You might need to adapt DTFJ applications written to process system dumps to make them work with Java dumps.

    DTFJ is implemented in pure Java and tools written using DTFJ can be cross-platform. Therefore, you can analyze a dump taken from one workstation on another (remote and more convenient) machine. For example, a dump produced on an AIX\u00ae Power\u00ae system can be analyzed on a Windows laptop.

    See the DTFJ API documentation.

    Note: If the code that loads DTFJ is in a module, the module must require the openj9.dtfj module. For example:

    module MyModule {\n  requires openj9.dtfj;\n}\n
    "},{"location":"interface_dtfj/#using-the-dtfj-interface","title":"Using the DTFJ interface","text":"

    To create applications that use DTFJ, you must use the DTFJ interface. Implementations of this interface have been written that work with system dumps and Java dumps.

    The diagram that follows illustrates the DTFJ interface. The starting point for working with a dump is to obtain an Image instance by using the ImageFactory class supplied with the concrete implementation of the API.

    "},{"location":"interface_dtfj/#working-with-a-system-dump","title":"Working with a system dump","text":"

    The following example shows how to work with a system dump. In this example, the only section of code that ties the dump to a particular implementation of DTFJ is the generation of the factory class. Change the factory if you want to use a different implementation.

    If there is a problem with the file that is passed to the getImage() method, an IOException is thrown and an appropriate message is issued. If a missing file is passed to the example shown, the following output is produced:

    Could not find/use required file(s)\njava.io.FileNotFoundException: core_file.xml (The system cannot find the file specified.)\n        at java.io.FileInputStream.open(Native Method)\n        at java.io.FileInputStream.<init>(FileInputStream.java:135)\n        at com.ibm.dtfj.image.j9.ImageFactory.getImage(ImageFactory.java:47)\n        at com.ibm.dtfj.image.j9.ImageFactory.getImage(ImageFactory.java:35)\n        at DTFJEX1.main(DTFJEX1.java:23)Copy\n

    In this case, the DTFJ implementation is expecting a dump file to exist. Different errors are caught if the file existed but was not recognized as a valid dump file.

    Example of working with a system dump
    import java.io.File;\nimport java.util.Iterator;\nimport java.io.IOException;\n\nimport com.ibm.dtfj.image.CorruptData;\nimport com.ibm.dtfj.image.Image;\nimport com.ibm.dtfj.image.ImageFactory;\n\npublic class DTFJEX1 {\n    public static void main(String[] args) {\n        Image image = null;\n        if (args.length > 0) {\n            File f = new File(args[0]);\n            try {\n                Class<?> factoryClass = Class.forName(\"com.ibm.dtfj.image.j9.ImageFactory\");\n                ImageFactory factory = (ImageFactory) factoryClass.getDeclaredConstructor().newInstance();\n                image = factory.getImage(f);\n            } catch (ClassNotFoundException e) {\n                System.err.println(\"Could not find DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (IllegalAccessException e) {\n                System.err.println(\"IllegalAccessException for DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (ReflectiveOperationException e) {\n                System.err.println(\"Could not instantiate DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (IOException e) {\n                System.err.println(\"Could not find/use required file(s)\");\n                e.printStackTrace(System.err);\n            }\n        } else {\n            System.err.println(\"No filename specified\");\n        }\n        if (image == null) {\n            return;\n        }\n\n        Iterator asIt = image.getAddressSpaces();\n        int count = 0;\n        while (asIt.hasNext()) {\n            Object tempObj = asIt.next();\n            if (tempObj instanceof CorruptData) {\n                System.err.println(\"Address Space object is corrupt: \"\n                        + (CorruptData) tempObj);\n            } else {\n                count++;\n            }\n        }\n        System.out.println(\"The number of address spaces is: \" + count);\n    }\n}\n
    "},{"location":"interface_dtfj/#working-with-a-java-dump","title":"Working with a Java dump","text":"

    To work with a Java dump, change the factory class to com.ibm.dtfj.image.javacore.JCImageFactory and pass the Java dump file to the getImage() method.

    Example of working with a Java dump
    import java.io.File;\nimport java.util.Iterator;\nimport java.io.IOException;\n\nimport com.ibm.dtfj.image.CorruptData;\nimport com.ibm.dtfj.image.Image;\nimport com.ibm.dtfj.image.ImageFactory;\n\npublic class DTFJEX2 {\n    public static void main(String[] args) {\n        Image image=null;\n\n        if (args.length > 0) {\n            File javacoreFile = new File(args[0]);\n\n            try {\n                Class<?> factoryClass = Class.forName(\"com.ibm.dtfj.image.javacore.JCImageFactory\");\n                ImageFactory factory = (ImageFactory) factoryClass.getDeclaredConstructor().newInstance();\n                image = factory.getImage(javacoreFile);\n            } catch (ClassNotFoundException e) {\n                System.err.println(\"Could not find DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (IllegalAccessException e) {\n                System.err.println(\"IllegalAccessException for DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (ReflectiveOperationException e) {\n                System.err.println(\"Could not instantiate DTFJ factory class\");\n                e.printStackTrace(System.err);\n            } catch (IOException e) {\n                System.err.println(\"Could not find/use required file(s)\");\n                e.printStackTrace(System.err);\n            }\n        } else {\n            System.err.println(\"No filename specified\");\n        }\n        if (image == null) {\n            return;\n        }\n\n        Iterator asIt = image.getAddressSpaces();\n        int count = 0;\n        while (asIt.hasNext()) {\n            Object tempObj = asIt.next();\n            if (tempObj instanceof CorruptData) {\n                System.err.println(\"Address Space object is corrupt: \"\n                        + (CorruptData) tempObj);\n            } else {\n                count++;\n            }\n        }\n        System.out.println(\"The number of address spaces is: \" + count);\n    }\n}\n
    "},{"location":"interface_dtfj/#analyze-the-dump","title":"Analyze the dump","text":"

    After you have obtained an Image instance, you can begin analyzing the dump. The Image instance is the second instance in the class hierarchy for DTFJ illustrated by the following diagram:

    Some things to note from the diagram:

    "},{"location":"interface_dtfj/#dtfj-example-application","title":"DTFJ example application","text":"

    This example is a fully working DTFJ application. Many DTFJ applications will follow a similar model.

    Sample DTFJ application
    import java.io.File;\nimport java.util.Iterator;\nimport com.ibm.dtfj.image.CorruptData;\nimport com.ibm.dtfj.image.CorruptDataException;\nimport com.ibm.dtfj.image.DataUnavailable;\nimport com.ibm.dtfj.image.Image;\nimport com.ibm.dtfj.image.ImageAddressSpace;\nimport com.ibm.dtfj.image.ImageFactory;\nimport com.ibm.dtfj.image.ImageProcess;\nimport com.ibm.dtfj.java.JavaRuntime;\nimport com.ibm.dtfj.java.JavaThread;\nimport com.ibm.dtfj.image.ImageThread;\n\npublic class DTFJEX2\n{\n   public static void main( String[] args )\n   {\n      Image image = null;\n      if ( args.length > 0 )\n      {\n         File f = new File( args[0] );\n         try\n         {\n            Class<?> factoryClass = Class\n                  .forName( \"com.ibm.dtfj.image.j9.ImageFactory\" );\n            ImageFactory factory = (ImageFactory) factoryClass.getDeclaredConstructor().newInstance( );\n            image = factory.getImage( f );\n         }\n         catch ( Exception ex )\n         { /*\n             * Should use the error handling as shown in DTFJEX1.\n             */\n            System.err.println( \"Error in DTFJEX2\" );\n            ex.printStackTrace( System.err );\n         }\n      }\n      else\n      {\n         System.err.println( \"No filename specified\" );\n      }\n\n      if ( null == image )\n      {\n         return;\n      }\n\n      MatchingThreads( image );\n   }\n\n   public static void MatchingThreads( Image image )\n   {\n      ImageThread imgThread = null;\n\n      Iterator asIt = image.getAddressSpaces( );\n      while ( asIt.hasNext( ) )\n      {\n         System.out.println( \"Found ImageAddressSpace...\" );\n\n         ImageAddressSpace as = (ImageAddressSpace) asIt.next( );\n\n         Iterator prIt = as.getProcesses( );\n\n         while ( prIt.hasNext( ) )\n         {\n            System.out.println( \"Found ImageProcess...\" );\n\n            ImageProcess process = (ImageProcess) prIt.next( );\n\n            Iterator runTimesIt = process.getRuntimes( );\n            while ( runTimesIt.hasNext( ) )\n            {\n               System.out.println( \"Found Runtime...\" );\n               JavaRuntime javaRT = (JavaRuntime) runTimesIt.next( );\n\n               Iterator javaThreadIt = javaRT.getThreads( );\n\n               while ( javaThreadIt.hasNext( ) )\n               {\n                  Object tempObj = javaThreadIt.next( );\n                  /*\n                   * Should use CorruptData handling for all iterators\n                   */\n                  if ( tempObj instanceof CorruptData )\n                  {\n                     System.out.println( \"We have some corrupt data\" );\n                  }\n                  else\n                  {\n                     JavaThread javaThread = (JavaThread) tempObj;\n                     System.out.println( \"Found JavaThread...\" );\n                     try\n                     {\n                        imgThread = (ImageThread) javaThread.getImageThread( );\n\n                        // Now we have a Java thread we can iterator\n                        // through the image threads\n                        Iterator imgThreadIt = process.getThreads( );\n\n                        while ( imgThreadIt.hasNext( ) )\n                        {\n                           ImageThread imgThread2 = (ImageThread) imgThreadIt\n                                 .next( );\n                           if ( imgThread.equals( imgThread2 ) )\n                           {\n                              System.out.println( \"Found a match:\" );\n                              System.out.println( \"\\tjavaThread \"\n                                    + javaThread.getName( )\n                                    + \" is the same as \" + imgThread2.getID( ) );\n                           }\n                        }\n                     }\n                     catch ( CorruptDataException e )\n                     {\n                        System.err.println( \"ImageThread was corrupt: \"\n                              + e.getMessage( ) );\n                     }\n                     catch ( DataUnavailable e )\n                     {\n                        System.out.println( \"DataUnavailable: \"\n                              + e.getMessage( ) );\n                     }\n                  }\n               }\n            }\n         }\n      }\n   }\n}\n

    For clarity, the example does not perform full error checking when constructing the main Image object and does not perform CorruptData handling in all of the iterators. In a production environment, you use the techniques illustrated in the previous examples under Working with a system dump and Working with a Java dump.

    In the example, the program iterates through every available Java thread and checks whether it is equal to any of the available image threads. When they are found to be equal, the program displays the following message: \"Found a match\".

    The example demonstrates:

    "},{"location":"interface_jvmti/","title":"JVMTI","text":""},{"location":"interface_jvmti/#java-virtual-machine-tool-interface","title":"Java Virtual Machine Tool Interface","text":"

    The Java\u2122 Virtual Machine Tool Interface (JVMTI) is a two-way interface that allows communication between the VM and a native agent. It replaces both the Java Virtual Machine Debug Interface (JVMDI) and Java Virtual Machine Profiler Interface (JVMPI).

    "},{"location":"interface_jvmti/#overview","title":"Overview","text":"

    The JVMTI allows third parties to develop debugging, profiling, and monitoring tools for the VM. The interface contains mechanisms for the agent to notify the VM about the kinds of information it requires, and also provides a means of receiving relevant notifications.

    Several agents can be attached to a VM at any one time.

    JVMTI agents can be loaded at startup using short or long forms of the command-line option:

    -agentlib:<agent-lib-name>=<options>\n

    or

    -agentpath:<path-to-agent>=<options>\n

    In the example that follows (see Sample JVMTI agent), the directory containing the jdwp library is assumed to be on the library path. If you require a specific library, such as jdwp, with your JVMTI agent, you can specify the path at startup, for example:

    -agentlib:jdwp=<options>\n

    For more information about JVMTI, see https://docs.oracle.com/javase/8/docs/technotes/guides/management/index.html.

    For a guide about writing a JVMTI agent, see http://www.oracle.com/technetwork/articles/javase/jvmti-136367.html.

    "},{"location":"interface_jvmti/#eclipse-openj9-extensions","title":"Eclipse OpenJ9 extensions","text":"

    Eclipse OpenJ9\u2122 extensions to the JVMTI allow a JVMTI agent to query or automatically trigger operations in the VM, including the following tasks:

    Task OpenJ9 extensions Get the OS thread ID GetOSThreadID Query, set, and reset the VM dump options QueryVmDump, SetVmDump, ResetVmDump Trigger a VM dump, and monitor JVMTI event functions when VM dumps start and end TriggerVmDump, VMDumpStart, VMDumpEnd Set VM trace options SetVmTrace Subscribe to and unsubscribe from VM tracepoints RegisterTracePointSubscriber, DeregisterTracePointSubscriber Query runtime environment native memory categories GetMemoryCategories Query and set VM log options QueryVmLogOptions, SetVmLogOptions Search for and remove a shared classes cache IterateSharedCaches, DestroySharedCache Subscribe to and unsubscribe from verbose garbage collection (GC) data logging RegisterVerboseGCSubscriber, DeregisterVerboseGCSubscriber

    The definitions that you need when you write a JVMTI agent are provided in the header files jvmti.h and ibmjvmti.h, in the include directory.

    "},{"location":"interface_jvmti/#sample-jvmti-agent","title":"Sample JVMTI agent","text":"

    The following sample shows you how to write a simple JVMTI agent that uses OpenJ9 extensions to the JVMTI.

    Sample JVMTI agent written in C/C++, which uses the OpenJ9 extensions
    /*\n * tiSample.c\n *\n * Sample JVMTI agent to demonstrate the OpenJ9 JVMTI dump extensions\n */\n\n#include \"jvmti.h\"\n#include \"ibmjvmti.h\"\n\n/* Forward declarations for JVMTI callback functions */\nvoid JNICALL VMInitCallback(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread);\nvoid JNICALL DumpStartCallback(jvmtiEnv *jvmti_env, char* label, char* event, char* detail, ...);\n\n\n/*\n * Agent_Onload()\n *\n * JVMTI agent initialisation function, invoked as agent is loaded by the VM\n */\nJNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {\n\n  jvmtiEnv *jvmti = NULL;\n  jvmtiError rc;\n  jint extensionEventCount = 0;\n  jvmtiExtensionEventInfo *extensionEvents = NULL;\n  jint extensionFunctionCount = 0;\n  jvmtiExtensionFunctionInfo *extensionFunctions = NULL;\n  int i = 0, j = 0;\n\n  printf(\"tiSample: Loading JVMTI sample agent\\n\");\n\n    /* Get access to JVMTI */\n    (*jvm)->GetEnv(jvm, (void **)&jvmti, JVMTI_VERSION_1_0);\n\n     /* Look up all the JVMTI extension events and functions */\n   (*jvmti)->GetExtensionEvents(jvmti, &extensionEventCount, &extensionEvents);\n   (*jvmti)->GetExtensionFunctions(jvmti, &extensionFunctionCount, &extensionFunctions);\n\n    printf(\"tiSample: Found %i JVMTI extension events, %i extension functions\\n\", extensionEventCount, extensionFunctionCount);\n\n   /* Find the JVMTI extension event we want */\n   while (i++ < extensionEventCount) {\n\n        if (strcmp(extensionEvents->id, COM_IBM_VM_DUMP_START) == 0) {\n            /* Found the dump start extension event, now set up a callback for it */\n            rc = (*jvmti)->SetExtensionEventCallback(jvmti, extensionEvents->extension_event_index, &DumpStartCallback);\n            printf(\"tiSample: Setting JVMTI event callback %s, rc=%i\\n\", COM_IBM_VM_DUMP_START, rc);\n            break;\n        }\n        extensionEvents++; /* move on to the next extension event */\n    }\n\n    /* Find the JVMTI extension function we want */\n    while (j++ < extensionFunctionCount) {\n        jvmtiExtensionFunction function = extensionFunctions->func;\n\n        if (strcmp(extensionFunctions->id, COM_IBM_SET_VM_DUMP) == 0) {\n            /* Found the set dump extension function, now set a dump option to generate javadumps on\n          thread starts */\n            rc = function(jvmti, \"java:events=thrstart\");\n            printf(\"tiSample: Calling JVMTI extension %s, rc=%i\\n\", COM_IBM_SET_VM_DUMP, rc);\n            break;\n        }\n        extensionFunctions++; /* move on to the next extension function */\n     }\n\n     return JNI_OK;\n}\n\n\n/*\n * DumpStartCallback()\n * JVMTI callback for dump start event (IBM JVMTI extension)  */\nvoid JNICALL\nDumpStartCallback(jvmtiEnv *jvmti_env, char* label, char* event, char* detail, ...) {\n      printf(\"tiSample: Received JVMTI event callback, for event %s\\n\", event);\n}\n

    The sample JVMTI agent consists of two functions, Agent_OnLoad() and DumpStartCallback():

    "},{"location":"interface_jvmti/#agent_onload","title":"Agent_OnLoad()","text":"

    This function is called by the VM when the agent is loaded at VM startup, which allows the JVMTI agent to modify VM behavior before initialization is complete. The sample agent obtains access to the JVMTI interface by using the JNI Invocation API function GetEnv(). The agent calls the APIs GetExtensionEvents() and GetExtensionFunctions() to find the JVMTI extensions that are supported by the VM. These APIs provide access to the list of extensions available in the jvmtiExtensionEventInfo and jvmtiExtensionFunctionInfo structures. The sample uses an extension event and an extension function in the following way:

    Extension event: The sample JVMTI agent searches for the extension event VmDumpStart in the list of jvmtiExtensionEventInfo structures, by using the identifier COM_IBM_VM_DUMP_START provided in ibmjvmti.h. When the event is found, the JVMTI agent calls the JVMTI interface SetExtensionEventCallback() to enable the event, providing a function DumpStartCallback() that is called when the event is triggered.

    Extension function: Next, the sample JVMTI agent searches for the extension function SetVMDump in the list of jvmtiExtensionFunctionInfo structures, by using the identifier COM_IBM_SET_VM_DUMP provided in ibmjvmti.h. The JVMTI agent calls the function by using the jvmtiExtensionFunction pointer to set a VM dump option java:events=thrstart. This option requests the VM to trigger a Java dump every time a VM thread is started.

    "},{"location":"interface_jvmti/#dumpstartcallback","title":"DumpStartCallback()","text":"

    This callback function issues a message when the associated extension event is called. In the sample code, DumpStartCallback() is used when the VmDumpStart event is triggered.

    "},{"location":"interface_jvmti/#using-the-sample-jvmti-agent","title":"Using the sample JVMTI agent","text":""},{"location":"interface_jvmti/#api-reference","title":"API reference","text":"

    The following sections provide reference information for the OpenJ9 extensions to the JVMTI.

    "},{"location":"interface_jvmti/#getosthreadid","title":"GetOSThreadID","text":"

    You can get the OS thread ID by using the GetOSThreadID() API:

    jvmtiError GetOSThreadID(jvmtiEnv* jvmti_env, jthread thread, jlong * threadid_ptr);\n

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success JVMTI_ERROR_NULL_POINTER: The threadid_ptr parameter is null. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_INVALID_THREAD: The thread is not valid. JVMTI_ERROR_THREAD_NOT_ALIVE: The VM state of the thread is not started or has died. JVMTI_ERROR_UNATTACHED_THREAD: The current thread is not attached to the VM. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI start or live phase.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.GetOSThreadID Macro declaration in the ibmjvmti.h file: COM_IBM_GET_OS_THREAD_ID

    "},{"location":"interface_jvmti/#queryvmdump","title":"QueryVmDump","text":"

    You can query the VM dump options that are set for a VM by using the QueryVmDump() API:

    jvmtiError QueryVmDump(jvmtiEnv* jvmti_env, jint buffer_size, void* options_buffer, jint* data_size_ptr)\n

    This extension returns a set of dump option specifications as ASCII strings. The syntax of the option string is the same as the -Xdump command-line option, with the initial -Xdump: omitted. See -Xdump. The option strings are separated by newline characters. If the memory buffer is too small to contain the current VM dump option strings, you can expect the following results:

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success JVMTI_ERROR_NULL_POINTER: The options_buffer or data_size_ptr parameters are null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: The dump configuration is locked because a dump is in progress. JVMTI_ERROR_ILLEGAL_ARGUMENT: The supplied memory buffer in options_buffer is too small.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.QueryVmDump Macro declaration in the ibmjvmti.h file: COM_IBM_QUERY_VM_DUMP

    "},{"location":"interface_jvmti/#setvmdump","title":"SetVmDump","text":"

    You can set VM dump options by using the SetVmDump() API:

    jvmtiError SetVmDump(jvmtiEnv* jvmti_env, char* option)\n

    The dump option is passed in as an ASCII character string. Use the same syntax as the -Xdump command-line option, with the initial -Xdump: omitted. See -Xdump.

    When dumps are in progress, the dump configuration is locked, and calls to SetVmDump() fail with a return value of JVMTI_ERROR_NOT_AVAILABLE.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The parameter option is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: The dump configuration is locked because a dump is in progress. JVMTI_ERROR_ILLEGAL_ARGUMENT: The parameter option contains an invalid -Xdump string.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.SetVmDump Macro declaration in the ibmjvmti.h file: COM_IBM_SET_VM_DUMP

    "},{"location":"interface_jvmti/#triggervmdump","title":"TriggerVmDump","text":"

    You can trigger a VM dump and specify the type of dump you want by using the TriggerVmDump() API:

    jvmtiError TriggerVmDump(jvmtiEnv* jvmti_env, char* option)\n

    Choose the type of dump required by specifying an ASCII string that contains one of the supported dump agent types. See -Xdump. JVMTI events are provided at the start and end of the dump.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The option parameter is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: The dump configuration is locked because a dump is in progress.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.TriggerVmDump Macro declaration in the ibmjvmti.h file: COM_IBM_TRIGGER_VM_DUMP

    "},{"location":"interface_jvmti/#resetvmdump","title":"ResetVmDump","text":"

    You can reset VM dump options to the values at VM initialization by using the ResetVmDump() API:

    jvmtiError ResetVmDump(jvmtiEnv* jvmti_env)\n

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: The dump configuration is locked because a dump is in progress.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.ResetVmDump Macro declaration in the ibmjvmti.h file: COM_IBM_RESET_VM_DUMP

    "},{"location":"interface_jvmti/#vmdumpstart","title":"VMDumpStart","text":"

    The following JVMTI event function is called when a VM dump starts:

    void JNICALL VMDumpStart(jvmtiEnv *jvmti_env, JNIEnv* jni_env, char* label, char* event, char* detail)\n

    The event function provides the dump file name, the name of the JVMTI event, and the detail string from the dump event. The detail string provides additional information about the event that triggered the dump. This information is the same as the information detailed in the JVMDUMP039I message. For example:

    JVMDUMP039I Processing dump event \"systhrow\", detail \"java/lang/OutOfMemoryError\" at 2014/10/17 13:31:03 - please wait.\"\n

    Parameters

    Returns

    None

    "},{"location":"interface_jvmti/#vmdumpend","title":"VMDumpEnd","text":"

    The following JVMTI event function is called when a VM dump ends:

    void JNICALL VMDumpEnd(jvmtiEnv *jvmti_env, JNIEnv* jni_env, char* label, char* event, char* detail)\n

    The event function provides the dump file name, the name of the JVMTI event, and the detail string from the dump event. The detail string provides additional information about the event that triggered the dump. This information is the same as the information detailed in the JVMDUMP039I message. For example:

    JVMDUMP039I Processing dump event \"systhrow\", detail \"java/lang/OutOfMemoryError\" at 2014/10/17 13:31:03 - please wait.\n

    Parameters

    Returns

    None

    "},{"location":"interface_jvmti/#setvmtrace","title":"SetVmTrace","text":"

    You can set VM trace options by using the SetVmTrace() API:

    jvmtiError SetVmTrace(jvmtiEnv* jvmti_env, char* option)\n

    The trace option is passed in as an ASCII character string. Use the same syntax as the -Xtrace command-line option, with the initial -Xtrace: omitted. See -Xtrace.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The option parameter is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_ILLEGAL_ARGUMENT: The option parameter contains an invalid -Xtrace string.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.SetVmTrace Macro declaration in the ibmjvmti.h file: COM_IBM_SET_VM_TRACE

    "},{"location":"interface_jvmti/#registertracepointsubscriber","title":"RegisterTracePointSubscriber","text":"

    You can subscribe to VM tracepoints by using the RegisterTracePointSubscriber() API:

    jvmtiError RegisterTracePointSubscriber(jvmtiEnv* jvmti_env, char *description, jvmtiTraceSubscriber subscriber, jvmtiTraceAlarm alarm, void *userData, void **subscriptionID)\n

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: One of the supplied parameters is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: VM trace is not available. JVMTI_ERROR_INTERNAL: An internal error occurred.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.RegisterTracePointSubscriber Macro declaration in the ibmjvmti.h file: COM_IBM_REGISTER_TRACEPOINT_SUBSCRIBER

    "},{"location":"interface_jvmti/#jvmtitracesubscriber-function","title":"jvmtiTraceSubscriber function","text":"

    The subscriber function type is defined as follows:

    typedef jvmtiError (*jvmtiTraceSubscriber)(jvmtiEnv *jvmti_env, void *record, jlong length, void *user_data);\n

    The subscriber function must be of type jvmtiTraceSubscriber, which is declared in ibmjvmti.h.

    This function is called with each tracepoint record that is selected through the -Xtrace:external option.

    The tracepoint record that is supplied to the subscriber function is valid only for the duration of the function. If the subscriber wants to save the data, the data must be copied elsewhere.

    If the subscriber function returns an error, the alarm function is called, the subscription is disconnected, and no further tracepoints are sent to the subscriber.

    Subscriber function parameters

    "},{"location":"interface_jvmti/#jvmtitracealarm-function","title":"jvmtiTraceAlarm function","text":"

    The alarm function type is defined as follows:

    typedef jvmtiError (*jvmtiTraceAlarm)(jvmtiEnv *jvmti_env, void *subscription_id, void *user_data);\n

    The alarm function must be of type jvmtiTraceAlarm, which is declared in ibmjvmti.h. This function is called if the subscriber function returns an error.

    Alarm function parameters

    "},{"location":"interface_jvmti/#deregistertracepointsubscriber","title":"DeregisterTracePointSubscriber","text":"

    You can unsubscribe from VM tracepoints by using the DeregisterTracePointSubscriber() API:

    jvmtiError DeregisterTracePointSubscriber(jvmtiEnv* jvmti_env, void *userData, void *subscription_id)\n

    After the DeregisterTracePointSubscriber() API is called, no further calls are made to the subscriber function.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The subscription_id parameter is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.DeregisterTracePointSubscriber Macro declaration in the ibmjvmti.h file: COM_IBM_DEREGISTER_TRACEPOINT_SUBSCRIBER

    "},{"location":"interface_jvmti/#getmemorycategories","title":"GetMemoryCategories","text":"

    You can query runtime environment native memory categories by using the GetMemoryCategories() API:

    jvmtiError GetMemoryCategories(jvmtiEnv* env, jint version, jint max_categories, jvmtiMemoryCategory * categories_buffer, jint * written_count_ptr, jint * total_categories_ptr);\n

    You can query the total native memory consumption of the runtime environment for each memory category by using this API. Native memory is memory requested from the operating system using library functions such as malloc() and mmap(). Runtime environment native memory use is grouped under high-level memory categories, as described in the NATIVEMEMINFO section of the Java dump topic. The data returned by the GetMemoryCategories() API is consistent with this format. See Java dump: NATIVEMEMINFO.

    The extension writes native memory information to a memory buffer specified by the user. Each memory category is recorded as a jvmtiMemoryCategory structure, whose format is defined in ibmjvmti.h.

    You can use the GetMemoryCategories() API to work out the buffer size you must allocate to hold all memory categories defined inside the VM. To calculate the size, call the API with a null categories_buffer argument and a non-null total_categories_ptr argument.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_UNSUPPORTED_VERSION: Unrecognized value passed for version. JVMTI_ERROR_ILLEGAL_ARGUMENT: Illegal argument; categories_buffer, count_ptr, and total_categories_ptr all have null values. JVMTI_ERROR_INVALID_ENVIRONMENT: The env parameter is invalid. JVMTI_ERROR_OUT_OF_MEMORY: Memory category data is truncated because max_categories is not large enough.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.GetMemoryCategories Macro declaration in the ibmjvmti.h file: COM_IBM_GET_MEMORY_CATEGORIES

    "},{"location":"interface_jvmti/#queryvmlogoptions","title":"QueryVmLogOptions","text":"

    You can query VM log options by using the QueryVmLogOptions() API:

    jvmtiError QueryVmLogOptions(jvmtiEnv* jvmti_env, jint buffer_size, void* options, jint* data_size_ptr)\n

    This extension returns the current log options as an ASCII string. The syntax of the string is the same as the -Xsyslog command-line option, with the initial -Xsyslog: omitted. For example, the string \"error,warn\" indicates that the VM is set to log error and warning messages only. For more information, see -Xsyslog.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success JVMTI_ERROR_NULL_POINTER: The options or data_size_ptr parameters are null. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_ILLEGAL_ARGUMENT: The supplied memory buffer is too small.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.QueryVmLogOptions Macro declaration in the ibmjvmti.h file: COM_IBM_QUERY_VM_LOG_OPTIONS

    "},{"location":"interface_jvmti/#setvmlogoptions","title":"SetVmLogOptions","text":"

    You can set VM log options by using the SetVmLogOptions() API:

    jvmtiError SetVmLogOptions(jvmtiEnv* jvmti_env, char* options_buffer)\n

    The log option is passed in as an ASCII character string. Use the same syntax as the -Xsyslog command-line option, with the initial -Xsyslog: omitted. For example, to set the VM to log error and warning messages, pass in a string containing \"error,warn\". For more information, see -Xsyslog.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The parameter option is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is invalid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_ILLEGAL_ARGUMENT: The parameter option contains an invalid -Xsyslog string.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.SetVmLogOptions Macro declaration in the ibmjvmti.h file: COM_IBM_SET_VM_LOG_OPTIONS

    "},{"location":"interface_jvmti/#iteratesharedcaches","title":"IterateSharedCaches","text":"

    You can search for shared classes caches that exist in a specified cache directory by using the IterateSharedCaches() API:

    jvmtiError IterateSharedCaches(jvmtiEnv* env, jint version, const char *cacheDir, jint flags, jboolean useCommandLineValues, jvmtiIterateSharedCachesCallback callback, void *user_data);\n

    Information about the caches is returned in a structure that is populated by a user-specified callback function. You can specify the search directory in two ways:

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_UNSUPPORTED_VERSION: The version parameter is not valid. JVMTI_ERROR_NULL_POINTER: The callback parameter is null. JVMTI_ERROR_NOT_AVAILABLE: The shared classes feature is not enabled in the VM. JVMTI_ERROR_ILLEGAL_ARGUMENT: The flags parameter is not valid. JVMTI_ERROR_INTERNAL: This error is returned when the jvmtiIterateSharedCachesCallback returns JNI_ERR.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.IterateSharedCaches Macro declaration in the ibmjvmti.h file: COM_IBM_ITERATE_SHARED_CACHES

    "},{"location":"interface_jvmti/#jvmtiiteratesharedcachescallback-function","title":"jvmtiIterateSharedCachesCallback function","text":"

    Callback function parameters

    Callback function returns

    JNI_OK: Continue iterating. JNI_ERR: Stop iterating, which causes IterateSharedCaches to return JVMTI_ERROR_INTERNAL

    "},{"location":"interface_jvmti/#jvmtisharedcacheinfo-structure","title":"jvmtiSharedCacheInfo structure","text":"

    The structure of jvmtiSharedCacheInfo

    typedef struct jvmtiSharedCacheInfo {\nconst char *name;      // the name of the shared cache\njboolean isCompatible; // if the shared cache is compatible with this VM\njboolean isPersistent; // true if the shared cache is persistent, false if its non-persistent\njint os_shmid;         // the OS shared memory ID associated with a non-persistent cache, -1 otherwise\njint os_semid;         // the OS shared semaphore ID associated with a non-persistent cache, -1 otherwise\njint modLevel;         // one of:\n                       //   COM_IBM_SHARED_CACHE_MODLEVEL_JAVA5\n                       //   COM_IBM_SHARED_CACHE_MODLEVEL_JAVA6\n                       //   COM_IBM_SHARED_CACHE_MODLEVEL_JAVA7\n                       //   COM_IBM_SHARED_CACHE_MODLEVEL_JAVA8\n                       //   COM_IBM_SHARED_CACHE_MODLEVEL_JAVA9\n                       //   from Java 10: the version number of the Java level on which the shared cache is created\njint addrMode;         // the address mode of the VM creating the shared cache: includes additional\n                       // information on whether it is a 64-bit compressedRefs cache when\n                       // COM_IBM_ITERATE_SHARED_CACHES_VERSION_3 or later is specified.\njboolean isCorrupt;    // if the cache is corrupted\njlong cacheSize;       // the total usable shared classes cache size, or -1 when isCompatible is false\njlong freeBytes;       // the number of free bytes in the shared classes cache, or -1 when isCompatible is false\njlong lastDetach;      // the last detach time specified in milliseconds since 00:00:00 on 1 January 1970 UTC,\n                       // or -1 when the last detach time is not available\njint cacheType;        // the type of the cache\njlong softMaxBytes;    // the soft limit for the available space in the cache\njint layer;            // the shared cache layer number\n} jvmtiSharedCacheInfo;\n

    Notes:

    To get the address mode, use:

    COM_IBM_ITERATE_SHARED_CACHES_GET_ADDR_MODE(jvmtiSharedCacheInfo.addrMode)\n

    This macro returns one of the following values: COM_IBM_SHARED_CACHE_ADDRMODE_32 COM_IBM_SHARED_CACHE_ADDRMODE_64

    To get the compressed references mode, use:

    COM_IBM_ITERATE_SHARED_CACHES_GET_CMPRSSREF_MODE(jvmtiSharedCacheInfo.addrMode)\n

    This macro returns one of the following values: COM_IBM_ITERATE_SHARED_CACHES_UNKNOWN_COMPRESSED_POINTERS_MODE COM_IBM_ITERATE_SHARED_CACHES_COMPRESSED_POINTERS_MODE COM_IBM_ITERATE_SHARED_CACHES_NON_COMPRESSED_POINTERS_MODE

    "},{"location":"interface_jvmti/#destroysharedcache","title":"DestroySharedCache","text":"

    You can remove a shared classes cache by using the DestroySharedCache() API:

    jvmtiError DestroySharedCache(jvmtiEnv *env, const char *cacheDir, const char *name, jint persistence, jboolean useCommandLineValues, jint *internalErrorCode);\n

    This extension removes a named shared classes cache of a given persistence type, in a given directory. You can specify the cache name, persistence type, and directory in one of these ways:

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. No cache exists or all existing caches of all generations are removed. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: The shared classes feature is not enabled in the VM. JVMTI_ERROR_ILLEGAL_ARGUMENT: The persistence parameter is not valid. JVMTI_ERROR_INTERNAL: Failed to remove any existing cache with the given name. See the value of the internalErrorCode parameter for more information about the failure.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.DestroySharedCache Macro declaration in the ibmjvmti.h file: COM_IBM_DESTROY_SHARED_CACHE

    "},{"location":"interface_jvmti/#registerverbosegcsubscriber","title":"RegisterVerboseGCSubscriber","text":"

    You can subscribe to verbose garbage collection (GC) data logging by using the RegisterVerboseGCSubscriber() API:

    jvmtiError RegisterVerboseGCSubscriber(jvmtiEnv* jvmti_env, char *description, jvmtiVerboseGCSubscriber subscriber, jvmtiVerboseGCAlarm alarm, void *user_data, void **subscription_id)\n

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: One of the supplied parameters is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase. JVMTI_ERROR_NOT_AVAILABLE: GC verbose logging is not available. JVMTI_ERROR_INTERNAL: An internal error has occurred.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.RegisterVerboseGCSubscriber Macro declaration in the ibmjvmti.h file: COM_IBM_REGISTER_VERBOSEGC_SUBSCRIBER

    "},{"location":"interface_jvmti/#jvmtiverbosegcsubscriber-function","title":"jvmtiVerboseGCSubscriber function","text":"

    The subscriber function type is defined as follows:

    typedef jvmtiError (*jvmtiVerboseGCSubscriber)(jvmtiEnv *jvmti_env, const char *record, jlong length, void *user_data);\n

    The subscriber function must be of type jvmtiVerboseGCSubscriber, which is declared in ibmjvmti.h.

    This function is called with each record of verbose logging data produced by the VM.

    This function runs under the same restrictions as the GarbageCollectionStart and GarbageCollectionFinish events in the standard JVMTI specification. For more information about these events, see the JVMTI Event Index for your OpenJDK version.

    The verbose logging record supplied to the subscriber function is valid only for the duration of the function. If the subscriber wants to save the data, the data must be copied elsewhere.

    If the subscriber function returns an error, the alarm function is called, and the subscription is deregistered.

    Subscriber function parameters

    "},{"location":"interface_jvmti/#jvmtiverbosegcalarm-function","title":"jvmtiVerboseGCAlarm function","text":"

    The alarm function type is defined as follows:

    typedef jvmtiError (*jvmtiVerboseGCAlarm)(jvmtiEnv *jvmti_env, void *subscription_id, void *user_data);\n

    The alarm function must be of type jvmtiVerboseGCAlarm, which is declared in ibmjvmti.h. This function is called if the subscriber function returns an error.

    This function runs under the same restrictions as the GarbageCollectionStart and GarbageCollectionFinish events in the standard JVMTI specification. For more information about these events, see the JVMTI Event Index for your OpenJDK version.

    Alarm function parameters

    "},{"location":"interface_jvmti/#deregisterverbosegcsubscriber","title":"DeregisterVerboseGCSubscriber","text":"

    You can unsubscribe from verbose Garbage Collection (GC) data logging by using the DeregisterVerboseGCSubscriber() API:

    jvmtiError DeregisterVerboseGCSubscriber(jvmtiEnv* jvmti_env, void *userData, void *subscription_id)\n

    After the DeregisterVerboseGCSubscriber() API is called, no further calls are made to the previously registered subscriber function.

    Parameters

    Returns

    JVMTI_ERROR_NONE: Success. JVMTI_ERROR_NULL_POINTER: The subscription_id parameter is null. JVMTI_ERROR_OUT_OF_MEMORY: There is insufficient system memory to process the request. JVMTI_ERROR_INVALID_ENVIRONMENT: The jvmti_env parameter is not valid. JVMTI_ERROR_WRONG_PHASE: The extension has been called outside the JVMTI live phase.

    Identifiers

    JVMTI Extension Function identifier: com.ibm.DeregisterVerboseGCSubscriber Macro declaration in the ibmjvmti.h file: COM_IBM_DEREGISTER_VERBOSEGC_SUBSCRIBER

    "},{"location":"interface_lang_management/","title":"Language Management","text":""},{"location":"interface_lang_management/#language-management-interface","title":"Language management interface","text":"

    Eclipse OpenJ9\u2122 provides MXBean extensions to the standard java.lang.management API, which can be used to monitor and manage the Java\u2122 virtual machine. These extensions provide access to information about the state of the OpenJ9 VM and the environment in which it is running. The following tables list the MXBeans by package and describe the monitoring or management capabilities.

    Package: com.ibm.lang.management

    MXBean Description GarbageCollectorMXBean Discovers Garbage Collection (GC) operations (collection times, compactions, heap memory usage, and freed memory). JvmCpuMonitorMXBean Discovers CPU consumption by category (GC, JIT, or other threads). MemoryMXBean Discovers memory usage (minimum and maximum heap sizes, and shared classes cache sizes). MemoryPoolMXBean Discovers memory pool usage for specific GC policies. OperatingSystemMXBean Discovers information about the operating system (memory, CPU capacity/utilization). RuntimeMXBean Discovers information about the runtime environment (CPU load, Java process ID, and VM state) ThreadMXBean Discovers information about native thread IDs. UnixOperatingSystemMXBean Discovers information for Unix operating systems (memory, file descriptors, processors, processor usage, and hardware)

    Package: com.ibm.virtualization.management

    MXBean Description GuestOSMXBean Discovers CPU and memory statistics of a virtual machine or logical partition as seen by the Hypervisor. HypervisorMXBean Discovers whether the operating system is running on a hypervisor and provides information about the hypervisor.

    Package: openj9.lang.management

    MXBean Description OpenJ9DiagnosticsMXBean Configures and dynamically triggers dump agents.

    For more information about using these MXBeans, read the API documentation. For Java 8, see the OpenJ9 Language Management API documentation.

    "},{"location":"introduction/","title":"Getting started","text":""},{"location":"introduction/#getting-started-with-eclipse-openj9","title":"Getting started with Eclipse OpenJ9","text":"

    Eclipse OpenJ9\u2122 is a high performance, scalable, Java\u2122 virtual machine (VM) implementation that is fully compliant with the Java Virtual Machine Specification.

    At run time, the VM interprets the Java bytecode that is compiled by the Java compiler. The VM acts as a translator between the language and the underlying operating system and hardware. A Java program requires a specific VM to run on a particular platform, such as Linux\u00ae, z/OS\u00ae, or Windows\u2122.

    This material provides information about the VM configuration and tuning options, together with the default settings. Follow the links provided for more detailed information.

    "},{"location":"introduction/#configuring-your-system","title":"Configuring your system","text":"

    Most Java applications should run on an OpenJDK that contains the OpenJ9 VM without changing anything on the underlying system. However, to get the most out of your system you might want to consider some configuration options. Read Configuring your system to learn more about the following options:

    "},{"location":"introduction/#performance-tuning","title":"Performance tuning","text":"

    OpenJ9 is configured to start with a set of default options that provide the optimal runtime environment for Java applications with typical workloads. However, if your application is atypical, you can improve performance by tuning the OpenJ9 VM. You can also improve performance by enabling hardware features or using specific APIs in your application code.

    "},{"location":"introduction/#garbage-collection-policies","title":"Garbage collection policies","text":"

    OpenJ9 includes several garbage collection policies. To learn more about these policies and the types of application workload that can benefit from them, see Garbage collection policies.

    "},{"location":"introduction/#class-data-sharing","title":"Class data sharing","text":"

    You can share class data between running VMs, which can reduce the startup time for a VM after the cache has been created. For more information, see Introduction to class data sharing.

    "},{"location":"introduction/#native-data-operations","title":"Native data operations","text":"

    If your Java application manipulates native data, consider writing your application to take advantage of methods in the Data Access Accelerator (DAA) API.

    The following functions are provided:

    You can gain a number of benefits by using the APIs provided:

    For more information, see the API documentation.

    "},{"location":"introduction/#cloud-optimizations","title":"Cloud optimizations","text":"

    To improve the performance of applications that run in containers, try setting the following tuning options:

    The OpenJ9 VM automatically detects when it is running in a docker container and uses a mechanism to detect when the VM is idle. When an idle state is detected, OpenJ9 runs a garbage collection cycle and releases free memory pages back to the operating system. The object heap is also compacted to make best use of the available memory for further application processing. Compaction is triggered by internal heuristics that look into the number of fragmented pages. Typically there is no need to force a compaction.

    For cloud services that charge based on memory usage, maintaining a small footprint can generate cost savings. For more information about tuning options that control this process, see -XX:IdleTuningMinIdleWaitTime.

    "},{"location":"introduction/#cryptographic-operations","title":"Cryptographic operations","text":"

    OpenJDK uses the in-built Java cryptographic implementation by default. However, native cryptographic implementations typically provide better performance. OpenSSL is a native open source cryptographic toolkit for Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols, which is well established and used with many enterprise applications. For more information, see OpenSSL.

    "},{"location":"introduction/#exploiting-gpus","title":"Exploiting GPUs","text":"

    OpenJ9 provides both the CUDA4J API and the GPU API, which enables you to develop applications that can take advantage of graphics processing unit (GPU) processing for suitable functions, such as sorting arrays. You can also enable the JIT compiler to offload certain processing tasks to a GPU by specifying the -Xjit:enableGPU option on the command line. When enabled, the JIT compiler determines when to offload tasks based on performance heuristics.

    GPU processing is supported only on Linux little-endian systems, such as x86-64 and IBM Power LE, and Windows x86-64 systems. For more information about enabling GPU processing, see Exploiting graphics processing units.

    Special consideration is needed when using the WDDM driver model for GPUs on Windows. Using the WDDM driver model means the GPU is also used as a display device and as such is subject to the Timeout Detection and Recovery (TDR) mechanism of Windows. If you are running demanding GPU workloads, you should increase the timeout from the default 2 seconds. More detail may be found in NVIDIA's Installation Guide for Windows.

    "},{"location":"introduction/#hardware-acceleration","title":"Hardware acceleration","text":"

    On AIX\u00ae systems that contain the Nest accelerator (NX) co-processor, OpenJ9 can take advantage of the zlibNX library. This library is an enhanced version of the zlib compression library that supports hardware-accelerated data compression and decompression. The zlibNX library is supported on AIX version 7.2 TL4 and later and must be installed on the system. The Nest accelerator (NX) co-processor is available on IBM POWER9\u00ae systems. To learn more about zlibNX, see Data compression by using the zlibNX library.

    "},{"location":"introduction/#runtime-options","title":"Runtime options","text":"

    Runtime options are specified on the command line and include system properties, standard options, nonstandard (-X) options, and -XX options. For a detailed list of runtime options, see OpenJ9 command-line options

    "},{"location":"introduction/#default-settings","title":"Default settings","text":"

    If you do not specify any options on the command line at run time, the OpenJ9 VM starts with default settings that define how it operates. For more information about these settings, see Default settings for the OpenJ9 VM.

    "},{"location":"introduction/#using-jlink","title":"Using jlink","text":"

    On Java 11 and later, you can use the jlink utility to create a custom OpenJ9 runtime image, which allows you to optimize image size. If you do not require translations from the English language, the translation files can be removed to further optimize the size. You can achieve this by specifying the --exclude-files=**java_**.properties option when you run jlink. The default English java.properties file is unaffected.

    "},{"location":"introduction/#using-jpackage","title":"Using jpackage","text":"

    (Linux, macOS, and Windows only)

    You can use the jpackage utility to package a Java application into a platform-specific package that includes all of the necessary dependencies. Full details of the tool are available at JEP 392: Packaging Tool. Instructions for using it and the various options available, are documented in the Oracle Tool Specifications: The jpackage Command.

    "},{"location":"introduction/#troubleshooting","title":"Troubleshooting","text":"

    The OpenJ9 diagnostic component contains extensive features to assist with problem determination. Diagnostic data is produced under default conditions, but can also be controlled by starting the VM with the -Xdump option or using the com.ibm.jvm.Dump API. You can also trace Java applications, methods, and VM operations by using the -Xtrace option.

    To get started, read Diagnostic tools and data.

    "},{"location":"jit/","title":"JIT Compiler","text":""},{"location":"jit/#the-jit-compiler","title":"The JIT compiler","text":"

    The Just-In-Time (JIT) compiler is a key component of the Eclipse OpenJ9\u2122 VM that improves the performance of Java applications by compiling platform-neutral Java bytecode into native machine code at run time. Without the JIT, the VM has to interpret the bytecodes itself - a process that requires extra CPU and memory.

    The JIT compiler doesn't compile every method that gets called because thousands of methods can be called at startup. Instead, OpenJ9 records the number of times a method is called. When the count reaches a pre-defined invocation threshold, JIT compilation is triggered. Once a method has been compiled by the JIT, the VM can call the compiled method rather than interpreting it.

    "},{"location":"jit/#optimization-levels","title":"Optimization levels","text":"

    The JIT compiler can compile a method at different optimization levels: cold, warm, hot, very hot (with profiling), or scorching. The hotter the optimization level, the better the expected performance, but the higher the cost in terms of CPU and memory.

    For higher optimization levels, the VM uses a sampling thread to identify methods that continue to take a lot of time. Methods that consume more than 1% are compiled at hot. Methods that consume more than 12.5% are scheduled for a scorching compilation. However, before that happens the methods are compiled at very hot with profiling to collect detailed profile data that is used by the scorching compilation.

    The higher optimization levels use special techniques such as escape analysis and partial redundancy elimination, or loop through certain optimization sequences more times. Although these techniques use more CPU and memory, the improved performance that is delivered by the optimizations can make the tradeoff worthwhile.

    "},{"location":"jit/#troubleshooting","title":"Troubleshooting","text":"

    The JIT compiler is enabled by default to optimize performance. However, if you experience a problem running your application, temporarily turning off the JIT will tell you whether the JIT is at fault.

    Because JIT starts at the same time as the VM, you can only modify JIT behavior at startup.

    There are a number of ways to disable the JIT:

    Note: java.lang.Compiler is deprecated for removal in Java SE 9.

    If turning off the JIT solves your problem, you can investigate JIT operations in more detail by using a number of options to control behavior.

    Turning on verbose logging with the verbose suboption causes the JIT to record all compiler operations. However, the log file can be difficult to read because there are so many complex operations occuring in rapid succession. Follow these steps to simplify operations, which helps you pinpoint the root cause:

    Turn off multiple compilation threads

    The JIT compiler can use more than one compilation thread, which typically improves startup performance. The number of threads is determined by the VM, depending on the system configuration. You can turn off multiple threads by using the -XcompilationThreads option, which simplifies the output in the verbose log.

    Lower the invocation threshold

    When the invocation count is set to 0, the JIT compiles every method and your application will fail immediately when the method causing the problem is reached. You can alter the threshold with the count suboption.

    Turn off inlining

    Inlining is a complex process that generates larger and more complex code. To eliminate errors caused by these operations, use the disableInlining suboption.

    Decrease the optimization levels

    Use the optlevel suboption to gradually decrease the compiler optimization levels to see whether you can isolate the level at which your problem occurs.

    More information about these suboptions and the command line syntax is covered in -Xjit.

    "},{"location":"jit/#understanding-jit-verbose-logs","title":"Understanding JIT verbose logs","text":"

    At first glance, a JIT verbose log can look very complex. To help you understand the log we'll look at JIT compiler operations when you run the java -version command.

    The following option turns on verbose logging and directs output to a log file called vlogfile:

    java -Xjit:verbose,vlog=vlogfile -version\n

    The first section of the log includes lines that start with #INFO:, which provides information about the environment that the JIT is operating in. You can determine the version of the JIT and VM that you are using, and the type and number of processors that the JIT has access to.

    #INFO:  _______________________________________\n#INFO:  Version Information:\n#INFO:       JIT Level  - e24e8aa9\n#INFO:       JVM Level  - 20180315_120\n#INFO:       GC Level   - e24e8aa9\n#INFO:  \n#INFO:  Processor Information:\n#INFO:       Platform Info:X86 Intel P6\n#INFO:       Vendor:GenuineIntel\n#INFO:       numProc=1\n#INFO:  \n#INFO:  _______________________________________\n#INFO:  AOT\n#INFO:  options specified:\n#INFO:       samplingFrequency=2\n#INFO:  \n#INFO:  options in effect:\n#INFO:       verbose=1\n#INFO:       vlog=vlogfile\n#INFO:       compressedRefs shiftAmount=0\n#INFO:       compressedRefs isLowMemHeap=1\n#INFO:  _______________________________________\n#INFO:  JIT\n#INFO:  options specified:\n#INFO:       verbose,vlog=vlogfile\n#INFO:  \n#INFO:  options in effect:\n#INFO:       verbose=1\n#INFO:       vlog=vlogfile\n#INFO:       compressedRefs shiftAmount=0\n#INFO:       compressedRefs isLowMemHeap=1\n#INFO:  StartTime: Apr 23 09:49:10 2018\n#INFO:  Free Physical Memory: 996188 KB\n#INFO:  CPU entitlement = 100.00\n

    This section also shows the AOT and JIT options that are in force. The last few lines detail the start time of the compilation activity, how much free physical memory is available to the process, and the CPU entitlement.

    The information section is followed by a sequence of lines that describe the methods that are being compiled, as well as other events significant to the operation of the JIT compiler.

    Here is a typical line from the verbose log:

    + (cold) sun/reflect/Reflection.getCallerClass()Ljava/lang/Class; @ 00007FCACED1303C-00007FCACED13182 OrdinaryMethod - Q_SZ=0 Q_SZI=0 QW=1 j9m=00000000011E7EA8 bcsz=2 JNI compThread=0 CpuLoad=2%(2%avg) JvmCpu=0%\n

    In this example:

    Each line of output represents a method that is compiled.

    The following example requests information about the performance of JIT compiler threads, with output written to vlogfile.

    java -Xjit:verbose={compilePerformance},vlog=vlogfile -version\n

    The output generated by using this command adds the values time and mem into each line, as shown in the following example:

    + (cold) java/lang/System.getEncoding(I)Ljava/lang/String; @ 00007F29183A921C-00007F29183A936D OrdinaryMethod - Q_SZ=0 Q_SZI=0 QW=1 j9m=0000000000F13A70 bcsz=3 JNI time=311us mem=[region=704 system=16384]KB compThread=0 CpuLoad=2%(2%avg) JvmCpu=0%\n

    The following example can be used to create verbose output that includes lines to show when compilation for a method starts and ends, and any methods that are inlined during the compilation.

    java '-Xjit:verbose={compileStart|compileEnd|inlining},count=5,vlog=vlogfile' -XcompilationThreads1 -version\n

    Note: The suboptions count and -XcompilationThreads1 are included only to simplify the output for this example and are not recommended for production.

    The following section is taken from the output and describes the compilation and inlining of one method java/lang/String.equals:

    (warm) Compiling java/lang/String.equals(Ljava/lang/Object;)Z  OrdinaryMethod j9m=0000000001300B30 t=90 compThread=0 memLimit=262144 KB freePhysicalMemory=969 MB\n#INL: 7 methods inlined into 4dce72bd java/lang/String.equals(Ljava/lang/Object;)Z @ 00007F53190A3E40\n#INL: #0: 4dce72bd #-1 inlined 4dce72bd@22 -> 81670d20 bcsz=37 java/lang/String.lengthInternal()I\n#INL: #1: 4dce72bd #-1 inlined 4dce72bd@28 -> 81670d20 bcsz=37 java/lang/String.lengthInternal()I\n#INL: #2: 4dce72bd #-1 inlined 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n#INL: #3: 4dce72bd #2 inlined bf62dcaf@121 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #4: 4dce72bd #2 inlined bf62dcaf@131 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #5: 4dce72bd #2 inlined bf62dcaf@156 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #6: 4dce72bd #2 inlined bf62dcaf@166 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: 4dce72bd called 4dce72bd@120 -> f734b49c bcsz=233 java/lang/String.deduplicateStrings(Ljava/lang/String;Ljava/lang/String;)V\n#INL: 4dce72bd coldCalled 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n#INL: 4dce72bd coldCalled 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n+ (warm) java/lang/String.equals(Ljava/lang/Object;)Z @ 00007F53190A3E40-00007F53190A40D0 OrdinaryMethod - Q_SZ=277 Q_SZI=277 QW=1667 j9m=0000000001300B30 bcsz=127 GCR compThread=0 CpuLoad=2%(2%avg) JvmCpu=0%\n

    The first line is included as a result of setting the compileStart suboption and shows the start of the warm method compilation:

    (warm) Compiling java/lang/String.equals(Ljava/lang/Object;)Z OrdinaryMethod j9m=0000000001300B30 t=90 compThread=0 memLimit=262144 KB freePhysicalMemory=969 MB\n

    Similarly, the last line shows the successful compilation of this method, as denoted by the +:

    + (warm) java/lang/String.equals(Ljava/lang/Object;)Z @ 00007F53190A3E40-00007F53190A40D0 OrdinaryMethod - Q_SZ=277 Q_SZI=277 QW=1667 j9m=0000000001300B30 bcsz=127 GCR compThread=0 CpuLoad=2%(2%avg) JvmCpu=0%\n

    The lines inbetween that start with #INL describe the inlining operations that took place. A total of 7 methods were inlined into java/lang/String.equals:

    The first three methods (#0, #1, #2) are inlined into the top level method, denoted as #-1:

    #INL: #0: 4dce72bd #-1 inlined 4dce72bd@22 -> 81670d20 bcsz=37 java/lang/String.lengthInternal()I\n#INL: #1: 4dce72bd #-1 inlined 4dce72bd@28 -> 81670d20 bcsz=37 java/lang/String.lengthInternal()I\n#INL: #2: 4dce72bd #-1 inlined 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n

    The next four methods (#3, #4, #5, #6) are inlined into the method denoted by #2.

    #INL: #3: 4dce72bd #2 inlined bf62dcaf@121 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #4: 4dce72bd #2 inlined bf62dcaf@131 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #5: 4dce72bd #2 inlined bf62dcaf@156 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n#INL: #6: 4dce72bd #2 inlined bf62dcaf@166 -> bbb5af92 bcsz=39 java/lang/String.charAtInternal(I[C)C\n

    Here's how to interpret the line for #INL: #0::

    The method is inlined into 4dce72bd, where 4dce72bd is an internal pointer that corresponds to this method (in this case, java/lang/String.equals(Ljava/lang/Object;)Z). The value @22 at the end of the pointer is a bytecode index, which describes the bytecode index of the call that is being inlined. The call is 81670d20 bcsz=37 java/lang/String.lengthInternal()I, which shows the corresponding internal pointer, bytecode size (bcsz) and the name of the method that got inlined. Going through the #INL output line by line then:

    java/lang/String.lengthInternal()I got inlined into its caller 4dce72bd at bytecode index @22.\njava/lang/String.lengthInternal()I also got inlined into its caller 4dce72bd at bytecode index @28.\njava/lang/String.regionMatchesInternal(...) got inlined at call reference 4dce72bd at bytecode index @104.\n

    Then 4 distinct calls to java/lang/String.charAtInternal(I[C)C were also inlined into java/lang/String.regionMatchesInternal(...) :

    #3 at bytecode index @121 of regionMatchesInternal\n#4 at bytecode index @131 of regionMatchesInternal\n#5 at bytecode index @156 of regionMatchesInternal\n#6 at bytecode index @166 of regionMatchesInternal\n

    These were all the calls that the inliner decided to inline into the method being compiled. There is some additional output that describes calls to methods that weren't inlined:

    #INL: 4dce72bd called 4dce72bd@120 -> f734b49c bcsz=233 java/lang/String.deduplicateStrings(Ljava/lang/String;Ljava/lang/String;)V\n#INL: 4dce72bd coldCalled 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n#INL: 4dce72bd coldCalled 4dce72bd@104 -> bf62dcaf bcsz=182 java/lang/String.regionMatchesInternal(Ljava/lang/String;Ljava/lang/String;[C[CIII)Z\n

    While the output does not specifically say why these methods were not inlined, the relatively larger bytecode size (bcsz=233) probably prevented the first method from being inlined. It's possible that, at a higher optimization level than cold, this deduplicateStrings method may get inlined. The coldCalled label on the last two lines, however, indicate that these calls are located in a part of the method that has not ever been executed, so the JIT decided that inlining those last two methods will probably increase compile time without much promise that it will improve performance.

    By reading the log in this way you can reconstruct the tree of inlines that are taking place as the compilation proceeds. You can see which methods are being inlined and which methods are not being inlined.

    "},{"location":"jit/#see-also","title":"See also","text":""},{"location":"jitserver/","title":"JITServer technology","text":""},{"location":"jitserver/#jitserver-technology","title":"JITServer technology","text":"

    Linux\u00ae on x86, Linux on IBM Power\u00ae systems, Linux on AArch64 and Linux on IBM Z\u00ae systems (64-bit only)

    JITServer technology decouples the JIT compiler from the VM and lets the JIT compiler run remotely in its own process. This mechanism prevents your Java\u2122 application suffering possible negative effects due to CPU and memory consumption caused by JIT compilation.

    This technology can improve quality of service, robustness, and performance of Java applications. You might want to try this technology if the following criteria are met:

    For more details about JITServer technology, including its advantages and disadvantages and when best to use it, see blog posts such as the following:

    For a more in-depth description of the JITServer design and implementation, see the following research paper:

    "},{"location":"jitserver/#using-jitserver-technology","title":"Using JITServer technology","text":"

    JITServer technology is not enabled by default: you must explicitly invoke it. Running OpenJ9 without either of the following options launches it as a regular VM with embedded JIT compilation.

    "},{"location":"jitserver/#launch-eclipse-openj9-in-client-mode","title":"Launch Eclipse OpenJ9 in client mode","text":"

    Use the following command-line option to launch Eclipse OpenJ9\u2122 in client mode. In this mode, the VM sends compilation requests to an available JITServer. The client operates as a regular VM with its own JIT compiler if a server is not available.

     -XX:+UseJITServer\n
    "},{"location":"jitserver/#launch-openj9-in-server-mode","title":"Launch OpenJ9 in server mode","text":"

    Use the following command to start a JITServer process that listens for incoming compilation requests:

    jitserver\n
    "},{"location":"jitserver/#configuring-jitserver-technology","title":"Configuring JITServer technology","text":"

    You can use command line options to further configure the JITServer and the client VM processes. For example:

    If a JITServer server crashes, the client is forced to perform compilations locally. You can change this behavior by using the -XX:[+|-]RequireJITServer option so that the client crashes with an assert when it detects that the server is unavailable. This feature is useful when you are running a test suite with JITServer enabled and you want the server crash to cause the test to fail.

    "},{"location":"jitserver/#security","title":"Security","text":"

    You can encrypt network communication between the client VM and JITServer by using OpenSSL 1.0.x, 1.1.x, or 3.x. To enable encryption, you specify the private key and the certificate at the server and use the certificate at the client. For more information, see -XX:JITServerSSLCert / -XX:JITServerSSLKey / -XX:JITServerSSLRootCerts.

    "},{"location":"jitserver/#tuning-jitserver","title":"Tuning JITServer","text":"

    For best practices regarding JITServer configuration and tuning, see the document JITServer tuning and practical considerations.

    "},{"location":"jitserver/#building-a-jdk-with-jitserver-technology","title":"Building a JDK with JITServer technology","text":"

    If you want to build a JDK with JITServer technology, see Appendix A of Free your JVM from the JIT with JITServer Technology.

    "},{"location":"jitserver/#see-also","title":"See also","text":""},{"location":"jitserver_tuning/","title":"JITServer tuning","text":""},{"location":"jitserver_tuning/#jitserver-tuning-and-practical-considerations","title":"JITServer tuning and practical considerations","text":""},{"location":"jitserver_tuning/#server-caches","title":"Server caches","text":""},{"location":"jitserver_tuning/#client-session-caches","title":"Client-session caches","text":"

    Multiple client JVMs can be connected at the same time to a single JIT server. For each client, the server maintains a client-session cache with information about the environment the client is running in (Java classes, class hierarchy, profiling information, JVM options, and so on). Typically, the information in these caches is kept separately per client. However, if you specify the -XX:+JITServerShareROMClasses option, the read-only part of the Java classes (ROMClasses in Eclipse OpenJ9\u2122 parlance) is shared between the different clients. This option can generate memory savings at the server when the connected clients run identical or similar Java applications.

    The client-session caches are deleted when the clients terminate, but this can happen only if the clients are shutdown gracefully, giving them the opportunity to send a termination message to the server. To address the scenario of clients ending abruptly, the server also deletes the cache for a client that hasn\u2019t issued a compilation request for 1000 minutes, or 5 minutes under memory pressure. If needed, you can change these values with the following options:

    -Xjit:oldAge=<time-in-ms>,oldAgeUnderLowMemory=<time-in-ms>\n
    "},{"location":"jitserver_tuning/#jitserver-aot-cache","title":"JITServer AOT cache","text":"

    The JITServer technology can cache AOT compiled methods at the server. The JITServer can, therefore, avoid carrying out an AOT compilation when a compatible AOT method body already exists in the cache, thereby saving CPU resource and improving remote compilation latency. This mechanism uses the dynamic AOT technology, but does not require a shared class cache at the client.

    When the JITServer receives an AOT compilation request, it checks its AOT cache for a compatible compiled method body. If one is not found, the server performs the AOT compilation, sends the response to the client JVM, then serializes the compiled method and stores it in its local AOT cache, for future use. If a compatible compiled method is found, the server sends the client the serialized compiled method from its cache, thus avoiding a compilation. The client deserializes the response and loads the compiled method as a regular dynamic AOT code.

    This JITServer AOT caching feature is by default enabled at the server but disabled for the JITServer clients. To enable this feature for the JITServer clients, specify the -XX:+JITServerUseAOTCache command-line option for each client.

    A JITServer instance can have several AOT caches, each with its own name. These named AOT caches address the situation when client JVMs with significantly different profiles of execution use the same JITServer instance. A client JVM can indicate a specific AOT cache that it wants to use by providing its name with the following command-line option -XX:JITServerAOTCacheName=<cache_name>. If the client doesn't specify a name for the AOT cache, the server uses a cache named default.

    The maximum amount of memory that all the AOT cache instances combined can use at the server is 300 MB, by default. You can change this value by using the -XX:JITServerAOTmx=<size> option. When the cache size reaches the specified limit, new clients cannot create new AOT cache instances or add new compiled methods to the existing AOT cache instances.

    Typically, each JITServer server populates its own AOT caches independently of other existing servers. To help with JITServer auto-scaling, and in particular with scaling down to zero, JITServer instances can save their AOT caches to files by setting the -XX:+JITServerAOTCachePersistence command-line option. Other JITServer instances that are started later can load the existing AOT cache files into their memory, and then continue to gradually add new AOT compiled methods. Saving an AOT cache to a file is performed periodically based on the following conditions:

    Current limitation:

    "},{"location":"jitserver_tuning/#number-of-concurrent-clients","title":"Number of concurrent clients","text":"

    The amount of CPU and memory resources consumed by the server is expected to increase with the number of connected clients. Finding the appropriate number of clients to connect to a server is a tricky proposition that depends on many factors, such as the number of methods that need to be compiled by the clients, optimization levels for these compilations, how clients are started (staggered or not), and how clients are shutdown (gracefully or not).

    Generally, you should have 10-20 JVMs simultaneously connected to a server with 1-2 GB of memory. With respect to CPU resources, in Kubernetes you might want to set a low \"request\" value at the server (1-2 vCPUs) and a larger \"limit\" value (4-8 vCPUs) in order to soak all those idle cycles. It is possible to connect even more clients to one server instance if memory and CPU resources are increased, but in general, two medium-sized server instances that are placed on different nodes are better than a single, larger server.

    "},{"location":"jitserver_tuning/#alleviating-cpu-congestion-at-the-server","title":"Alleviating CPU congestion at the server","text":"

    When too many clients connect to the server, the server can become flooded with compilation requests, leading to increased compilation times and slower start-up/ramp-up for applications. A client JVM issues most of its compilation requests during the start-up phase and ramp-up phase of an application, when load is first applied to it. Thus, from the CPU consumption point of view what matters is the number of clients that start-up or ramp-up concurrently. To alleviate the CPU strain on the server, you can start the client JVMs in a staggered fashion, rather than all at the same time. Sometimes the staggering happens naturally; for instance, when using Kubernetes horizontal pod auto-scaling, additional application instances are started gradually as the load increases.

    Another idea is to use the -Xjit:enableJITServerHeuristics command-line option at the clients. When this option is present, the client JVMs share some of the compilation burden by performing the cheap compilations locally and send only expensive compilations to the server. What constitutes a cheap compilation is determined by JIT heuristics that look at the method size, optimization level and the amount of CPU and memory available to the JVM.

    "},{"location":"jitserver_tuning/#avoiding-memory-shortages-at-the-server","title":"Avoiding memory shortages at the server","text":"

    Roughly speaking, the server uses two types of memory: 1. \"Scratch\" memory. This memory is allocated during a compilation (for JIT internal data structures) and released to the operating system at the end of the compilation. 2. \"Persistent\" memory. This memory is used for client-session caches and gets deleted only when a client terminates gracefully (or when the JITServer purging mechanism is triggered).

    The total amount of scratch memory at any particular moment depends on how many compilations are in progress and how expensive those compilations are. To reduce this amount, you can start the clients in a staggered fashion as suggested previously, or reduce the number of compilation threads per client. Note that the latter already happens automatically: when the server senses that it is about to run out of memory, it provides feedback to the connected clients to reduce their number of active compilation threads.

    To reduce the amount of persistent memory, you can use the techniques that are described in section Server caches.

    "},{"location":"jitserver_tuning/#traffic-encryption","title":"Traffic encryption","text":"

    Enabling network encryption can increase the CPU overhead, both at the client and at the server. For this reason, you should turn on encryption only if needed. Note that some technologies like Istio, Weave, Linkerd, Calico, Cilium already encrypt all network traffic, so using JITServer encryption might be redundant.

    "},{"location":"jitserver_tuning/#minimizing-application-stalls","title":"Minimizing application stalls","text":"

    Usually, the compilation threads in OpenJ9 JVM execute in parallel with Java application threads. However, for correctness reasons a small number of compilations are performed synchronously, meaning that Java application threads have to wait for the compilation result before being allowed to execute the method being compiled. Since remote compilations typically take longer to complete due to network latency, application stalls that are caused by synchronous compilations can be more severe in a JITServer setting. If this becomes a problem, you should add the following command line option at the client:

    -XX:+JITServerLocalSyncCompiles\n

    This option instructs the client JVM to perform the synchronous compilations locally, at a low optimization level (thus the compilation is relatively quick), and to follow-on with remote asynchronous recompilations at a higher optimization level to avoid any performance loss.

    "},{"location":"jitserver_tuning/#session-affinity","title":"Session affinity","text":"

    For technical reasons, a client JVM must use a single JITServer at a time. In a Kubernetes environment, where a JITServer service can be backed up by several server instances, you can satisfy this requirement by using session affinity. Note that if a server crashes (or gets terminated by the Kubernetes controller) the clients can connect to another server instance. This scenario imposes some performance penalty because the client-session caches that the server maintains need to be built anew. Following is an example of a Kubernetes service definition that uses sessionAffinity:

    apiVersion: v1\nkind: Service\nmetadata:\n  name: jitserver\nspec:\n  type: ClusterIP\nselector:\n    app: jitserver\n  ports:\n    - protocol: TCP\n      port: 38400\n      targetPort: 38400\n  sessionAffinity: ClientIP\n  sessionAffinityConfig:\n    clientIP:\n      timeoutSeconds: 86400\n
    "},{"location":"jitserver_tuning/#resilience","title":"Resilience","text":"

    If the client JVM does not find a compatible server to connect to, compilations are performed locally, by the client itself. To account for the case where the server is temporarily unavailable (for example, server crash followed by Kubernetes launching another server instance), from time to time the client retries to connect to a server at the indicated address and port. The retry mechanism uses an exponential back-off where the retry interval is doubled with each unsuccessful attempt.

    "},{"location":"jitserver_tuning/#monitoring","title":"Monitoring","text":""},{"location":"jitserver_tuning/#performance-metrics","title":"Performance metrics","text":"

    You can enable the provision of performance metrics by specifying the -XX:+JITServerMetrics command-line option. After enabling this option, you can use a monitoring tool that follows the OpenMetrics standard, such as Prometheus, to collect the data by issuing an HTTP GET request to the following url: http://<jitserveraddress>:<port>/metrics.

    Note: There is a limit of four concurrent GET requests at any given time.

    You can use the -XX:JITServerMetricsSSLKey and -XX:JITServerMetricsSSLCert options to encrypt the data with TLS or SSL.

    For more information, including the types of metrics that are provided, see the -XX:[+|-]JITServerMetrics topic.

    "},{"location":"jitserver_tuning/#verbose-logging","title":"Verbose logging","text":"

    You can inspect the behavior of a JITServer instance by using the OpenJ9 verbose logging facility. Note that if the name of the verbose log is not specified, the relevant information is printed to stderr. When you use the -XX:+JITServerLogConnections command-line option, the server prints a message to the verbose log every time a new client JVM connects to it or disconnects from it. This is an easy way to determine that the clients are able to reach the server. Example of output:

    #JITServer: t= 74232 A new client (clientUID=14692403771747196083) connected. Server allocated a new client session.\n#JITServer: t= 74282 A new client (clientUID=2599593246759846167) connected. Server allocated a new client session.\n#JITServer: t= 86281 Client (clientUID=14692403771747196083) disconnected. Client session deleted\n

    The server has a heart-beat thread that periodically prints to the verbose log information related to the number of clients connected, the number of active compilation threads, the amount of CPU used, the amount of available memory and the number of times the internal server caches have been cleared. This last bit of information is important for diagnosing performance problems. The heart-beat information is enabled with the following option:

    -Xjit:statisticsFrequency=<period-in-ms>\n

    Example of output:

    #JITServer: CurrentTime: Aug 06 17:25:15 2021\n#JITServer: Compilation Queue Size: 0\n#JITServer: Number of clients : 2\n#JITServer: Total compilation threads : 63\n#JITServer: Active compilation threads : 2\n#JITServer: Physical memory available: 14299 MB\n#JITServer: CpuLoad 206% (AvgUsage 25%) JvmCpu 113%\n...\n

    A value greater than 0 for the Compilation Queue Size is a sign that the server is overloaded. Compilation requests that wait in the compilation queue face greater delays and run the risk of exceeding network timeouts. To avoid this scenario, you can reduce the number of connected clients, use the techniques that are described in section Alleviating CPU congestion at the server, or increase the number of compilation threads at the server by using the -XcompilationThreads option.

    Increasing the maximum number of client threads can improve performance in high network latency settings because there can be more in-progress concurrent compilation requests. Increasing the number of threads at the server can improve performance if the server has many CPU cores available and serves a large number of clients concurrently.

    More detailed diagnostics can be obtained with the option -Xjit:verbose={JITServer},verbose={compilePerformance}, which is typically used for debugging server behavior.

    "},{"location":"legal/","title":"Legal","text":""},{"location":"legal/#legal","title":"Legal","text":"

    License agreement, notices, copyright, and trademark information for the user documentation.

    "},{"location":"legal/#license-agreement","title":"License agreement","text":"

    See License

    "},{"location":"legal/#notices","title":"Notices","text":"

    See Notices

    "},{"location":"legal/#copyright-information","title":"Copyright information","text":"

    Eclipse OpenJ9\u2122 documentation is subject to the following copyright:

    Copyright (c) 2017, 2024 IBM Corp.\n
    "},{"location":"legal/#trademarks","title":"Trademarks","text":"

    IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of International Business Machines Corp., registered in many jurisdictions worldwide. Other product and service names might be trademarks of IBM or other companies. A current list of IBM trademarks is available on the Web at \"Copyright and trademark information\" here.

    Java and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates.

    Linux is a registered trademark of Linus Torvalds in the United States, other countries, or both.

    Microsoft and Windows are trademarks of Microsoft Corporation in the United States, other countries, or both.

    "},{"location":"messages_intro/","title":"OpenJ9 messages","text":""},{"location":"messages_intro/#eclipse-openj9-vm-messages","title":"Eclipse OpenJ9 VM messages","text":"

    Messages are issued by the Eclipse OpenJ9\u2122 virtual machine (VM) in response to certain conditions. Understanding what the messages mean can help you with problem determination.

    "},{"location":"messages_intro/#message-categories","title":"Message categories","text":"

    There are three main categories of message:

    Information Information messages provide information about VM processing. For example, a dump information message is typically issued when a dump agent requests a dump. Warning Warning messages are issued by the VM to indicate conditions that might need user intervention. Error Error messages are issued by the VM when normal processing cannot proceed, because of unexpected conditions.

    OpenJ9 virtual machine messages have the following format:

        JVM<type><number><code>\n

    where:

    These messages can help you with problem determination.

    By default, all error and some information messages are routed to the system log and also written to stderr or stdout. The specific information messages are JVMDUMP039I, JVMDUMP032I, and JVMDUMP033I, which provide valuable additional information about dumps produced by the VM. To route additional message types to the system log, or turn off message logging to the system log, use the -Xsyslog option. The -Xsyslog option does not affect messages written to the standard error stream (stderr). See OpenJ9 command-line options.

    Note: The -Xsyslog option replaces the -Xlog option in OpenJ9 version 0.24.0.

    "},{"location":"messages_intro/#finding-logged-messages","title":"Finding logged messages","text":"

    Logged messages can be found in different locations, according to platform.

    "},{"location":"messages_intro/#finding-aix-messages","title":"Finding AIX messages","text":"

    On AIX\u00ae, messages are logged by the syslog daemon (/usr/sbin/syslogd). Logged messages are written to the syslog file that is configured in /etc/syslog.conf. If the syslog daemon is not running, logged messages are lost.

    You can redirect messages from the syslog daemon to the AIX error log facility by performing the following configuration steps:

    1. Set up a redirect in the file syslog.conf so that syslog messages are sent to the error log, by adding the following line:
            user.debug errlog\n
    1. If syslogd is already running, reload the updated configuration by running the following command:
            refresh -s syslogd\n
    1. The updated configuration is used each time syslogd starts. 4. Use the AIX errpt command or the System Management Interface Tool (SMIT) to read the messages sent to the error log.

    For more information about AIX logging, see: Error-logging overview.

    "},{"location":"messages_intro/#finding-linux-messages","title":"Finding Linux messages","text":"

    On Linux\u00ae, messages are logged by the syslog daemon. To find where messages are logged, check the syslog configuration file.

    "},{"location":"messages_intro/#finding-macos-messages","title":"Finding macOS messages","text":"

    On macOS\u00ae, messages are logged by the syslog daemon. However, on Sierra and High Sierra, syslog does not work. If /var/log/system.log is not available, Console.app can be used instead.

    "},{"location":"messages_intro/#finding-windows-messages","title":"Finding Windows messages","text":"

    On Windows\u2122, messages are logged in the application events section of the event viewer.

    "},{"location":"messages_intro/#finding-zos-messages","title":"Finding z/OS messages","text":"

    On z/OS\u00ae, messages are sent to the operator console. To see the messages, go from the ispf panel to the sdsf panel, then open the log panel.

    "},{"location":"messages_intro/#obtaining-detailed-message-descriptions","title":"Obtaining detailed message descriptions","text":"

    Detailed message information is available to help with problem diagnosis.

    Understanding the warning or error message issued by the VM can help you diagnose problems. All warning and error messages issued by the VM are listed by type in the messages guide: IBM\u00ae VM messages.

    The messages, error codes, and exit codes in this guide apply to multiple versions of the VM.

    Note: If the VM fills all available memory, the message number might be produced without a description for the error that caused the problem. Look for the message number in the relevant section of the J9 VM Messages guide to see the message description and the additional information provided.

    "},{"location":"migrating11to17/","title":"Migrating from Java 11 to Java 17","text":""},{"location":"migrating11to17/#migrating-from-java-11-to-java-17","title":"Migrating from Java 11 to Java 17","text":"

    Support for OpenJDK 17 was added in Eclipse OpenJ9\u2122 version 0.29.1.

    The following new OpenJ9 changes apply when OpenJ9 is built with Java SE 17 class libraries. This information exists elsewhere in the documentation but is summarized here for convenience.

    "},{"location":"migrating11to17/#support-for-jdk-enhancement-proposals-jep","title":"Support for JDK enhancement proposals (JEP)","text":"

    The new JEPs that are supported are listed in the following topics:

    "},{"location":"migrating11to17/#new-openj9-features-and-changes","title":"New OpenJ9 features and changes","text":"

    The following table lists the new OpenJ9 features and notable changes with the OpenJ9 release in which they were added:

    Features and changes OpenJ9 release The default operating system stack size on x64 platforms is increased from 256 KB to 512 KB to accommodate vector support. You can change the operating system stack size by using the -Xmso option. 0.33.0 When the VM loads an application native library (DLL), it searches for the library in the path that is specified in the java.library.path system property or in the following environment variables:
    @@ -8944,6 +8983,7 @@

    What's new in version 0.48.0

    Features and changes

    Binaries and supported environments

    @@ -8952,9 +8992,13 @@

    Binaries and supported environments

    Loading of the zlibnx library on AIX is disabled by default

    From release 0.25.0 onwards, zlibNX hardware-accelerated data compression and decompression was enabled by default on AIX®. From this release onwards, loading of the zlibnx library on AIX is disabled by default because using zlibNX might cause a ClassNotFoundException error. You can enable adding of the zlibNX library by using the -XX:+UseZlibNX option.

    For more information, see -XX:[+|-]UseZlibNX.

    +

    Start of content that applies to Java 11 (LTS) and later JDWP support on Checkpoint/Restore In Userspace (CRIU) restore is enabled

    +

    You can use the options that enable the JDWP support both on CRIU pre-checkpoint, and on restore as well.

    +

    Also, a new parameter suspendOnRestore for the Xrunjdwp option is added to control the suspension of the target VM application on restore. This option is specific to OpenJ9. You can use the suspendOnRestore=n setting to prevent the suspension of the target application.

    +

    For more information, see -Xrunjdwp. End of content that applies to Java 11 (LTS) and later

    Known problems and full release information

    -

    To see known problems and a complete list of changes between Eclipse OpenJ9 v0.46.0 and v0.47.0 releases, see the Release notes.

    - +

    To see known problems and a complete list of changes between Eclipse OpenJ9 v0.47.0 and v0.48.0 releases, see the Release notes.

    + diff --git a/version0.8/index.html b/version0.8/index.html index d7babd24cb..43707d7e6a 100644 --- a/version0.8/index.html +++ b/version0.8/index.html @@ -5477,6 +5477,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/version0.9/index.html b/version0.9/index.html index 10ebced677..cefcd1b1db 100644 --- a/version0.9/index.html +++ b/version0.9/index.html @@ -5630,6 +5630,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/vgclog/index.html b/vgclog/index.html index ce335f2884..2599a407b0 100644 --- a/vgclog/index.html +++ b/vgclog/index.html @@ -5558,6 +5558,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/vgclog_examples/index.html b/vgclog_examples/index.html index 0ae149e13c..1dfb3cce1e 100644 --- a/vgclog_examples/index.html +++ b/vgclog_examples/index.html @@ -5684,6 +5684,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/x/index.html b/x/index.html index 6f39d2fcc6..dcef5f04c6 100644 --- a/x/index.html +++ b/x/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/x_jvm_commands/index.html b/x_jvm_commands/index.html index d96e0d4320..b1c274f17f 100644 --- a/x_jvm_commands/index.html +++ b/x_jvm_commands/index.html @@ -5477,6 +5477,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xaggressive/index.html b/xaggressive/index.html index 0acbdcb35c..c07e71b9d3 100644 --- a/xaggressive/index.html +++ b/xaggressive/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xalwaysclassgc/index.html b/xalwaysclassgc/index.html index 6a37ba9de4..06ffd8b5e4 100644 --- a/xalwaysclassgc/index.html +++ b/xalwaysclassgc/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xaot/index.html b/xaot/index.html index 2a935da6a6..d51da04f01 100644 --- a/xaot/index.html +++ b/xaot/index.html @@ -5630,6 +5630,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xargencoding/index.html b/xargencoding/index.html index f1c48471d9..6bce66eda0 100644 --- a/xargencoding/index.html +++ b/xargencoding/index.html @@ -5558,6 +5558,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xbootclasspath/index.html b/xbootclasspath/index.html index e0c6916bbc..0c32ae700e 100644 --- a/xbootclasspath/index.html +++ b/xbootclasspath/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xceehdlr/index.html b/xceehdlr/index.html index 740eb2735c..f337a70e95 100644 --- a/xceehdlr/index.html +++ b/xceehdlr/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcheck/index.html b/xcheck/index.html index 5f5bc6d11e..c357a297d3 100644 --- a/xcheck/index.html +++ b/xcheck/index.html @@ -5585,6 +5585,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xclassgc/index.html b/xclassgc/index.html index 2838949028..4447b6423b 100644 --- a/xclassgc/index.html +++ b/xclassgc/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcodecache/index.html b/xcodecache/index.html index 7ab9fc2c13..d72ee7bad4 100644 --- a/xcodecache/index.html +++ b/xcodecache/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcodecachetotal/index.html b/xcodecachetotal/index.html index 56c0130c3a..7a1a6ccbad 100644 --- a/xcodecachetotal/index.html +++ b/xcodecachetotal/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcomp/index.html b/xcomp/index.html index baba0e0938..4dfd8c975f 100644 --- a/xcomp/index.html +++ b/xcomp/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcompactexplicitgc/index.html b/xcompactexplicitgc/index.html index b2d7afd4a0..558e758469 100644 --- a/xcompactexplicitgc/index.html +++ b/xcompactexplicitgc/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcompactgc/index.html b/xcompactgc/index.html index cd60acf17d..f0bad387d2 100644 --- a/xcompactgc/index.html +++ b/xcompactgc/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcompilationthreads/index.html b/xcompilationthreads/index.html index a0d905ac97..12e5a4e9b7 100644 --- a/xcompilationthreads/index.html +++ b/xcompilationthreads/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xcompressedrefs/index.html b/xcompressedrefs/index.html index aed682bb8f..fd6e0a7cb8 100644 --- a/xcompressedrefs/index.html +++ b/xcompressedrefs/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xconcurrentbackground/index.html b/xconcurrentbackground/index.html index 6e19c077a7..205796320e 100644 --- a/xconcurrentbackground/index.html +++ b/xconcurrentbackground/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xconcurrentlevel/index.html b/xconcurrentlevel/index.html index 5abf37ef8c..ecab7fc622 100644 --- a/xconcurrentlevel/index.html +++ b/xconcurrentlevel/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xconcurrentslack/index.html b/xconcurrentslack/index.html index 8ebc4880fd..fce0b3cfeb 100644 --- a/xconcurrentslack/index.html +++ b/xconcurrentslack/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xconmeter/index.html b/xconmeter/index.html index 836e1e4e12..19c475ac57 100644 --- a/xconmeter/index.html +++ b/xconmeter/index.html @@ -5567,6 +5567,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xdisablejavadump/index.html b/xdisablejavadump/index.html index 7067602b8b..bc69ec05bb 100644 --- a/xdisablejavadump/index.html +++ b/xdisablejavadump/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xdump/index.html b/xdump/index.html index 15fca7f94c..6766e95329 100644 --- a/xdump/index.html +++ b/xdump/index.html @@ -5873,6 +5873,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xdynamicheapadjustment/index.html b/xdynamicheapadjustment/index.html index 8bc41faa92..9dd90d9434 100644 --- a/xdynamicheapadjustment/index.html +++ b/xdynamicheapadjustment/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xenableexcessivegc/index.html b/xenableexcessivegc/index.html index d9fa7f76da..54bdd9c87e 100644 --- a/xenableexcessivegc/index.html +++ b/xenableexcessivegc/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xenableexplicitgc/index.html b/xenableexplicitgc/index.html index dec71884ab..fba908a08d 100644 --- a/xenableexplicitgc/index.html +++ b/xenableexplicitgc/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xenablestringconstantgc/index.html b/xenablestringconstantgc/index.html index ec86151ae2..7820ce5ce1 100644 --- a/xenablestringconstantgc/index.html +++ b/xenablestringconstantgc/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xfastresolve/index.html b/xfastresolve/index.html index 8e81f6624f..4908bcb90a 100644 --- a/xfastresolve/index.html +++ b/xfastresolve/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xfuture/index.html b/xfuture/index.html index 67a5389377..6f5bdcecd4 100644 --- a/xfuture/index.html +++ b/xfuture/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgc/index.html b/xgc/index.html index a317c3b904..2567869269 100644 --- a/xgc/index.html +++ b/xgc/index.html @@ -5765,6 +5765,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgcmaxthreads/index.html b/xgcmaxthreads/index.html index e70627dea1..e410a7d458 100644 --- a/xgcmaxthreads/index.html +++ b/xgcmaxthreads/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgcpolicy/index.html b/xgcpolicy/index.html index 739e81c679..88683da157 100644 --- a/xgcpolicy/index.html +++ b/xgcpolicy/index.html @@ -5615,6 +5615,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgcsplitheap/index.html b/xgcsplitheap/index.html index 46639116e1..936c586760 100644 --- a/xgcsplitheap/index.html +++ b/xgcsplitheap/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgcthreads/index.html b/xgcthreads/index.html index 141e4b7ee6..f4cfc85c17 100644 --- a/xgcthreads/index.html +++ b/xgcthreads/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xgcworkpackets/index.html b/xgcworkpackets/index.html index b84f08eb16..dea1f1bb8b 100644 --- a/xgcworkpackets/index.html +++ b/xgcworkpackets/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xint/index.html b/xint/index.html index da486b492b..bcf83d6b73 100644 --- a/xint/index.html +++ b/xint/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xjit/index.html b/xjit/index.html index f89b9c656d..471eff1dc9 100644 --- a/xjit/index.html +++ b/xjit/index.html @@ -5672,6 +5672,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xjni/index.html b/xjni/index.html index 3b8a31061e..67305ee566 100644 --- a/xjni/index.html +++ b/xjni/index.html @@ -5540,6 +5540,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlinenumbers/index.html b/xlinenumbers/index.html index 15e967dec4..a8a06a77d0 100644 --- a/xlinenumbers/index.html +++ b/xlinenumbers/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xloa/index.html b/xloa/index.html index 154da9e755..a5f1c5089a 100644 --- a/xloa/index.html +++ b/xloa/index.html @@ -5543,6 +5543,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xloaminimum/index.html b/xloaminimum/index.html index 5d4a928099..9f5bf96272 100644 --- a/xloaminimum/index.html +++ b/xloaminimum/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlockreservation/index.html b/xlockreservation/index.html index 25b1396fea..13319fb173 100644 --- a/xlockreservation/index.html +++ b/xlockreservation/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlockword/index.html b/xlockword/index.html index 0020d881c5..afebbfac84 100644 --- a/xlockword/index.html +++ b/xlockword/index.html @@ -5558,6 +5558,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlog/index.html b/xlog/index.html index ebd86cd0ee..302b9b5589 100644 --- a/xlog/index.html +++ b/xlog/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlp/index.html b/xlp/index.html index 95165bb733..b722d0570f 100644 --- a/xlp/index.html +++ b/xlp/index.html @@ -5585,6 +5585,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlpcodecache/index.html b/xlpcodecache/index.html index 924e4fc176..a205a1ea29 100644 --- a/xlpcodecache/index.html +++ b/xlpcodecache/index.html @@ -5576,6 +5576,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xlpobjectheap/index.html b/xlpobjectheap/index.html index 7ee05d7071..180f0e2507 100644 --- a/xlpobjectheap/index.html +++ b/xlpobjectheap/index.html @@ -5591,6 +5591,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmca/index.html b/xmca/index.html index 8eaae680d7..9725607cbb 100644 --- a/xmca/index.html +++ b/xmca/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmcrs/index.html b/xmcrs/index.html index 79ee0af9dd..bc7939c79a 100644 --- a/xmcrs/index.html +++ b/xmcrs/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmine/index.html b/xmine/index.html index ed11168325..e8bf3c05ec 100644 --- a/xmine/index.html +++ b/xmine/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xminf/index.html b/xminf/index.html index d68a16ba6d..3b2aeb444f 100644 --- a/xminf/index.html +++ b/xminf/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmint/index.html b/xmint/index.html index e40428f8e3..e48a4df506 100644 --- a/xmint/index.html +++ b/xmint/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmn/index.html b/xmn/index.html index 3581db2a6f..47ee9d52e4 100644 --- a/xmn/index.html +++ b/xmn/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmo/index.html b/xmo/index.html index 65ad0695e3..7132a47d14 100644 --- a/xmo/index.html +++ b/xmo/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmoi/index.html b/xmoi/index.html index 80a1013faf..36b9f50ee8 100644 --- a/xmoi/index.html +++ b/xmoi/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmr/index.html b/xmr/index.html index f4de862d95..01f485e8ff 100644 --- a/xmr/index.html +++ b/xmr/index.html @@ -5516,6 +5516,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xms/index.html b/xms/index.html index 3a112f1c69..e0bd118663 100644 --- a/xms/index.html +++ b/xms/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xmso/index.html b/xmso/index.html index 757f811415..e7f9a89f57 100644 --- a/xmso/index.html +++ b/xmso/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xnumanone/index.html b/xnumanone/index.html index 22add41703..4e3a0affdf 100644 --- a/xnumanone/index.html +++ b/xnumanone/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xoptionsfile/index.html b/xoptionsfile/index.html index 024401db15..54a2729468 100644 --- a/xoptionsfile/index.html +++ b/xoptionsfile/index.html @@ -5543,6 +5543,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xquickstart/index.html b/xquickstart/index.html index af06c991fb..a31d1331a1 100644 --- a/xquickstart/index.html +++ b/xquickstart/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xrs/index.html b/xrs/index.html index 92feab30e2..05c8032ee4 100644 --- a/xrs/index.html +++ b/xrs/index.html @@ -16,7 +16,7 @@ - + @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xrsonrestoresynconrestore/index.html b/xrsonrestoresynconrestore/index.html index d807530e64..4504d863c8 100644 --- a/xrsonrestoresynconrestore/index.html +++ b/xrsonrestoresynconrestore/index.html @@ -5549,6 +5549,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xrunjdwp/index.html b/xrunjdwp/index.html new file mode 100644 index 0000000000..824a00abef --- /dev/null +++ b/xrunjdwp/index.html @@ -0,0 +1,9346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + -Xrunjdwp - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + + + +
    + + +
    + +
    +

    CAUTION: This site hosts draft documentation for the next release. For published content of the latest release, visit www.eclipse.org/openj9/docs

    + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + +

    -Xrunjdwp

    +

    The -Xrunjdwp option enables the Java™ Debug Wire Protocol (JDWP) agent in the VM. The JDWP agent provides a connection point for the debugger to debug a Java application in that VM.

    +

    Note: You can enable the JDWP support on Checkpoint/Restore In Userspace (CRIU) restore by specifying the following command-line options pre-checkpoint:

    +
      +
    • -Xrunjdwp
    • +
    • -agentlib:jdwp
    • +
    • -agentpath:/path/to/libjdwp.so
    • +
    + + +

    Parameters

    +

    These parameters are applicable for both the -Xrunjdwp and -agentlib:jdwp options.

    +

    address

    +
        -Xrunjdwp:address=<value>
    +
    +
    +
    Specifies the transport address for the connection. If server=y and address is specified, the VM listens for a connection at this address. If server=y and address is not specified, the VM chooses a transport address to listen for a debugger application. If server=n, the address parameter is mandatory. The VM attempts to attach to the debugger application at the specified address.
    +
    +

    help

    +
        -Xrunjdwp:help
    +
    +
    +
    Prints a brief help message that describes all the available options for the -Xrunjdwp option and exits the VM.
    +
    +

    launch

    +
        -Xrunjdwp:launch=<path>
    +
    +
    +
    Starts the debugger process from the specified path. The values of the address and transport parameters, if available, are also added to the specified path. These parameters help the debugger to connect to the target VM. This option is used with onthrow, onuncaught or both the parameters to provide Just-In-Time debugging in which a debugger process is started when a particular event occurs in this VM.
    +
    +

    onthrow

    +
        -Xrunjdwp:onthrow=<exception>
    +
    +
    +
    Delays the debugging process until the specified exception is thrown in this VM. The JDWP agent attaches to the VM and starts debugging when the exception is thrown.
    +
    +

    onuncaught

    +
        -Xrunjdwp:onuncaught=[y|n]
    +
    +
    +
    If onuncaught=y, delays the debugging process until an uncaught exception is thrown in this VM.
    +
    +

    server

    +
        -Xrunjdwp:server=[y|n]
    +
    +
    +
    If server=n, the VM does not listen to any incoming debugger connection and it attempts to attach to the local debugger application at the specified address. In this case, specifying theaddress parameter is mandatory. If server=y, the target VM acts as a server listening for an incoming debugger connection through the JDWP agent. If server=y and address is specified, the VM listens for a debugger connection at this address. If server=y and address is not specified, the VM selects a transport address at which to listen for a debugger application.
    +
    +

    suspend

    +
        -Xrunjdwp:suspend=[y|n]
    +
    +
    +
    If suspend=y, the VM suspends running of the target Java application until the debugger is attached successfully and is ready for debugging. If suspend=n, the VM does not suspend running of the target Java application while the debug connection is established. The VM continues running the application as normal. The debugger can attach to the running application at any time.
    +
    When a debug session is restored from a checkpoint, the VM suspends the running of the Java application that was being debugged even if suspend=n. The VM waits for the debugger to send a Resume request before it restarts the Java application to continue the debug session. When the debug session is complete, the debugger disconnects from the JDWP agent, and the agent resumes normal running of the Java application.
    +
    +

    Start of content that applies to Java 11 (LTS) and later suspendOnRestore

    +

    (Linux® x86, Linux on POWER® (Little Endian), Linux on AArch64, and Linux on IBM Z® only)

    +

    suspendOnRestore is an OpenJ9 specific parameter and is similar to the suspend parameter. But unlike suspend, this parameter only affects a VM on restore.

    +
        -Xrunjdwp:suspendOnRestore=[y|n]
    +
    +
    +
    If suspendOnRestore=y, the VM suspends running of the target Java application until the debugger is attached successfully and is ready for debugging on CRIU restore. If suspendOnRestore=n, the VM does not suspend the running of the target Java application while the debug connection is established on restore.
    +
    If suspend=y is set pre-checkpoint, the VM suspends the application pre-checkpoint, and on restore. The application remains suspended when you restore the VM even if you specify suspend=n pre-checkpoint. Therefore, to ensure that the application is not suspended on restore, you can use the suspendOnRestore=n setting. End of content that applies to Java 11 (LTS) and later
    +
    +

    timeout

    +
        -Xrunjdwp:timeout=<milliseconds>
    +
    +
    +
    If server=y, the timeout parameter specifies the time the VM waits for the debugger to attach before the VM ends the connection. If server=n, the parameter specifies the time until the VM tries attaching to the debugger before it ends the connection.
    +
    +

    transport

    +
        -Xrunjdwp:transport=<value>
    +
    +
    +
    Specifies the name of the transport to use in connecting to the debugger application. Transport refers to a method of communication between a debugger and the VM that is being debugged. <value> can be dt_socket or dt_shmem. dt_socket or the socket transport relies on TCP sockets that listen on a port for debugger connections, and uses that connection to transfer the debug session packets. This transport mechanism enables debugging remote target VM application. dt_shmem or the shared memory transport uses shared memory to send and receive packets. This transport mechanism enables debugging only locally running applications.
    +
    +

    For more information, see -agentlib:jdwp and -Xrunjdwp sub-options.

    +

    See also

    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/xsamplingexpirationtime/index.html b/xsamplingexpirationtime/index.html index 28cd160324..6afc41c7c8 100644 --- a/xsamplingexpirationtime/index.html +++ b/xsamplingexpirationtime/index.html @@ -13,7 +13,7 @@ - + @@ -5465,6 +5465,27 @@ + + +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + diff --git a/xscdmx/index.html b/xscdmx/index.html index 6bb06fcfa7..084e43b865 100644 --- a/xscdmx/index.html +++ b/xscdmx/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xscminaot/index.html b/xscminaot/index.html index 27df66067d..b4e69601ff 100644 --- a/xscminaot/index.html +++ b/xscminaot/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xscminjitdata/index.html b/xscminjitdata/index.html index 7039ed4750..67481b7120 100644 --- a/xscminjitdata/index.html +++ b/xscminjitdata/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xscmx/index.html b/xscmx/index.html index e109817051..82ee978c7d 100644 --- a/xscmx/index.html +++ b/xscmx/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xshareclasses/index.html b/xshareclasses/index.html index 7cfa75f25f..0c54d86b1f 100644 --- a/xshareclasses/index.html +++ b/xshareclasses/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xshareclassesdisableonrestore/index.html b/xshareclassesdisableonrestore/index.html index 4336e32889..bfd593c35b 100644 --- a/xshareclassesdisableonrestore/index.html +++ b/xshareclassesdisableonrestore/index.html @@ -5540,6 +5540,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsigcatch/index.html b/xsigcatch/index.html index 2d7669bea4..584b93ad79 100644 --- a/xsigcatch/index.html +++ b/xsigcatch/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsigchain/index.html b/xsigchain/index.html index e599cae8d8..f86a5f09bb 100644 --- a/xsigchain/index.html +++ b/xsigchain/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsignal/index.html b/xsignal/index.html index 8521c4a5af..0c6f6da951 100644 --- a/xsignal/index.html +++ b/xsignal/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsoftmx/index.html b/xsoftmx/index.html index 283a703531..9d1681393e 100644 --- a/xsoftmx/index.html +++ b/xsoftmx/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsoftrefthreshold/index.html b/xsoftrefthreshold/index.html index b51acd9d41..9862edf6cf 100644 --- a/xsoftrefthreshold/index.html +++ b/xsoftrefthreshold/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xss/index.html b/xss/index.html index 71b9bee7f2..9de64dadf8 100644 --- a/xss/index.html +++ b/xss/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xsyslog/index.html b/xsyslog/index.html index 3b9f2eee95..14d4b5643f 100644 --- a/xsyslog/index.html +++ b/xsyslog/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xtgc/index.html b/xtgc/index.html index fe10dd93df..9bfc2c8f13 100644 --- a/xtgc/index.html +++ b/xtgc/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xthr/index.html b/xthr/index.html index 5a5a425d21..9755b4c965 100644 --- a/xthr/index.html +++ b/xthr/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xtlhprefetch/index.html b/xtlhprefetch/index.html index 872364504e..5cb72f2a56 100644 --- a/xtlhprefetch/index.html +++ b/xtlhprefetch/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xtrace/index.html b/xtrace/index.html index 32006a4518..aa9207d2e2 100644 --- a/xtrace/index.html +++ b/xtrace/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xtunevirtualized/index.html b/xtunevirtualized/index.html index 1a5f93482b..6d4925e48e 100644 --- a/xtunevirtualized/index.html +++ b/xtunevirtualized/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xverbosegclog/index.html b/xverbosegclog/index.html index a49babfff8..b2970e4f79 100644 --- a/xverbosegclog/index.html +++ b/xverbosegclog/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xverify/index.html b/xverify/index.html index 3074d850ec..3237188379 100644 --- a/xverify/index.html +++ b/xverify/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xx_jvm_commands/index.html b/xx_jvm_commands/index.html index 4d606eca1e..11bf58d5fa 100644 --- a/xx_jvm_commands/index.html +++ b/xx_jvm_commands/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxactiveprocessorcount/index.html b/xxactiveprocessorcount/index.html index d7cc3730d3..e423544997 100644 --- a/xxactiveprocessorcount/index.html +++ b/xxactiveprocessorcount/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxadaptivegcthreading/index.html b/xxadaptivegcthreading/index.html index c31e59e7f1..14dcb0a028 100644 --- a/xxadaptivegcthreading/index.html +++ b/xxadaptivegcthreading/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxallowvmshutdown/index.html b/xxallowvmshutdown/index.html index a3607c389a..f37d1268fb 100644 --- a/xxallowvmshutdown/index.html +++ b/xxallowvmshutdown/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxalwayspretouch/index.html b/xxalwayspretouch/index.html index 41bec110e3..d8ef3ab021 100644 --- a/xxalwayspretouch/index.html +++ b/xxalwayspretouch/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcheckpointgcthread/index.html b/xxcheckpointgcthread/index.html index def15525b5..eccf206f80 100644 --- a/xxcheckpointgcthread/index.html +++ b/xxcheckpointgcthread/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxclassrelationshipverifier/index.html b/xxclassrelationshipverifier/index.html index 8c9133b110..25c378d2de 100644 --- a/xxclassrelationshipverifier/index.html +++ b/xxclassrelationshipverifier/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcodecachetotal/index.html b/xxcodecachetotal/index.html index a74f1ea50a..f52b1bf32c 100644 --- a/xxcodecachetotal/index.html +++ b/xxcodecachetotal/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcodecachetotalmaxrampercentage/index.html b/xxcodecachetotalmaxrampercentage/index.html index b0e843a871..720d16ef9f 100644 --- a/xxcodecachetotalmaxrampercentage/index.html +++ b/xxcodecachetotalmaxrampercentage/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcompactstrings/index.html b/xxcompactstrings/index.html index ce7afdfdce..2800f00bbf 100644 --- a/xxcompactstrings/index.html +++ b/xxcompactstrings/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcompatibility/index.html b/xxcompatibility/index.html index a2462590d2..293fcd844a 100644 --- a/xxcompatibility/index.html +++ b/xxcompatibility/index.html @@ -5525,6 +5525,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxconcgcthreads/index.html b/xxconcgcthreads/index.html index 8d3d02c003..821792453e 100644 --- a/xxconcgcthreads/index.html +++ b/xxconcgcthreads/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcontinuationcache/index.html b/xxcontinuationcache/index.html index 1df9931abb..16a0f0ea6a 100644 --- a/xxcontinuationcache/index.html +++ b/xxcontinuationcache/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcpuloadcompatibility/index.html b/xxcpuloadcompatibility/index.html index e3e345c519..84f3abc948 100644 --- a/xxcpuloadcompatibility/index.html +++ b/xxcpuloadcompatibility/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcriurestorenonportablemode/index.html b/xxcriurestorenonportablemode/index.html index 440512916f..b35509a921 100644 --- a/xxcriurestorenonportablemode/index.html +++ b/xxcriurestorenonportablemode/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxcriusecprovider/index.html b/xxcriusecprovider/index.html index 64cdd1063a..15f43cd20a 100644 --- a/xxcriusecprovider/index.html +++ b/xxcriusecprovider/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxdiagnosesynconvaluebasedclasses/index.html b/xxdiagnosesynconvaluebasedclasses/index.html index 56b5867a41..16d2d48b05 100644 --- a/xxdiagnosesynconvaluebasedclasses/index.html +++ b/xxdiagnosesynconvaluebasedclasses/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxdisableexplicitgc/index.html b/xxdisableexplicitgc/index.html index 9c4e7e05d5..1df5e24177 100644 --- a/xxdisableexplicitgc/index.html +++ b/xxdisableexplicitgc/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxdisclaimjitscratch/index.html b/xxdisclaimjitscratch/index.html index 23d48c046a..2d92ab15a2 100644 --- a/xxdisclaimjitscratch/index.html +++ b/xxdisclaimjitscratch/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxenable3164interoperability/index.html b/xxenable3164interoperability/index.html index b4619558e7..44e6d9f64c 100644 --- a/xxenable3164interoperability/index.html +++ b/xxenable3164interoperability/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxenablecpumonitor/index.html b/xxenablecpumonitor/index.html index 29a3a8244e..083799c833 100644 --- a/xxenablecpumonitor/index.html +++ b/xxenablecpumonitor/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxenablecriusupport/index.html b/xxenablecriusupport/index.html index 0a1499d92b..2ddf4e5e64 100644 --- a/xxenablecriusupport/index.html +++ b/xxenablecriusupport/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxenabledynamicagentloading/index.html b/xxenabledynamicagentloading/index.html index c690bec4ba..c4c794fcc7 100644 --- a/xxenabledynamicagentloading/index.html +++ b/xxenabledynamicagentloading/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxenableextendedhcr/index.html b/xxenableextendedhcr/index.html index efc7fcaeba..e1a8523365 100644 --- a/xxenableextendedhcr/index.html +++ b/xxenableextendedhcr/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxensurehashed/index.html b/xxensurehashed/index.html index 0dd103a0fb..45f84138d7 100644 --- a/xxensurehashed/index.html +++ b/xxensurehashed/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxexitonoutofmemoryerror/index.html b/xxexitonoutofmemoryerror/index.html index abfe0d73bd..e578cd3d3b 100644 --- a/xxexitonoutofmemoryerror/index.html +++ b/xxexitonoutofmemoryerror/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxgloballockreservation/index.html b/xxgloballockreservation/index.html index 308c5470a9..781687833f 100644 --- a/xxgloballockreservation/index.html +++ b/xxgloballockreservation/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxhandlesigabrt/index.html b/xxhandlesigabrt/index.html index f2948119c7..f20fb11ea5 100644 --- a/xxhandlesigabrt/index.html +++ b/xxhandlesigabrt/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxhandlesigusr2/index.html b/xxhandlesigusr2/index.html index 8447e4b4a0..63b0eee429 100644 --- a/xxhandlesigusr2/index.html +++ b/xxhandlesigusr2/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxhandlesigxfsz/index.html b/xxhandlesigxfsz/index.html index 1435034594..e57c5bc73e 100644 --- a/xxhandlesigxfsz/index.html +++ b/xxhandlesigxfsz/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxheapdumponoutofmemory/index.html b/xxheapdumponoutofmemory/index.html index b8abbfd5c8..5a1cee6b83 100644 --- a/xxheapdumponoutofmemory/index.html +++ b/xxheapdumponoutofmemory/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxheapdumppath/index.html b/xxheapdumppath/index.html index 18c0e2ca54..2f588a4a3a 100644 --- a/xxheapdumppath/index.html +++ b/xxheapdumppath/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxheapmanagementmxbeancompatibility/index.html b/xxheapmanagementmxbeancompatibility/index.html index d3a21308b3..f833e07e45 100644 --- a/xxheapmanagementmxbeancompatibility/index.html +++ b/xxheapmanagementmxbeancompatibility/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxidletuningcompactonidle/index.html b/xxidletuningcompactonidle/index.html index 9d6f03245c..feebfba80c 100644 --- a/xxidletuningcompactonidle/index.html +++ b/xxidletuningcompactonidle/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxidletuninggconidle/index.html b/xxidletuninggconidle/index.html index 3010dea597..e6e88ab307 100644 --- a/xxidletuninggconidle/index.html +++ b/xxidletuninggconidle/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxidletuningminfreeheaponidle/index.html b/xxidletuningminfreeheaponidle/index.html index e02d6e3a27..cf3f3a8886 100644 --- a/xxidletuningminfreeheaponidle/index.html +++ b/xxidletuningminfreeheaponidle/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxidletuningminidlewaittime/index.html b/xxidletuningminidlewaittime/index.html index bc0f32f535..8efd09d2c8 100644 --- a/xxidletuningminidlewaittime/index.html +++ b/xxidletuningminidlewaittime/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxignoreunrecognizedrestoreoptions/index.html b/xxignoreunrecognizedrestoreoptions/index.html index b245ed56fe..a11bceb75c 100644 --- a/xxignoreunrecognizedrestoreoptions/index.html +++ b/xxignoreunrecognizedrestoreoptions/index.html @@ -5534,6 +5534,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxignoreunrecognizedvmoptions/index.html b/xxignoreunrecognizedvmoptions/index.html index f9bd0a0e7b..7256ccb51c 100644 --- a/xxignoreunrecognizedvmoptions/index.html +++ b/xxignoreunrecognizedvmoptions/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxignoreunrecognizedxxcolonoptions/index.html b/xxignoreunrecognizedxxcolonoptions/index.html index 173be6e9c8..685db0c35b 100644 --- a/xxignoreunrecognizedxxcolonoptions/index.html +++ b/xxignoreunrecognizedxxcolonoptions/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxinitialheapsize/index.html b/xxinitialheapsize/index.html index e02ab48b83..1fb4dc21f4 100644 --- a/xxinitialheapsize/index.html +++ b/xxinitialheapsize/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxinitialrampercentage/index.html b/xxinitialrampercentage/index.html index e850be8be8..10fc30cf15 100644 --- a/xxinitialrampercentage/index.html +++ b/xxinitialrampercentage/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxinterleavememory/index.html b/xxinterleavememory/index.html index fab0ff3734..d1a3cd0528 100644 --- a/xxinterleavememory/index.html +++ b/xxinterleavememory/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxiprofileduringstartupphase/index.html b/xxiprofileduringstartupphase/index.html index 9ca07705f8..1e3655e3b8 100644 --- a/xxiprofileduringstartupphase/index.html +++ b/xxiprofileduringstartupphase/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitinlinewatches/index.html b/xxjitinlinewatches/index.html index 290392e8ce..a3c7283881 100644 --- a/xxjitinlinewatches/index.html +++ b/xxjitinlinewatches/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraddress/index.html b/xxjitserveraddress/index.html index 0129708568..bcf6cd46da 100644 --- a/xxjitserveraddress/index.html +++ b/xxjitserveraddress/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraotcachedir/index.html b/xxjitserveraotcachedir/index.html index f27e4ef103..1bc6011f1e 100644 --- a/xxjitserveraotcachedir/index.html +++ b/xxjitserveraotcachedir/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraotcacheignorelocalscc/index.html b/xxjitserveraotcacheignorelocalscc/index.html index 5f7a6ecf07..6ec93b7a73 100644 --- a/xxjitserveraotcacheignorelocalscc/index.html +++ b/xxjitserveraotcacheignorelocalscc/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraotcachename/index.html b/xxjitserveraotcachename/index.html index 9dc3282beb..31aeabe493 100644 --- a/xxjitserveraotcachename/index.html +++ b/xxjitserveraotcachename/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraotcachepersistence/index.html b/xxjitserveraotcachepersistence/index.html index b0aaed714b..68657a7ce2 100644 --- a/xxjitserveraotcachepersistence/index.html +++ b/xxjitserveraotcachepersistence/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveraotmx/index.html b/xxjitserveraotmx/index.html index 3187bfc591..8d198cd73b 100644 --- a/xxjitserveraotmx/index.html +++ b/xxjitserveraotmx/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserverlocalsynccompiles/index.html b/xxjitserverlocalsynccompiles/index.html index cba996ba46..a3c29fe915 100644 --- a/xxjitserverlocalsynccompiles/index.html +++ b/xxjitserverlocalsynccompiles/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserverlogconnections/index.html b/xxjitserverlogconnections/index.html index 10e776c666..9be0652a99 100644 --- a/xxjitserverlogconnections/index.html +++ b/xxjitserverlogconnections/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitservermetrics/index.html b/xxjitservermetrics/index.html index adf203d9d3..38f268d10a 100644 --- a/xxjitservermetrics/index.html +++ b/xxjitservermetrics/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitservermetricsport/index.html b/xxjitservermetricsport/index.html index 98a047420b..0aa4665c06 100644 --- a/xxjitservermetricsport/index.html +++ b/xxjitservermetricsport/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitservermetricssslkey/index.html b/xxjitservermetricssslkey/index.html index 6fff495698..2e75816eed 100644 --- a/xxjitservermetricssslkey/index.html +++ b/xxjitservermetricssslkey/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserverport/index.html b/xxjitserverport/index.html index 8736372ce7..911d35a256 100644 --- a/xxjitserverport/index.html +++ b/xxjitserverport/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitservershareromclasses/index.html b/xxjitservershareromclasses/index.html index 8eb772f9aa..30435101b3 100644 --- a/xxjitservershareromclasses/index.html +++ b/xxjitservershareromclasses/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserversslcert/index.html b/xxjitserversslcert/index.html index ba26be02cf..ffce0cc936 100644 --- a/xxjitserversslcert/index.html +++ b/xxjitserversslcert/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitservertimeout/index.html b/xxjitservertimeout/index.html index 5a58725a83..c0e82fac26 100644 --- a/xxjitservertimeout/index.html +++ b/xxjitservertimeout/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxjitserveruseaotcache/index.html b/xxjitserveruseaotcache/index.html index b4f5a5a048..c3d9087638 100644 --- a/xxjitserveruseaotcache/index.html +++ b/xxjitserveruseaotcache/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxlazysymbolresolution/index.html b/xxlazysymbolresolution/index.html index 29fe809e77..a7537974b0 100644 --- a/xxlazysymbolresolution/index.html +++ b/xxlazysymbolresolution/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxlegacyxlogoption/index.html b/xxlegacyxlogoption/index.html index b0e14cc6c0..1b6f12f938 100644 --- a/xxlegacyxlogoption/index.html +++ b/xxlegacyxlogoption/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxmaxdirectmemorysize/index.html b/xxmaxdirectmemorysize/index.html index 5c0576d2fc..bde2547d43 100644 --- a/xxmaxdirectmemorysize/index.html +++ b/xxmaxdirectmemorysize/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxmergecompileroptions/index.html b/xxmergecompileroptions/index.html index 42a0a0c8c9..022c6e675a 100644 --- a/xxmergecompileroptions/index.html +++ b/xxmergecompileroptions/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxnosuballoc32bitmem/index.html b/xxnosuballoc32bitmem/index.html index 6b23a3a47e..3b31260cbb 100644 --- a/xxnosuballoc32bitmem/index.html +++ b/xxnosuballoc32bitmem/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxonoutofmemoryerror/index.html b/xxonoutofmemoryerror/index.html index 59b6034edc..9d49ac75fc 100644 --- a/xxonoutofmemoryerror/index.html +++ b/xxonoutofmemoryerror/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxopenj9commandlineenv/index.html b/xxopenj9commandlineenv/index.html index cc3d63aa82..eb8cd5e2eb 100644 --- a/xxopenj9commandlineenv/index.html +++ b/xxopenj9commandlineenv/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxoriginaljdk8heapsizecompatibilitymode/index.html b/xxoriginaljdk8heapsizecompatibilitymode/index.html index b6d0d35cc1..0fafe1a4c5 100644 --- a/xxoriginaljdk8heapsizecompatibilitymode/index.html +++ b/xxoriginaljdk8heapsizecompatibilitymode/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxpagealigndirectmemory/index.html b/xxpagealigndirectmemory/index.html index a7a049c906..2259c265ad 100644 --- a/xxpagealigndirectmemory/index.html +++ b/xxpagealigndirectmemory/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxparallelcmsthreads/index.html b/xxparallelcmsthreads/index.html index deb8d70c97..af3b598f3e 100644 --- a/xxparallelcmsthreads/index.html +++ b/xxparallelcmsthreads/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxparallelgcmaxthreads/index.html b/xxparallelgcmaxthreads/index.html index b85b2cce85..87e056ecd6 100644 --- a/xxparallelgcmaxthreads/index.html +++ b/xxparallelgcmaxthreads/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxparallelgcthreads/index.html b/xxparallelgcthreads/index.html index 3b81ece338..50504ad5c0 100644 --- a/xxparallelgcthreads/index.html +++ b/xxparallelgcthreads/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxperftool/index.html b/xxperftool/index.html index 4a59d513e5..077823ceea 100644 --- a/xxperftool/index.html +++ b/xxperftool/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxportablesharedcache/index.html b/xxportablesharedcache/index.html index f1ac6f33e3..6b2842a315 100644 --- a/xxportablesharedcache/index.html +++ b/xxportablesharedcache/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxpositiveidentityhash/index.html b/xxpositiveidentityhash/index.html index bc0ce4b49c..9a0779fe72 100644 --- a/xxpositiveidentityhash/index.html +++ b/xxpositiveidentityhash/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxprintcodecache/index.html b/xxprintcodecache/index.html index 6562204003..1f74446446 100644 --- a/xxprintcodecache/index.html +++ b/xxprintcodecache/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxprintflagsfinal/index.html b/xxprintflagsfinal/index.html index df86fe5ac5..71d9c7c1d0 100644 --- a/xxprintflagsfinal/index.html +++ b/xxprintflagsfinal/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxreadipinfoforras/index.html b/xxreadipinfoforras/index.html index 75d2d4d00a..305dc5e2f0 100644 --- a/xxreadipinfoforras/index.html +++ b/xxreadipinfoforras/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxreducecpumonitoroverhead/index.html b/xxreducecpumonitoroverhead/index.html index c2cb4095ab..55316aa95c 100644 --- a/xxreducecpumonitoroverhead/index.html +++ b/xxreducecpumonitoroverhead/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxrequirejitserver/index.html b/xxrequirejitserver/index.html index d135b310c7..2b0138080d 100644 --- a/xxrequirejitserver/index.html +++ b/xxrequirejitserver/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxruntimeinstrumentation/index.html b/xxruntimeinstrumentation/index.html index 06f50dfa10..66d1a7c1a2 100644 --- a/xxruntimeinstrumentation/index.html +++ b/xxruntimeinstrumentation/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxsethwprefetch/index.html b/xxsethwprefetch/index.html index 26b00e237f..be6f3a4c4b 100644 --- a/xxsethwprefetch/index.html +++ b/xxsethwprefetch/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshareanonymousclasses/index.html b/xxshareanonymousclasses/index.html index 7e6b8f3b7e..ec8ef22423 100644 --- a/xxshareanonymousclasses/index.html +++ b/xxshareanonymousclasses/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshareclassesenablebci/index.html b/xxshareclassesenablebci/index.html index b49e5391e8..2a24cc47b1 100644 --- a/xxshareclassesenablebci/index.html +++ b/xxshareclassesenablebci/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxsharedcachehardlimit/index.html b/xxsharedcachehardlimit/index.html index 291883c293..a83d657646 100644 --- a/xxsharedcachehardlimit/index.html +++ b/xxsharedcachehardlimit/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshareorphans/index.html b/xxshareorphans/index.html index 7fe23b3718..eb22f0a601 100644 --- a/xxshareorphans/index.html +++ b/xxshareorphans/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshareunsafeclasses/index.html b/xxshareunsafeclasses/index.html index 6120a4dfeb..a72d5e17a2 100644 --- a/xxshareunsafeclasses/index.html +++ b/xxshareunsafeclasses/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshowcarrierframes/index.html b/xxshowcarrierframes/index.html index a097e9af0e..43364fd414 100644 --- a/xxshowcarrierframes/index.html +++ b/xxshowcarrierframes/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshowcodedetailsinexceptionmessages/index.html b/xxshowcodedetailsinexceptionmessages/index.html index bb991d4b96..83986a1a08 100644 --- a/xxshowcodedetailsinexceptionmessages/index.html +++ b/xxshowcodedetailsinexceptionmessages/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshowhiddenframes/index.html b/xxshowhiddenframes/index.html index 838d44bbc9..c6b666e1f8 100644 --- a/xxshowhiddenframes/index.html +++ b/xxshowhiddenframes/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshownativestacksymbols/index.html b/xxshownativestacksymbols/index.html index b8a8a2c159..b449121806 100644 --- a/xxshownativestacksymbols/index.html +++ b/xxshownativestacksymbols/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxshowunmountedthreadstacks/index.html b/xxshowunmountedthreadstacks/index.html index 2d143db119..31cfd3e3f1 100644 --- a/xxshowunmountedthreadstacks/index.html +++ b/xxshowunmountedthreadstacks/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxstacktraceinthrowable/index.html b/xxstacktraceinthrowable/index.html index f8b85ed9fc..35c4138119 100644 --- a/xxstacktraceinthrowable/index.html +++ b/xxstacktraceinthrowable/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxtransparenthugepage/index.html b/xxtransparenthugepage/index.html index 26637bbc6b..95b8475a91 100644 --- a/xxtransparenthugepage/index.html +++ b/xxtransparenthugepage/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusecompressedoops/index.html b/xxusecompressedoops/index.html index e95c29bd5c..ded31c03d3 100644 --- a/xxusecompressedoops/index.html +++ b/xxusecompressedoops/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusecontainersupport/index.html b/xxusecontainersupport/index.html index 3f7b19cabd..caccecdd3e 100644 --- a/xxusecontainersupport/index.html +++ b/xxusecontainersupport/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusegcstartuphints/index.html b/xxusegcstartuphints/index.html index 3278457e79..996389fd96 100644 --- a/xxusegcstartuphints/index.html +++ b/xxusegcstartuphints/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusejitserver/index.html b/xxusejitserver/index.html index 84686b60b7..e8005812b1 100644 --- a/xxusejitserver/index.html +++ b/xxusejitserver/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusenogc/index.html b/xxusenogc/index.html index 57aae3bf8f..28ed46da36 100644 --- a/xxusenogc/index.html +++ b/xxusenogc/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxusezlibnx/index.html b/xxusezlibnx/index.html index a856be923f..0c5b73b6a9 100644 --- a/xxusezlibnx/index.html +++ b/xxusezlibnx/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxutfcache/index.html b/xxutfcache/index.html index 1c70d0d797..b5539918a9 100644 --- a/xxutfcache/index.html +++ b/xxutfcache/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxverboseverification/index.html b/xxverboseverification/index.html index e8561eba45..84e5ac712e 100644 --- a/xxverboseverification/index.html +++ b/xxverboseverification/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xxvmlockclassloader/index.html b/xxvmlockclassloader/index.html index 68f4bd0821..c3b282eb54 100644 --- a/xxvmlockclassloader/index.html +++ b/xxvmlockclassloader/index.html @@ -5465,6 +5465,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +
  • diff --git a/xzero/index.html b/xzero/index.html index 4c860f0f57..9ce19e7189 100644 --- a/xzero/index.html +++ b/xzero/index.html @@ -5467,6 +5467,27 @@ +
  • + + + + + -Xrunjdwp + + + + +
  • + + + + + + + + + +