[汇总]JVM, OOM经验
JVM在反射代码执行的过程导致Full GC
ArrayList插入1000w条数据之后,我怀疑了jvm…
加个 -XX:+PrintGCDetails -XX:+PrintGCDateStamps,看下第一次是不是有Full GC
案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?
神奇的 perfma:一站式解决所有 JVM 疑难杂症!
JVM参数分析的链接地址:https://opts.console.perfma.com/
所以很多人在用Elasticsearch的时候就是这样的一个问题,老是觉得ES读取速度慢,几个亿的数据写入ES,读取的时候要好几秒。那能不花费好几秒吗?你要是ES集群部署的时候,给JVM内存过大,给os cache留了几个GB的内存,导致几亿条数据大部分都在磁盘上,不在os cache里,最后读取的时候大量读磁盘,耗费个几秒钟是很正常的。
所以说,针对类似Kafka、Elasticsearch这种生产系统部署的时候,应该要给JVM比如6GB或者几个GB的内存就可以了。因为他们可能不需要耗费过大的内存空间,不依赖JVM内存管理数据,当然具体是设置多少,需要你精准的压测和优化。
但是对于这类系统,应该给os cache留出来足够的内存空间,比如32GB内存的机器,完全可以给os cache留出来20多G的内存空间,那么此时假设你这台机器总共就写入了20GB的数据,就可以全部驻留在os cache里了。然后后续在查询数据的时候,不就可以全部从os cache里读取数据了,完全依托内存来走,那你的性能必然是毫秒级的,不可能出现几秒钟才完成一个查询的情况。
在我们的应用程序中,使用 Zing 的 GC 大约比使用标准 Oracle Hotspot JVM 的 GC 快 180 倍。
- 接口P99时延降低30%
- 减少Young GC和Full GC次数、停顿时长、单次停顿时长
jstat 定位 JVM 的内存问题