“手中无剑,与有剑不用,从来不是一回事”,这是钱学森与郭永怀准备回国时对话中的一句话,因为记忆深刻,所以拿了过来。于Java而言,这个剑是什么呢?就是JVM!
想深入学习JVM或者尝试过深入学习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的程度,所以带来的现象就是PPT讲师、概念讲师……那有没有例外呢?接着往后看。
说到学习JVM,我给大家推荐的是鲁班学院的子牙老师。为什么呢?就一点,他手写过JVM!他也是凭借着自己手写的JVM免面试进入了阿里云中间件团队。这就是实力最好的证明。所以说,他对JVM的理解是颗粒级的,小到Java中的this指针是何时赋值的,大到JVM三大子系统:内存模型、执行引擎、类加载器是如何协同工作的。在跟他的交流过程中能感觉到他对JVM中很多知识点的独到见解,而且听他说他是以学员学完他的JVM能达到手写的程度为思路来安排学习节奏的。你能想象某一天你能手写一个JVM吗?你写的Java程序运行在你自己写的JVM上。
说到JVM就不得不提JVM调优,这块知识点也在面试中不断兴起。很多小伙伴的认知中是这样的:我把程序编写好丢到服务器上也能正常运行,也没出现OOM,为什么要调优呢!那是因为你们公司的业务并发量太小了,如果一个亿级流量秒杀系统交给你,你要不要做调优呢?并发量如此大的系统如果不做调优会出现什么问题呢?full gc、OOM……
那怎么调优呢?首先要明确,调优调的是什么,是内存大小。那如何确定内存大小呢?拿堆区来说,堆区存放的都是对象,所以我们需要知道一些大对象的真实大小,那如何计算对象大小你知道吗?是不是很多小伙伴从来没想过这个问题?那有些研究过发现没有资料讲这一块,百度搜到的帖子都讲得极其复杂而且不全面。这里再补充一点,jdk6以后引入了一种新的技术:指针压缩,这项技术对技术对象大小又有一定的影响,那有什么样的影响呢?这项新技术的实现原理是什么呢?
那在子牙老师的课上,对于这些疑问,他做了最全面最深刻的解答,其实远远不止这些疑问,还有其他硬核知识。是不是有点小期待了呢?开课时间5月29-5月30日晚20:00,详情参见海报。
点击阅读原文也可直接购课~
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。