JVM的学习总结---《我的Java打怪日记》

工作中使用Java已有5年的时间,在这期间各种Java开源框架不断更新,每次在学习新技术框架的时候总有种不知从何下手的感觉,后来慢慢地意识到一直重复项目的CRUD对自己的技术能力并没有多少提高,后来逐渐意识到是因为自己的底层知识的原理掌握得不牢固,对于Java研发工程师而言,JVM当然是核心,所以基于此开始了JVM的学习之路。

一、初识JVM
在大学期间通过《Java程序设计语言》这门课,学习了Java语言本身,当时对Java的认知仅限于此,现在看来,当时的技术视野还是过于狭窄。由于JVM本身的抽象性,导致自己当时没有过多关注JVM的底层细节。当时对JVM的认识仅仅停留在宏观的认识,只记住了“Write once,Run anywhere!”,写的Java程序通过JVM可以跨平台运行,至于为什么能做到跨平台,认识尚浅。

二、JVM的进阶认识

真正开始关注JVM是工作两年之后,主要从为什么要JVM调优,如何判断要进行JVM调优,如何调优三个方面进行阐述。
1)为什么要调优
对于用户量、并发量、数据量不是特别大的系统,可能主要关注点在业务逻辑的实现,对系统的性能指标,如:响应时间、QPS、CPU/内存占用率等不会过多地关注,但是对于c端的互联网产品来讲,这些性能指标是至关重要的,一个优化之后的系统可能给公司带来巨大的经济效益。随着移动互联网的兴起,数据量,并发量大幅增加,如果不对系统的性能监控并优化,注定这个系统会出现意想不到的故障,降低用户体验。
不管是Spring/SpringMVC/Hibernate的组合,还是Spring/SpringMVC/Mybatis的组合,甚至是现在的SpringBoot与其他框架的整合,这些应用层面的框架,底层还是基于JVM运行,这些年涌现的各种框架看似提升了研发工程师的开发效率,但是底层的JVM才是开发的核心。相信大多数同学都碰到过,系统的卡顿现象,通常的做法是重启项目来解决,但是过一段时间之后又出现卡顿现象,然后再重启,这样的操作也行,可是对于研发工程师来讲,这个时候应该思考出现卡顿背后的深层次原因,是JVM堆栈大小设置得不合理,还是GC算法选择不合理导致,那就要去深入理解JVM的各个部分的运行逻辑。

 2)如何判断要进行JVM调优
 除了上述系统卡顿,如果通过监控程序发现Java应用的CPU周期性地飙得非常高,或者日志报错OOM、栈溢出等等错误,这时候就要考虑对JVM进行调优。
 早期我在项目中用JDK自带的监控程序jvisualvm,还有商业版的jProfiler监控程序的CPU/内存占用情况,后来使用阿里的Arthas监控线上的各种项目,这些JVM工具极大地方便了我定位问题,在使用这些工具的同时,也深入学习了JVM从加载,初始化到运行的整个原理。

 3)学习JVM的经验总结
 我是结合项目中遇到的问题,在使用工具排查问题的同时,学习JVM,先整体再局部。学习的主要渠道包括:看博客、看视频资料,写总结,不断地复盘,对于JVM的各个部分逐个击破。不得不说,JVM体系很庞大,但是我们做技术的,不仅仅要学习技术本身,更重要的是深入思考里面的设计思想,只有掌握了“内力”,学习其他的技术才能融会贯通,在此我附一张目前自己总结的JVM思维导图(还在学习中...)

JVM的学习总结---《我的Java打怪日记》

道可顿悟,事需渐修!

上一篇:Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)


下一篇:基于UDT connect连接通信以及文件传输--服务端