推荐阅读:蚂蚁三面被虐惨,原因竟是spring,jvm,mybatis,并发一窍不通
为面阿里P8,我肝了一份651个技术分支的脑图,要么?(限时领)
今天整理的这篇文章,整理自以前记录的日常笔记。
刚开始接触JVM时,对待GC的日志,是保持"逃避"态度的,线上部署的程序没有达到期望的运行效率,或是预期目标时,往往会把问题的矛头指向内存上。
是不是内存不够?
GC日志怎么这么多?占用磁盘高达几个G?
不想看到打印怎么多,甚至暴力的将程序日志屏蔽掉。
我也曾经这样干过,写过的程序,同样导致过内存溢出,甚至是主机宕机。
是的,java中的垃圾回收的确帮我们省了很多事,我们不像C/C++程序员一样,
需要考虑分配(malloc)内存分配与(free)释放内存,但我相信每个java开发的小伙伴都会遇到GC问题,无论是在程序的性能优化,还是故障分析上。
我们应该在一次又一次的失误中获得经验和教训,而不是去逃避或是草草解决问题了事。同样的知识点,回顾两次,就会产生 1 + 1 > 2 的效应 。
所以这篇文章我们来谈谈大家耳熟能详的JVM的 GC日志。
GC 日志是什么
首先来说一说GC的概念, GC 就是垃圾回收 (Garbage Collection) 的缩写。
何为垃圾?
没有任何引用指向的对象,被JVM视为垃圾。
当然,对应的判定算法有:引用计数算法、可达性分析算法。对应的回收算法有:标记清除、复制、标记整理、分代收集算法。
那GC的日志是什么呢?