[lworld] RFR: 8303416: [lworld] Fix JVM crash at Unsafe_FinishPrivateBuffer

Xiaohong Gong xgong at openjdk.org
Thu Mar 2 09:07:29 UTC 2023


When calling Unsafe.finishPrivateBuffer(), JVM crashes with following
 assertion failure:


 Internal Error (/mnt/local/code/valhalla/src/hotspot/share/prims/unsafe.cpp:388), pid=29517, tid=29518
  assert(v->mark().is_larval_state()) failed: must be a larval value

 JRE version: OpenJDK Runtime Environment (21.0) (fastdebug build 21-internal-git-05e4d0dba)
 Java VM: OpenJDK 64-Bit Server VM (fastdebug 21-internal-git-05e4d0dba, mixed mode, compressed oops, compressed class ptrs, g1 gc, linux-aarch64)
 Problematic frame:
 V  [[libjvm.so](http://libjvm.so/)+0x1a92a64]  Unsafe_FinishPrivateBuffer+0xc0

The assertion is used to check whether the input value is in larval
 state. Usually this method is called after `Unsafe.makePrivateBuffer()`,
 which will create a new oop and set it to larval state. If everything
 works fine, the above assertion won't fail. But the issue happens if
 all the fields of the input value object of `Unsafe.makePrivateBuffer()`
 are the relative java default values (i.e. `0`). The root cause is the
 C2 compiler will optimize the new buffered oop to the default oop for
 such value object, and the larval state is missed during the optimization.
 Marking the larval bit of the optimized oop can fix the issue.

-------------

Commit messages:
 - 8303416: [lworld] Fix JVM crash at Unsafe_FinishPrivateBuffer

Changes: https://git.openjdk.org/valhalla/pull/828/files
 Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=828&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8303416
  Stats: 114 lines in 2 files changed: 108 ins; 0 del; 6 mod
  Patch: https://git.openjdk.org/valhalla/pull/828.diff
  Fetch: git fetch https://git.openjdk.org/valhalla pull/828/head:pull/828

PR: https://git.openjdk.org/valhalla/pull/828



More information about the valhalla-dev mailing list