Jittery is the first (research) work on understanding and detecting performance bugs in just-in-time (JIT) compilers.
Our work was published at OOPSLA'26. This repository contains: (a) crawler that we used to obtain the raw data for the study (here), (b) data we collected after manual inspection and used in our empirical study (here), and (c) list of bugs discovered by our tool (Jittery) in Oracle JIT compilers (here). (Note that the tool itself, which relies on LeJit is currently not avaialble.)
The crawler fetches raw bug reports from public trackers and writes it to a local JSONL file for later analysis.
The crawler is available in empirical/script/crawler.py.
- Python 3.9+ (3.10/3.11 recommended)
Install Python dependencies:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt| Engine | Tracker | API |
|---|---|---|
| HotSpot | bugs.openjdk.org |
JIRA REST API |
| Graal | github.com/oracle/graal |
GitHub Search API |
| SpiderMonkey | bugzilla.mozilla.org |
Bugzilla REST API |
Run from repo root:
python empirical/script/crawler.py --engine <engine> --query <query> [--offset N] [--max_limit N]Arguments:
| Argument | Description | Default |
|---|---|---|
--engine |
hotspot, graal, spidermonkey |
— |
--query |
Query preset (jit-perf) or custom:... |
— |
--offset |
Pagination offset | 0 |
--max_limit |
Maximum number of results to fetch | 500 |
Each engine has a jit-perf preset that reproduces the queries documented in empirical/data/queries.md (V8 issue tracker does not support public API access, please refer the documentation for the query we use and view it on the website).
# Preset JIT performance bugs
python empirical/script/crawler.py --engine [hotspot|graal|spidermonkey] --query jit-perf
# HotSpot with custom JQL
python empirical/script/crawler.py --engine hotspot --query "custom:<JQL>"
# Graal with custom GitHub search
python empirical/script/crawler.py --engine graal --query "custom:repo:oracle/graal is:issue label:performance"
# SpiderMonkey with custom Bugzilla params (JSON)
python empirical/script/crawler.py --engine spidermonkey --query 'custom:{"product":"Core","component":"JavaScript Engine: JIT","resolution":"FIXED"}'On success, the crawler writes:
- Raw JSONL:
empirical/script/raw_data/<engine>_<query>_<offset>_<end>_bugs.jsonl- Each line is one JSON object of a bug report.
- Logs:
empirical/script/.log/<timestamp>.log
empirical/data/ holds CSV datasets used in the empirical study:
| Engine | CSV dataset |
|---|---|
| HotSpot | empirical/data/HotSpot.csv |
| Graal | empirical/data/Graal.csv |
| V8 | empirical/data/V8.csv |
| SpiderMonkey | empirical/data/SpiderMonkey.csv |
empirical/data/ALL.yml holds the unified
dataset for the empirical study.
In bugs/ we provide minimal Java programs that can be used to
reproduce bugs that we detected with Jittery.
| Bug ID | Java reproducer | Bug report |
|---|---|---|
| JDK-8345766 | bugs/JDK-8345766.java |
JDK-8345766 |
| JDK-8346989 | bugs/JDK-8346989.java |
JDK-8346989 |
| JDK-8349364 | bugs/JDK-8349364.java |
JDK-8349364 |
| JDK-8349401 | bugs/JDK-8349401.java |
JDK-8349401 |
| JDK-8349452 | bugs/JDK-8349452.java |
JDK-8349452 |
| JDK-8350494 | bugs/JDK-8350494.java |
JDK-8350494 |
| JDK-8350720 | bugs/JDK-8350720.java |
JDK-8350720 |
| JDK-8353638 | bugs/JDK-8353638.java |
JDK-8353638 |
| Graal-10565 | bugs/Graal-10565.java |
Graal-10565 |
| Graal-10609 | bugs/Graal-10609.java |
Graal-10609 |
| Graal-10776 | bugs/Graal-10776.java |
Graal-10776 |
If you use this artifact in your work or you end up exploring topics related to performance of JIT compilers, please cite:
@inproceedings{yi26understanding,
author = {Yi, Zijian and Ding, Cheng and Shi, August and Gligoric, Milos},
title = {Understanding and Finding {JIT} Compiler Performance Bugs},
booktitle = {International Conference on Object-Oriented Programming Systems, Languages, and Applications},
note = {To appear},
year = {2026},
}