Java程序是基于GC的。启动之初申请足够的内存池,再加上JIT等编译器的实时优化,速度不比直接用C++语言写的慢。同时,由于Java语言的反射性和可观察性的特点,再加上JFR这个神器,当出现问题时,比二进制文件更容易找到根源。最近在看RCA(RootCauseAnalysis),无意中发现了yCrash之类的东西。它的几个有问题的小代码非常典型。我们可以看一下Java应用的几种常见的崩溃场景。1.堆空间溢出OOM一般是内存泄漏引起的,在GC日志中有体现。一般GC时间变长,每次回收的效果都很一般。GC之后,堆内存的实际使用量呈上升趋势。下面的代码是一个无限循环,不断往HashMap中塞数据。由于myMap属于GCRoots,永远不会释放,所以它的最终结果是OOM。importjava.util.HashMap;publicclassOOMDemo{staticHashMap