oracle/graal · error · UnsupportedOperationException

size() is not supported for performance reasons

Error message

size() is not supported for performance reasons

What it means

NodeMap is a fixed array indexed by node id, so it does not maintain an element count; size() would either require expensive bookkeeping or return a misleading number (array capacity). It therefore throws UnsupportedOperationException('size() is not supported for performance reasons'). Use capacity() for the backing array length, or track counts yourself if you need cardinality.

Source

Thrown at compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/graph/NodeMap.java:125

        values[getNodeId(node)] = value;
    }

    public void setAndGrow(Node node, T value) {
        checkAndGrow(node);
        set(node, value);
    }

    /**
     * @param i
     * @return Return the key for the entry at index {@code i}
     */
    protected Node getKey(int i) {
        return graph.getNode(i);
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException("size() is not supported for performance reasons");
    }

    public int capacity() {
        return values.length;
    }

    public boolean isNew(Node node) {
        return getNodeId(node) >= capacity();
    }

    private boolean check(Node node) {
        assert node.graph() == graph : String.format("%s is not part of the graph", node);
        assert !isNew(node) : "this node was added to the graph after creating the node map : " + node;
        assert node.isAlive() : "this node is not alive: " + node;
        return true;
    }

    @Override

View on GitHub (pinned to a66e9ccd1d)

Solutions

  1. Track the number of meaningful entries in a separate counter updated wherever you call set().
  2. Use map.capacity() when you actually need the array dimension, not the entry count.
  3. Snapshot into a HashMap when interoperating with Map-based APIs: copy entries for nodes you care about, then call size() on that.

Example fix

// before
int entries = map.size(); // throws

// after
int entries = 0;
for (int i = 0; i < map.capacity(); i++) {
    if (map.get(map.getKey(i)) != null) entries++; // or maintain a counter at set() sites
Defensive patterns

Strategy: validation

Validate before calling

// never call map.size(); use capacity() for array length and your own counter for entries
int backingLength = map.capacity();

Prevention

When it happens

Trigger: Calling nodeMap.size() directly, or passing a NodeMap where Map-shaped APIs call size(): logging helpers, toString implementations, assertion libraries, or generic utility methods typed against java.util.Map.

Common situations: Refactoring code from HashMap<Node,T> to NodeMap for speed and forgetting to remove size()-based logic. Debug output that prints map sizes. Test assertions comparing entry counts.

Related errors


AI-assisted analysis of oracle/graal@a66e9ccd1d (2026-08-14). Data as JSON: /api/errors/dd4eb65dbee9133a. Report an issue: GitHub.