不知道你有没有发现,Java面试中总是爱考察JVM虚拟机。原因是Java程序本质上都是运行在JVM之上的,没有JVM虚拟机,也就没有Java语言的执行环境。
但在理解JVM方面,却并不容易。比如可能会遇到这些问题:
1、很多现象光看Java代码你是得不到正确答案的,所以需要你去深入学习字节码。比如为什么说new不是原子操作,它在Java代码层面只是一句代码。那如果你看得懂字节码你就会发现,new对应的字节码指令是3-4条,所以不是原子操作,所以DCL需要加synchronized。
2、有些现象看字节码还得不到正确答案,你需要去看openjdk源码。比如加不加volatile,字节码层面没有做指令重排,那JVM是如何知晓我操作的是volatile修饰的变量呢,这个答案只能看openjdk源码才能得到。但是openjdk是c、c++、汇编编写的,很多程序员这三门语言没学过或者不过关,所以看openjdk源码就是一种折磨了。
3、openjdk是运行在操作系统之上的,那在实现过程中调用了很多操作系统提供的api。比如重量级锁,比如epoll……如果c、c++都不过关,那操作系统api层面基本是没法学的,这又是一层瓶颈。
4、操作系统是基于CPU提供的机制实现的,比如段页、中断、锁、屏障……如果汇编、c不过关,操作系统也没法学,所以内存屏障很难讲清。
在实际面试中,除了对JVM的要有一个深度的理解,还需要时刻关注的就是JVM调优。根据下图,我们可以很清楚的看到JVM调优在整个性能调优层次的位置。调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm的调优也不例外,jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。
对于平时一直CRUD,连服务器都没怎么碰过的小伙伴来说,假如被问到了JVM调优,就很难轻松应对了。
对于上面提到的困境,我们可以先明确调优调的是什么,是内存大小。那如何确定内存大小呢?拿堆区来说,堆区存放的都是对象,所以我们需要知道一些大对象的真实大小,那如何计算对象大小?百度搜到一些帖子讲得复杂而且不全面。这里再补充一点,JDK6以后引入了一种新的技术:指针压缩,这项技术对技术对象大小又有一定的影响,影响是怎样的呢?这项新技术的实现原理是什么呢?
也许你对JVM调优实战的问题还是还有很多方面疑惑,6月11日-6月12日在这节亿级流量秒杀电商系统实战课中你都可以找到答案,限时秒杀0元,扫码海报二维码进群即刻购课。
JVM性能调优需要全盘考虑各方面的影响,本次课程将领你熟悉以下基础理论和原则:
1、了解jvm 垃圾收集器
2、学会使用vm 性能监控常用工具
3、教你读懂gc日志
4、理解jvm调优在解决性能问题方面的局限
在此次课程中,将会从以下步骤开始JVM调优实战:
记录日志
对程序进行性能监控
根据日志和性能监控数据修改程序
使用专业工具通过不同的JVM参数进行压测并获得最佳配置
课程结束后,你将可以掌握:
深入了解JVM调优,熟练使用监控和分析工具,具备GC调优实战能力;
了解Java程序是如何被执行且优化,提升编程效率;
接轨核心工程师调优技能,斩获企业级性能调优解决方案;
Java 性能调优对于每一个奋战在开发一线的技术人来说是老生常谈的问题了。随着系统访问量的增加、代码的臃肿,各种性能问题便会层出不穷,所以掌握好性能调优将会让目前的工作事半功倍。进群购课,和更多的开发小伙伴一起学习吧。