Database features

    Feature is an interface allowing to store and query additional information based on bytecode. Feature can be installed only upon creating the JacoDB instance.

    var db = JacoDb.async(new JcSettings()
        .useProcessJRE()
        .persistent("/tmp/compilation-db/${System.currentTimeMillis()}") // persist data
        .installFeatures(Usages.INSTANCE, InMemoryHierarchy.INSTANCE)
    ).get();

    InMemoryHierarchy

    By default, JacoDB stores information about class hierarchy in an SQL database (the ClassHierarchies table with the columns: class_id, super_id, is_interface). It allows us to retrieve the hierarchy for a particular class with a recursive SQL query. Recursive queries are rather common and rather slow.

    InMemoryHierarchy solves a performance problem of a built-in solution. It introduces a fast-search in-memory cache.

    Memory overhead is O(number of classes). For the project with about 50K classes (including runtime) memory consumption for such a cache is ~6.5 Mb of heap memory.

    Usages

    You can find places where methods and fields are used. For better performance, install InMemoryHierarchy.

    var db = JacoDb.async(new JcSettings()
        .useProcessJRE()
        .persistent("/tmp/compilation-db/${System.currentTimeMillis()}") // persist data
        .installFeatures(Usages.INSTANCE, InMemoryHierarchy.INSTANCE)
    ).get();
    var method = run; // java.lang.Runnable#run method
    var field = field; // java.lang.String#value field
    var cp = db.asyncClasspath(allClasspath).get();
    cp.findUsages(method); // sequence of methods which calls method
    cp.findUsages(field, FieldUsageMode.READ); // sequence of fields which reads field value

    The Usages indexer goes through all instructions, collects information on method calls or field access, and stores it in a table:

    Column nameColumn description
    callee_class_symbol_ida unique identifier for the callee class name
    callee_name_symbol_ida method/field name unique identifier
    callee_desc_hashnull for field usage; Sip hash of method bytecode, description for methods
    opcodeinstruction operation code
    caller_class_symbols_ida unique identifier for the caller class name
    caller_method_offsetsmethod numbers for this usage
    location_ida location identifier