很多人应该都和我有一样的想法,每天CRUD就完了,学习JVM 堆、栈、方法区、程序计数器、执行引擎、标记清除算法、复制算法、标记整理算法、分代回收算法等等等等,这些东西在实际开发中又有什么用呢?
学之前,百思不得其解,但因为面试需要,又不得不学,随着课程的深入,我渐渐有些明白了,先总结如下:
1、学习JVM能更深入的理解Java这门语言,能理解Java语言底层的执行过程,很多时候要解决一个问题必须深入到字节码层次去分析,才能得到准确的结论,而字节码就是JVM的一部分。
2、学习JVM,为了项目上线后去排查一些程序log日志中无法呈现的问题,比如内存溢出、GC太过频繁导致的高延迟问题,这时候就需要去看GC日志了,如果你连GC日志是什么都不知道的话,又怎么去排查呢?看GC日志,就得知道什么是年轻代、老年代、伊甸园区、survivor区、元数据区等等内存模型的概念及其特点。懂了这些还得知道GC的时候为什么会导致高延迟呢,这时候让我想到了各种回收算法的优劣势,高延迟时,是不是调整一些参数就可以了呢?
3、能够利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以辅助你观察Java应用在运行时堆的布局情况,由此你可以通过调整JVM相关参数提高Java应用的性能。
4、比如用JMeter测试程序高并发时的性能问题,需要了解 请求响应时间,吞吐量,CPU占用率,内存使用率,这些东西是不是也和JVM有关呢,比如是不是少声明一些全局变量,少声明一些存在时间长的大变量(比如全局缓存的hashmap),内存占用率就能低很多了呢?
以上的种种都与JVM息息相关,现在用不上,不代表以后用不上,不代表面试官不会问,虽然你没用过,但是面试官的问题你都能答的面面俱到,岂不美哉。
一句话,学,就完了。
伟大的牛逼之前总是傻逼式的坚持。
往期精彩内容:
【全栈最全Java框架总结】SSH、SSM、Springboot