https://en.wikipedia.org/wiki/Real_time_Java
https://www.aicas.com/cms/sites/default/files/rtsj-next-gen-...
http://www.ibm.com/developerworks/java/library/j-devrtj1/ind...
Languages don't have unpredictable runtime characteristics, only specific language runtimes have unpredictable language characteristics. One could replace the standard .NET runtime GC with a hard realtime GC, and .NET would then have more predictable runtime characteristics than C and C++.
https://en.wikipedia.org/wiki/Oberon_(operating_system)
http://wiki.osdev.org/Go_Bare_Bones
If I am able to write an OS using just the language, with the help of some Assembly, or bootstrap the language and runtime, it is a systems language.
Many of the criteria people use to judge systems languages like inline assembly, would disqualify C when applied to a pure ANSI C compliant compiler without language extensions.
You don't want the GC to mess with your lovely data structure?
Allocate on the stack, as a global static or let the GC know not to touch it.
Check Algol-68RS, Mesa/Cedar, Modula-2+, Modula-3, Oberon, Oberon-2, Active Oberon, Oberon-07.
Whether a particular language makes that nice enough to be more worth using than a non-GC language is another question.
This is only true of specific GC implementations. Incremental GCs never pause the program. On-the-fly and realtime GCs pause the program for a few microseconds.
[1] https://www.netbsd.org/gallery/presentations/mbalmer/fosdem2...