Could you please tell some of them? thanks
- Engine management systems (e.g. timing of firing in an IC engine)
- Missile detection systems (e.g. need to react to a detection within time to activate countermeasures).
- Medical systems (e.g. timing of valve closing/opening is critical to dosage).
- Phone protocol stacks (e.g. transmitting during allocated time-slots).
- Metering systems (e.g. must read measurement devices at correct time to ensure accuracy).
- Audio systems (e.g. avoiding glitches requires deterministic processing)
...and lots, lots more.
In general, things that interact with the real physical world require deterministic control.
Nowadays partly written in Real Time Java, can gladly provide examples from military web sites.
Bear in mind that there are typically many levels to something like an ESM system, the lower levels would always be in something like C/C++/ADA (or possibly FPGA) but if Java does come into it, it would be for the UI but even that is more likely C# these days. This is not the RT level code.
real-time == deterministic, and this is what GC is not. At all times you must know what code is able to execute in order to meet worst-case deadlines.
The easiest way of managing this is to disallow any non-deterministic processes in the real-time levels of your application (this means dynamic memory allocation and by inference also GC, but it also applies to anything else).
Also bear in mind that most hard-real-time systems are also safety-related and need high-reliability. systems are expected to stay running indefinitely (or at least for years) without a reset on systems with Kilobytes of RAM.
For these types of systems you work out your worst-case load and statically allocate everything. This makes it much easier to reason about.