Coverage ledger — Java (Section G, process-runtime)
Chapter: java.md — Java: Language Semantics, Standard Library, Process APIs, and Subprocesses.
Scope: Java SE 25 (current Oracle JDK LTS) — JLS SE 25 + JDK 25 API Javadoc +
java command manual + JEPs; HotSpot/OpenJDK reference implementation (jdk-25+36
source) on Linux as substrate; POSIX deltas labeled; Windows brief. All sources
retrieved 2026-10-13.
Sources: docs.oracle.com Java SE 25 API specification; JLS SE 25
(docs.oracle.com/javase/specs/jls/se25); JDK 25 java command manual
(docs.oracle.com/en/java/javase/25/docs/specs/man/java.html); OpenJDK JEPs
(openjdk.org); OpenJDK jdk-25+36 source (github.com/openjdk/jdk); man7.org man-pages
exit(3). Per-row reference in the table.
Status definitions: documented = explanation exists in the chapter, required
examples present, and the cited reference supports the claim; researched = verified
but minimal exposition; source-limited = a named primary source was unreachable or
the platform docs are silent (behavior stated and labeled, never invented);
not-started = row reserved but not covered.
Layout map: §1 → PL-JV-001–013 · §2 → PL-JV-014–045 · §3 → PL-JV-046–056 · §4 → PL-JV-057–063 · §5 → PL-JV-064–074 · §6 → PL-JV-075–080.
Rollup: Inventoried: 80 / Documented: 78 / Remaining: 0 / Source-limited: 2
| ID | Language/API or behavior | Canonical signature | Documentation path | Authoritative reference | Version/platform scope | Status |
|---|---|---|---|---|---|---|
| PL-JV-001 | Checked vs unchecked exception classes (exact definition) | — | ./java.md §1.3 | JLS SE 25 §11.1.3, docs.oracle.com/javase/specs/jls/se25/html/jls-11.html | Java SE 25, all platforms | documented |
| PL-JV-002 | Compile-time checked-exception checking (catch-or-declare; never-thrown catch error) | — | ./java.md §1.3 | JLS SE 25 §11.2 (jls-11.html) | Java SE 25 | documented |
| PL-JV-003 | Overload resolution: strict → loose (boxing) → variable-arity phases; most specific wins | — | ./java.md §1.2 | JLS SE 25 §15.12.2 (jls-15.html) | Java SE 25 | documented |
| PL-JV-004 | try/finally abrupt-completion rules; finally return/throw discards in-flight outcome | — | ./java.md §1.4 | JLS SE 25 §14.20.2 (jls-14.html) | Java SE 25 | documented |
| PL-JV-005 | try-with-resources: reverse-order close, non-null skip, close-exception suppression | — | ./java.md §1.5 | JLS SE 25 §14.20.3 (jls-14.html) | Java SE 25 (25 adds VariableAccess/_ resources) | documented |
| PL-JV-006 | Suppressed-exception retrieval | public final Throwable[] getSuppressed() | ./java.md §1.5, §2.7 | JDK 25 Javadoc, java/lang/Throwable.html#getSuppressed() | Java SE 7+ (verified on JDK 25) | documented |
| PL-JV-007 | Autoboxing identity cache −128..127; -XX:AutoBoxCacheMax raises upper bound | — | ./java.md §1.6 | jdk-25+36 Integer.java (IntegerCache low = -128); Integer.valueOf contract | JDK 25 HotSpot | documented |
| PL-JV-008 | Unboxing null → NPE; numeric conditional unboxes (null operand NPEs) | — | ./java.md §1.6 | JLS SE 25 §5.1.8 (jls-5.html), §15.25.2 (jls-15.html) | Java SE 25 | documented |
| PL-JV-009 | Class initialization triggers, superclass-first order, declaring-class rule, textual order under init lock | — | ./java.md §1.7 | JLS SE 25 §12.4.1/§12.4.2 (jls-12.html) | Java SE 25 | documented |
| PL-JV-010 | Object.finalize still present in JDK 25, deprecated since 9 forRemoval | protected void finalize() throws Throwable | ./java.md §1.8 | JDK 25 Javadoc, java/lang/Object.html#finalize() | JDK 25, all platforms | documented |
| PL-JV-011 | Finalization deprecation-for-removal program; runFinalization deprecated for removal | — | ./java.md §1.8 | JEP 421 (Delivered 18), openjdk.org/jeps/421; Runtime.html#runFinalization() | JDK 18+ | documented |
| PL-JV-012 | Cleaner as the sanctioned post-GC cleanup mechanism | public static Cleaner create() / public Cleanable register(Object obj, Runnable action) | ./java.md §1.8, §2.7 | JDK 25 Javadoc, java/lang/ref/Cleaner.html | Java SE 9+ (verified JDK 25) | documented |
| PL-JV-013 | Thread termination via uncaught-exception handler; JLS program-exit doors (5 situations) | — | ./java.md §1.9, §3.7 | JLS SE 25 §12.8 (jls-12.html) | Java SE 25 | documented |
| PL-JV-014 | System.exit — initiates shutdown sequence, blocks indefinitely, never returns/throws | public static void exit(int status) | ./java.md §2.1, §3.3 | JDK 25 Javadoc, java/lang/System.html#exit(int) | Java SE 25 | documented |
| PL-JV-015 | Runtime.exit — serialized; self-deadlock when called from a hook | public void exit(int status) | ./java.md §2.1, §3.3 | JDK 25 Javadoc, java/lang/Runtime.html#exit(int) | Java SE 25 | documented |
| PL-JV-016 | Runtime.halt — immediate, no shutdown sequence | public void halt(int status) | ./java.md §2.1, §3.4 | JDK 25 Javadoc, java/lang/Runtime.html#halt(int) | Java SE 25 | documented |
| PL-JV-017 | addShutdownHook — registers unstarted thread; IAE duplicate/running hook, ISE after sequence begun | public void addShutdownHook(Thread hook) | ./java.md §2.1, §3.5 | JDK 25 Javadoc, java/lang/Runtime.html#addShutdownHook(java.lang.Thread) | Java SE 25 | documented |
| PL-JV-018 | removeShutdownHook — false if unregistered; ISE after sequence begun | public boolean removeShutdownHook(Thread hook) | ./java.md §2.1 | JDK 25 Javadoc, java/lang/Runtime.html#removeShutdownHook(java.lang.Thread) | Java SE 25 | documented |
| PL-JV-019 | Thread start (second start → IllegalThreadStateException) and interruptible join | public void start() / public final void join(long millis) throws InterruptedException | ./java.md §2.2, §6.1 | JDK 25 Javadoc, java/lang/Thread.html#start(), #join(long) | Java SE 25 | documented |
| PL-JV-020 | Interrupt semantics: wait/sleep/join → InterruptedException + status cleared; NIO channel → ClosedByInterruptException; else status set | public void interrupt() | ./java.md §2.2, §6.1 | JDK 25 Javadoc, java/lang/Thread.html#interrupt() | Java SE 25 | documented |
| PL-JV-021 | Daemon status: must precede start; virtual threads always daemon | public final void setDaemon(boolean on) | ./java.md §2.2, §6.1 | JDK 25 Javadoc, java/lang/Thread.html#setDaemon(boolean) | Java SE 25 (VT clause since 21) | documented |
| PL-JV-022 | Uncaught-exception handler installation (thread-specific + default) | public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh) / public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh) | ./java.md §2.2, §3.6 | JDK 25 Javadoc, java/lang/Thread.html#setUncaughtExceptionHandler(…), #setDefaultUncaughtExceptionHandler(…) | Java SE 5+ | documented |
| PL-JV-023 | Handler chain: thread-specific → ThreadGroup → default (ThreadGroup may forward) | public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() / void uncaughtException(Thread t, Throwable e) | ./java.md §2.2, §3.6 | JDK 25 Javadoc, java/lang/Thread.html#getUncaughtExceptionHandler(), Thread.UncaughtExceptionHandler.html | Java SE 5+ | documented |
| PL-JV-024 | Virtual-thread builder and predicate | public static Thread.Builder.OfVirtual ofVirtual() / public final boolean isVirtual() | ./java.md §2.2 | JDK 25 Javadoc, java/lang/Thread.html#ofVirtual(), #isVirtual() | Java SE 21+ | documented |
| PL-JV-025 | ProcessBuilder constructors — command list stored by reference, not copied | public ProcessBuilder(List<String> command) / public ProcessBuilder(String... command) | ./java.md §2.3, §5.1 | JDK 25 Javadoc, java/lang/ProcessBuilder.html | Java SE 5+ | documented |
| PL-JV-026 | command setters/getter — live list, validity not checked | public ProcessBuilder command(List<String> command) / public ProcessBuilder command(String... command) / public List<String> command() | ./java.md §2.3 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#command(java.util.List) | Java SE 5+ | documented |
| PL-JV-027 | Working directory; null inherits current | public ProcessBuilder directory(File directory) | ./java.md §2.3 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#directory(java.io.File) | Java SE 5+ | documented |
| PL-JV-028 | environment(): copy of current env, per-builder, no null keys/values, system-dependent modification support | public Map<String,String> environment() | ./java.md §2.3, §5.1 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#environment() | Java SE 5+ | documented |
| PL-JV-029 | redirect family (Redirect-typed + File convenience overloads, getters) | public ProcessBuilder redirectInput(ProcessBuilder.Redirect source) / redirectOutput(ProcessBuilder.Redirect destination) / redirectError(ProcessBuilder.Redirect destination) | ./java.md §2.3 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#redirectInput(…) | Java SE 5+ (File overloads 7+) | documented |
| PL-JV-030 | redirectErrorStream — merges stderr into stdout; stderr stream then null | public ProcessBuilder redirectErrorStream(boolean redirectErrorStream) | ./java.md §2.3, §5.2 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#redirectErrorStream(boolean) | Java SE 5+ | documented |
| PL-JV-031 | inheritIO — child stdio = parent’s | public ProcessBuilder inheritIO() | ./java.md §2.3 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#inheritIO() | Java SE 7+ | documented |
| PL-JV-032 | start() — spawns; IOException subtypes for not-found/denied/bad-dir/NUL arg | public Process start() throws IOException | ./java.md §2.3, §5.1 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#start() | Java SE 5+ | documented |
| PL-JV-033 | startPipeline — shell-free pipelines, stdout→stdin chaining | public static List<Process> startPipeline(List<ProcessBuilder> builders) | ./java.md §2.3, §5.1 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#startPipeline(java.util.List) | Java SE 9+ | documented |
| PL-JV-034 | Redirect constants: PIPE (default), INHERIT, DISCARD (null-file discard) | public static final ProcessBuilder.Redirect PIPE / INHERIT / DISCARD | ./java.md §2.4 | JDK 25 Javadoc, java/lang/ProcessBuilder.Redirect.html | SE 5+ (DISCARD since 9) | documented |
| PL-JV-035 | Redirect factories and accessors: from/to/appendTo; type()/file() | public static ProcessBuilder.Redirect from(File file) / to(File file) / appendTo(File file) / public abstract ProcessBuilder.Redirect.Type type() / public File file() | ./java.md §2.4 | JDK 25 Javadoc, java/lang/ProcessBuilder.Redirect.html#from(java.io.File) | Java SE 7+ | documented |
| PL-JV-036 | Process std streams — connected to child stdio; null when redirected/merged | public abstract InputStream getInputStream() / public abstract InputStream getErrorStream() / public abstract OutputStream getOutputStream() | ./java.md §2.5, §5.2 | JDK 25 Javadoc, java/lang/Process.html | Java SE 5+ (abstract since 1.0) | documented |
| PL-JV-037 | waitFor family: blocking; timeout/duration variants do NOT kill child; default impl polls exitValue | public abstract int waitFor() throws InterruptedException / public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException / public boolean waitFor(Duration duration) throws InterruptedException | ./java.md §2.5, §5.3 | JDK 25 Javadoc, java/lang/Process.html#waitFor() (Duration overload Since: 24) | SE 1.0 / 8 / 24 | documented |
| PL-JV-038 | exitValue — non-blocking poll; IllegalThreadStateException if running | public abstract int exitValue() | ./java.md §2.5, §5.3 | JDK 25 Javadoc, java/lang/Process.html#exitValue() | Java SE 1.0+ | documented |
| PL-JV-039 | destroy/destroyForcibly/isAlive/supportsNormalTermination — normal-vs-forcible is implementation-dependent | public abstract void destroy() / public Process destroyForcibly() / public boolean isAlive() / public boolean supportsNormalTermination() | ./java.md §2.5, §5.4 | JDK 25 Javadoc, java/lang/Process.html#destroy() | SE 1.0 / 8 / 8 / 9 | documented |
| PL-JV-040 | pid and handle view (toHandle may be unsupported on bare Process subclasses) | public long pid() / public ProcessHandle toHandle() | ./java.md §2.5 | JDK 25 Javadoc, java/lang/Process.html#pid() | Java SE 9+ | documented |
| PL-JV-041 | onExit — completed regardless of exit status; cancelling does not affect the Process; + info/children/descendants delegates | public CompletableFuture<Process> onExit() | ./java.md §2.5, §5.5 | JDK 25 Javadoc, java/lang/Process.html#onExit() | Java SE 9+ | documented |
| PL-JV-042 | Character-stream bridges — documented buffered-input caveat when mixing byte/char APIs | final BufferedReader inputReader() / final BufferedWriter outputWriter() / final BufferedReader errorReader() | ./java.md §2.5, §6.5 | JDK 25 Javadoc, java/lang/Process.html#inputReader() | Java SE 17+ | documented |
| PL-JV-043 | ProcessHandle navigation: current/of/pid/parent/children/descendants/allProcesses (snapshots) | public static ProcessHandle current() / public static Optional<ProcessHandle> of(long pid) / public long pid() / public Optional<ProcessHandle> parent() / public Stream<ProcessHandle> children() / public Stream<ProcessHandle> descendants() / public static Stream<ProcessHandle> allProcesses() | ./java.md §2.6, §5.6 | JDK 25 Javadoc, java/lang/ProcessHandle.html | Java SE 9+ | documented |
| PL-JV-044 | ProcessHandle lifecycle/control: onExit/destroy/destroyForcibly/isAlive/supportsNormalTermination/compareTo/equals | public CompletableFuture<ProcessHandle> onExit() / public boolean destroy() / public boolean destroyForcibly() / public boolean isAlive() / public boolean supportsNormalTermination() / public int compareTo(ProcessHandle other) | ./java.md §2.6, §5.6 | JDK 25 Javadoc, java/lang/ProcessHandle.html#onExit() | Java SE 9+ | documented |
| PL-JV-045 | Info snapshot accessors — all Optional, platform-dependent availability | Optional<String> command() / Optional<String[]> arguments() / Optional<String> commandLine() / Optional<Instant> startInstant() / Optional<Duration> totalCpuDuration() / Optional<String> user() | ./java.md §2.6 | JDK 25 Javadoc, java/lang/ProcessHandle.Info.html | Java SE 9+ | documented |
| PL-JV-046 | Launch protocol: main(String[]) → no-arg static main → instance main (JEP 512 final in 25); compact source files; source-file mode | — | ./java.md §3.1 | java command manual, docs.oracle.com/en/java/javase/25/docs/specs/man/java.html; JEP 512 (openjdk.org/jeps/512) | JDK 25 (instance main final) | documented |
| PL-JV-047 | Return from main: JVM exits only when last non-daemon thread ends; implicit-exit status unspecified (0 observed, impl) | — | ./java.md §3.2 | JLS SE 25 §12.8; sibling chapter LG-JA-001 (impl status) | Java SE 25 / HotSpot | documented |
| PL-JV-048 | System.exit full documented behavior (sequence initiation, blocking, no return/throw) | public static void exit(int status) | ./java.md §3.3 | JDK 25 Javadoc, java/lang/System.html#exit(int) | Java SE 25 | documented |
| PL-JV-049 | Runtime.exit full documented behavior (serialization; hook self-deadlock warning) | public void exit(int status) | ./java.md §3.3 | JDK 25 Javadoc, java/lang/Runtime.html#exit(int) | Java SE 25 | documented |
| PL-JV-050 | Runtime.halt documented behavior (unconditional, immediate, no sequence) | public void halt(int status) | ./java.md §3.4 | JDK 25 Javadoc, java/lang/Runtime.html#halt(int) | Java SE 25 | documented |
| PL-JV-051 | Shutdown-sequence rules: 3 triggers; hooks start in unspecified order concurrently; hook registration prohibited after start; termination freezes all threads (no finally / no UEH / no TWR close) | — | ./java.md §3.3 | JDK 25 Javadoc, java/lang/Runtime.html (class description) | Java SE 25 | documented |
| PL-JV-052 | Hook uncaught exceptions → handler then hook counts terminated; thread-safe/defensive/quick API Note; infinite-loop hook stalls shutdown forever | — | ./java.md §3.5 | JDK 25 Javadoc, java/lang/Runtime.html#addShutdownHook(java.lang.Thread) | Java SE 25 | documented |
| PL-JV-053 | Uncaught-exception default behavior: trace to stderr, thread dies (ref impl); main-thread death → exit 1 (impl); handler-install → System.exit pattern | — | ./java.md §3.6 | java/lang/Thread.UncaughtExceptionHandler.html; impl status per sibling chapter LG-JA-001 | JDK 25 / HotSpot launcher | documented |
| PL-JV-054 | Thread death ≠ process death; daemons never block shutdown; frozen at termination | — | ./java.md §3.6, §3.7, §6.1 | JLS SE 25 §12.8; Thread.html#setDaemon(boolean) | Java SE 25 | documented |
| PL-JV-055 | Exit-status int truncated to least-significant 8 bits by OS (System.exit(256) observed as 0) | — | ./java.md §3.9 | man-pages exit(3), man7.org/linux/man-pages/man3/exit.3.html | Linux/POSIX | documented |
| PL-JV-056 | Per-path termination table: main-return / System.exit / halt / signal / -Xrs / SIGKILL / hook-deadlock × (hooks, finally, finalizers, status) | — | ./java.md §3.8 | Runtime.html; java.html (-Xrs); impl rows labeled | JDK 25 + HotSpot + Linux/POSIX | documented |
| PL-JV-057 | SIGHUP/SIGINT/SIGTERM initiate shutdown hooks (JVM-installed handlers) | — | ./java.md §4.1 | java command manual (-Xrs section), docs.oracle.com/en/java/javase/25/docs/specs/man/java.html | JDK 25, non-Windows | documented |
| PL-JV-058 | No public signal-handling API exists (documented platform limitation); hooks cannot identify the signal | — | ./java.md §4.1 | java command manual; absence verified in SE 25 Javadoc index | JDK 25 | documented |
| PL-JV-059 | sun.misc.Signal internal API: handlers can’t cover VM-used signals (IAE); dispatch on a fresh MAX_PRIORITY thread, C handler returns immediately | public static synchronized SignalHandler handle(Signal sig, SignalHandler handler) throws IllegalArgumentException / public static void raise(Signal sig) throws IllegalArgumentException | ./java.md §4.2 | jdk-25+36 source, src/jdk.unsupported/share/classes/sun/misc/Signal.java (class Javadoc quoted) | JDK 25 HotSpot (jdk.unsupported; not published SE API) | documented |
| PL-JV-060 | -Xrs: no signal-mask changes / no handlers for SIGINT, SIGTERM, SIGHUP, SIGQUIT; hooks do not run on those signals; System.exit path unaffected; user code responsible for calling exit | — | ./java.md §4.3 | java command manual (-Xrs), verbatim quotes | JDK 25, all platforms | documented |
| PL-JV-061 | SIGQUIT → thread dump on HotSpot (documented negatively via -Xrs consequence “SIGQUIT thread dumps aren’t available”) | — | ./java.md §4.4 | java command manual (-Xrs consequences) | JDK 25, non-Windows HotSpot | documented |
| PL-JV-062 | libjsig / signal chaining for JNI libraries | — | ./java.md §4.4 | Oracle Troubleshooting Guide signal-chaining page — unreachable at retrieval (2026-10-13); details labeled implementation behavior | JDK 25 HotSpot | source-limited |
| PL-JV-063 | Windows console control events → hooks (CTRL_C/CLOSE/LOGOFF/SHUTDOWN), CTRL_BREAK → thread dumps; -Xrs removes handler; CTRL_CLOSE bounded grace period | — | ./java.md §4.5 | java command manual (Windows section) | JDK 25, Windows | documented |
| PL-JV-064 | ProcessBuilder creation semantics: argv array (no shell/injection layer), snapshot at spawn, reuse = double spawn, documented start() failure modes | — | ./java.md §5.1 | JDK 25 Javadoc, java/lang/ProcessBuilder.html#start() | Java SE 25 | documented |
| PL-JV-065 | Documented pipe-buffer caution: limited stdio buffers → child may block or deadlock if streams not promptly read/written | — | ./java.md §2.5, §5.2 | JDK 25 Javadoc, java/lang/Process.html (class description, verbatim quote) | Java SE 25 (all platforms) | documented |
| PL-JV-066 | Two-pipe stdout/stderr deadlock — worked example and cures (merge / concurrent drain / redirect); Linux pipe buffer ~64 KiB | — | ./java.md §5.2 | java/lang/Process.html caution; Linux/POSIX pipe(2) buffer behavior | JDK 25 + Linux/POSIX | documented |
| PL-JV-067 | waitFor family behavior: interruption throws InterruptedException, child unaffected; timeout returns false and does NOT kill; documented kill-after-timeout pattern | — | ./java.md §5.3 | JDK 25 Javadoc, java/lang/Process.html#waitFor(long,java.util.concurrent.TimeUnit) | Java SE 25 | documented |
| PL-JV-068 | exitValue poll contract (IllegalThreadStateException if running) | public abstract int exitValue() | ./java.md §5.3 | JDK 25 Javadoc, java/lang/Process.html#exitValue() | Java SE 25 | documented |
| PL-JV-069 | destroy→SIGTERM / destroyForcibly→SIGKILL on Unix; start-time guard prevents killing a reused pid | — | ./java.md §5.4 | jdk-25+36 source, ProcessHandleImpl_unix.c destroy0 (int sig = (force == JNI_TRUE) ? SIGKILL : SIGTERM;) + ProcessHandleImpl.java | JDK 25 HotSpot, Unix | documented |
| PL-JV-070 | destroy-then-observe race: isAlive may return true for a brief period after destroyForcibly (documented API Note); chain to waitFor | — | ./java.md §5.3, §5.4 | JDK 25 Javadoc, java/lang/Process.html#destroyForcibly() (API Note) | Java SE 25 | documented |
| PL-JV-071 | onExit async semantics + supervision patterns (get with timeout; allOf over onExit futures; cancel is a no-op on the process) | public CompletableFuture<Process> onExit() | ./java.md §5.5 | JDK 25 Javadoc, java/lang/Process.html#onExit(); CompletableFuture.html#allOf(…) | Java SE 9+ (JDK 25 verified) | documented |
| PL-JV-072 | ProcessHandle trees: children/descendants/allProcesses are snapshots; descendants recursive; no atomic tree-kill guarantee; Info diagnostics | — | ./java.md §5.6 | JDK 25 Javadoc, java/lang/ProcessHandle.html#descendants() | Java SE 9+ | documented |
| PL-JV-073 | Signal-killed child status reported by waitFor/exitValue: JDK API docs specify only “0 indicates normal termination” — value 128+N stated from source (WTERMSIG_RETURN = WTERMSIG + 0x80) | — | ./java.md §5.7 | jdk-25+36 source, ProcessHandleImpl_unix.c (comment: “best value to return is 0x80 + signal number”); JDK API docs silent | JDK 25 HotSpot, Unix | source-limited |
| PL-JV-074 | Virtual threads + process waiting: ProcessImpl.waitFor parks on j.u.c lock (no pinning); JEP 491 (24) removes synchronized pinning; pump threads are impl detail; POSIX vs Windows deltas | — | ./java.md §5.8, §5.9 | jdk-25+36 source, ProcessImpl.java (waitFor body); JEP 491 (openjdk.org/jeps/491); java manual (Windows) | JDK 24+/25 HotSpot | documented |
| PL-JV-075 | Shutdown-time concurrency: hooks run concurrently with live threads; must be thread-safe/defensive/quick; executor non-daemon threads keep JVM alive after main returns | — | ./java.md §6.2, §6.3 | JDK 25 Javadoc, java/lang/Runtime.html (API Note); Thread.html#setDaemon(boolean) | Java SE 25 | documented |
| PL-JV-076 | CompletableFuture supervision: allOf semantics (exceptional → CompletionException cause), get (checked) vs join (unchecked) | public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) / public T get() throws InterruptedException, ExecutionException / public T join() | ./java.md §2.7, §6.2 | JDK 25 Javadoc, java/util/concurrent/CompletableFuture.html#allOf(…) | Java SE 8+ (verified 25) | documented |
| PL-JV-077 | fd/handle ownership of Process streams: streams usable until unreferenced or closed; process not killed by GC; implementation closes unreferenced fds; no finalizers on Process; Cleaner as wrapper-level backstop (not guaranteed at termination) | — | ./java.md §6.4, §6.5 | JDK 25 Javadoc, java/lang/Process.html (class description, verbatim); java/lang/ref/Cleaner.html | Java SE 25 | documented |
| PL-JV-078 | Deadlock inventory: two-pipe, stdin overfeed, undrained+waitFor, System.exit-in-hook deadlock, hook↔service deadlock, class-init deadlock | — | ./java.md §6.6 | Runtime.html; Process.html; JLS §12.4.2 | Java SE 25 | documented |
| PL-JV-079 | Races and leaks: destroy-then-exitValue race; live environment()/command(List) mutation racing start(); descendants snapshot races; zombies until reaped; unclosed streams; ThreadLocal in pooled carriers; accidental double-spawn | — | ./java.md §6.7 | Process.html; ProcessBuilder.html; JEP 444 (thread-local guidance); Linux/POSIX zombie semantics | JDK 25 + Linux/POSIX | documented |
| PL-JV-080 | Virtual-thread scheduling effects on process supervision: waitFor parks/unmounts; synchronized no longer pins (JEP 491); java.io reworked to avoid pinning; onExit callbacks over parked platform threads | — | ./java.md §6.8 | JEP 444 (openjdk.org/jeps/444); JEP 491 (openjdk.org/jeps/491); ProcessImpl.java source | JDK 21/24+/25 | documented |
Verification notes: All signatures copied verbatim from the JDK 25 Javadoc pages
listed in the chapter References (retrieved 2026-10-13). The two source-limited rows
are stated-and-labeled limitations, not gaps: PL-JV-062 names the unreachable Oracle
Troubleshooting-Guide page; PL-JV-073 names the JDK-docs silence and cites the
jdk-25+36 source that pins the implementation value. Row count 80 = chapter coverage
ledger declaration; documented 78 + source-limited 2; remaining 0.