For me it's mostly the unpredictability of the garbage collector and it's magic ability to suffer cascading failures in cases you thought you'd properly loadtested...
Perhaps billG and I are thinking on different levels...
For me it's mostly the unpredictability of the garbage collector and it's magic ability to suffer cascading failures in cases you thought you'd properly loadtested...
Perhaps billG and I are thinking on different levels...
That's hardly unique to Java. If you crash your processes because you didn't design your application to scale to your needs, there's not much the language can do about that.
Well, Java’s GCs are the state of the art. If they can’t deal with the amount of garbage a program creates than nothing can.
As for the rest: Which may or may not be the correct response depending on use-case. The JVM gives you the freedom to choose the approach you want. The default G1 GC for example has the target pause time setting where you can set whether you would want lower latency or higher throughput.
As I understand a particularly bad traffic jam in the early internet is what motivated congestion control in TCP. As a matter of a fact traffic is also an example of this phenomenon playing out without any (effective) compensating measures.
I find "Metastable failures in distributed systems" [1] to be a really interesting and accessible exploration of the problem.
[1]: https://sigops.org/s/conferences/hotos/2021/papers/hotos21-s...