On Wed, 21 Oct 2026 02:26:26 GMT, Yasumasa Suenaga <[email protected]> wrote:
>> Valhalla introduced flattened value object, however SA cannot dump it into
>> heapdump e.g. `jhsdb jmap --binaryheap`.
>> Actually HeapHprofBinWriter.java has following lines. Hence the user cannot
>> check flattened object from heapdump generated by SA.
>>
>>
>> case JVM_SIGNATURE_CLASS:
>> case JVM_SIGNATURE_ARRAY: {
>> if (field.isFlat()) {
>> // FIXME - we don't handle flattened fields yet. Just treat
>> them
>> // as a null reference. See JDK-8381370.
>> writeObjectID(null);
>>
>>
>> This PR addressed it.
>>
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> Yasumasa Suenaga has updated the pull request with a new target base due to a
> merge or a rebase. The incremental webrev excludes the unrelated changes
> brought in by the merge/rebase. The pull request contains four additional
> commits since the last revision:
>
> - Re-enable HeapDumpTestWithActiveProcess.java
> - Merge branch 'master' into JDK-8381370
> - Use getFieldHolder() rather than getKlass()
> - 8381370: SA is not writing out flattened fields to the hprof file
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java
line 75:
> 73: if (bottomType instanceof InstanceKlass ||
> 74: bottomType instanceof TypeArrayKlass)
> {
> 75: writeObjectArray((ObjArray)oop,
> flatObjects);
Calls like this bypass the HeapGXLWriter override of writeObjectArray() and
similar APIs, resulting in just calling the default version in
AbstractHeapGraphWriter. HeapGXLWriter needs to be updated in the same manner
as HeapHprofBinWriter. Also, all these overridden methods in HeapGXLWriter and
HeapHprofBinW should be marked as `@Override` so this type of issue is caught
at compile time. Unfortunately we have no HeapGXLWriter tests.
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java
line 95:
> 93: if (name.equals(javaLangThread)) {
> 94: writeThread(instance,
> flatObjects);
> 95: return false;
I'm not sure why an early return is done here, but the consequence is that the
loop that drains flatObjects below is not executed, leaving references to
flattened Objects that are never written out. You might want to add a test case
for this if not too complicated.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/33395#discussion_r4342126183
PR Review Comment: https://git.openjdk.org/jdk/pull/33395#discussion_r4342179639