Isolating the GC code from the jvm to run on external accelerator

Andrew Haley aph at redhat.com
Tue May 5 13:59:29 UTC 2020


On 5/5/20 1:50 PM, Ofir Gordon wrote:
> Do you maybe know any tutorial / documentation / explaination that
> describes the mechanism behind the way that the gc finds the pointers in an
> object's fields?

No. There may be, but I know of none.

> I can see that it happaens somehow by partition of the object to "chuncks"
> in the class "classLoaderData" (if I understood correctly), but I wish to
> understand the complete process.

It's not hard once you know where to look.

I put a breakpoint on InstanceKlass::oop_oop_iterate_reverse() and
then:

(gdb) p print()
com.sun.tools.javac.tree.JCTree$JCMethodDecl {0x000000080010a0f8}
 - instance size:     8
 - klass size:        122
 - access:            public synchronized
 - state:             fully_initialized
 - name:              'com/sun/tools/javac/tree/JCTree$JCMethodDecl'
 - super:             'com/sun/tools/javac/tree/JCTree'
 - sub:
 - arrays:            NULL
 - methods:           Array<T>(0x00007fff7def1648)
 - method ordering:   Array<T>(0x00007fff7f800058)
 - default_methods:   Array<T>(0x0000000000000000)
 - local interfaces:  Array<T>(0x00007fff7def0df8)
 - trans. interfaces: Array<T>(0x00007fff7def28f8)
 - constants:         constant pool [173] {0x00007fff7def07c8} for 'com/sun/tools/javac/tree/JCTree$JCMethodDecl' cache=0x00007fff7dacf5e8
 - class loader data:  loader data: 0x00007ffff04bfbf0 for instance a 'jdk/internal/loader/ClassLoaders$AppClassLoader'{0x000000008306ec38}
 - unsafe anonymous host class:        NULL
 - source file:       'JCTree.java'
 - class annotations:       Array<T>(0x0000000000000000)
 - class type annotations:  Array<T>(0x0000000000000000)
 - field annotations:       Array<T>(0x0000000000000000)
 - field type annotations:  Array<T>(0x0000000000000000)
 - inner classes:     Array<T>(0x00007fff7def2898)
 - nest members:     Array<T>(0x00007fff7f800070)
 - java mirror:       a 'java/lang/Class'{0x0000000083325bc0} = 'com/sun/tools/javac/tree/JCTree$JCMethodDecl'
 - vtable length      35  (start addr: 0x000000080010a2e8)
 - itable length      23 (start addr: 0x000000080010a400)
 - ---- static fields (0 words):
 - ---- non-static fields (13 words):
 - public 'pos' 'I' @12
 - public 'type' 'Lcom/sun/tools/javac/code/Type;' @16
 - public 'completesNormally' 'Z' @20
 - public 'mods' 'Lcom/sun/tools/javac/tree/JCTree$JCModifiers;' @24
 - public 'name' 'Lcom/sun/tools/javac/util/Name;' @28
 - public 'restype' 'Lcom/sun/tools/javac/tree/JCTree$JCExpression;' @32
 - public strict 'typarams' 'Lcom/sun/tools/javac/util/List;' @36
 - public 'recvparam' 'Lcom/sun/tools/javac/tree/JCTree$JCVariableDecl;' @40
 - public strict 'params' 'Lcom/sun/tools/javac/util/List;' @44
 - public strict 'thrown' 'Lcom/sun/tools/javac/util/List;' @48
 - public 'body' 'Lcom/sun/tools/javac/tree/JCTree$JCBlock;' @52
 - public 'defaultValue' 'Lcom/sun/tools/javac/tree/JCTree$JCExpression;' @56
 - public 'sym' 'Lcom/sun/tools/javac/code/Symbol$MethodSymbol;' @60
 - non-static oop maps: 16-16 24-60

(gdb) up
#8  OopOopIterateBackwardsDispatch<G1ScanEvacuatedObjClosure>::Table::oop_oop_iterate_backwards<InstanceKlass, unsigned int> (
    cl=0x7fff900041c0, obj=0x83962958, k=0x80010a0f8) at /local/jdk-jdk/src/hotspot/share/memory/iterator.inline.hpp:360
(gdb) up
#9  0x00007ffff5a826e8 in OopIteratorClosureDispatch::oop_oop_iterate_backwards<G1ScanEvacuatedObjClosure> (cl=0x7fff900041c0,
    obj=0x83962958, klass=0x80010a0f8) at /local/jdk-jdk/src/hotspot/share/memory/iterator.inline.hpp:425
(gdb) up
#10 0x00007ffff5a82578 in oopDesc::oop_iterate_backwards<G1ScanEvacuatedObjClosure> (this=0x83962958, cl=0x7fff900041c0)
    at /local/jdk-jdk/src/hotspot/share/oops/oop.inline.hpp:408
(gdb) call pp(this)

"Executing pp"
com.sun.tools.javac.tree.JCTree$JCMethodDecl
{0x0000000083962958} - klass: 'com/sun/tools/javac/tree/JCTree$JCMethodDecl'
 - ---- fields (total size 8 words):
 - public 'pos' 'I' @12  20847 (516f)
 - public 'type' 'Lcom/sun/tools/javac/code/Type;' @16  NULL
 (0)
 - public 'completesNormally' 'Z' @20  false
 - public 'mods' 'Lcom/sun/tools/javac/tree/JCTree$JCModifiers;' @24  a 'com/sun/tools/javac/tree/JCTree$JCModifiers'{0x0000000084aea580} (1095d4b0)
 - public 'name' 'Lcom/sun/tools/javac/util/Name;' @28  a 'com/sun/tools/javac/util/SharedNameTable$NameImpl'{0x0000000084aea0c8} (1095d419)
 - public 'restype' 'Lcom/sun/tools/javac/tree/JCTree$JCExpression;' @32  a 'com/sun/tools/javac/tree/JCTree$JCIdent'{0x0000000084aea5c0} (1095d4b8)
 - public strict 'typarams' 'Lcom/sun/tools/javac/util/List;' @36  a 'com/sun/tools/javac/util/List$1'{0x00000000820005b0} (104000b6)
 - public 'recvparam' 'Lcom/sun/tools/javac/tree/JCTree$JCVariableDecl;' @40  NULL
 (0)
 - public strict 'params' 'Lcom/sun/tools/javac/util/List;' @44  a 'com/sun/tools/javac/util/List'{0x0000000084aea788} (1095d4f1)
 - public strict 'thrown' 'Lcom/sun/tools/javac/util/List;' @48  a 'com/sun/tools/javac/util/List$1'{0x00000000820005b0} (104000b6)
 - public 'body' 'Lcom/sun/tools/javac/tree/JCTree$JCBlock;' @52  a 'com/sun/tools/javac/tree/JCTree$JCBlock'{0x0000000084aeb290} (1095d652)
 - public 'defaultValue' 'Lcom/sun/tools/javac/tree/JCTree$JCExpression;' @56  NULL
 (0)
 - public 'sym' 'Lcom/sun/tools/javac/code/Symbol$MethodSymbol;' @60  NULL
 (0)

The crucial information is the oopMap in the Klass JCTree$JCMethodDecl.

This line:

 - non-static oop maps: 16-16 24-60

... tells you that the fields at offsets 6-16 and 24-60 are oops, so must
be scanned. Any other fields in the object are ignored. If you look at the
named fields in the object, this is so.

-- 
Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671



More information about the hotspot-gc-dev mailing list