《深入理解Java虚拟机》读后感

一、本书印象:

       大概是入行半年后有所闻名,对于本书的相关概念很模糊,大概只有对虚拟机中的GC垃圾回收有一点印象。真正开始接触本书也是入行八九个月,因为入行半年多换了个工作,从那时起几乎所有的技术面试都有关于虚拟机的相关概念知识的提问,从此惦记在心:在新工作岗位有空闲时间必须掌握这门技术知识!


         第一次接触的是电子档,其实有两本近似的入门参考资料,选择周志明的《深入理解Java虚拟机》主要是因为,另一本Sun公司的《深入Java虚拟机》是03年出版的,中间没有新版本的矫正和更新,而十几年的技术变革断层,技术或许已经脱节严重;而国内其他版本的虚拟机虽然有人推荐,但是都没有周的好。  后来翻阅了一下其他版本相关JVM的书籍,有些确实不太适合入门时候学习,是关于JVM设计以及实现的,还有一些深层次的调优的,没有深厚的基础经验积累很难让自己在看书的时候不头晕。 
          第一遍概览周版的《深入理解Java虚拟机》全书发觉很多东西难以理解,有些概念是没有铺垫了单刀直入,尽管作者已经使用很简化浅显的语言来解析,但是如果没有一些相关专业知识打底,一切都是纸上谈兵,拾人牙慧罢了。

  
        第二次阅读本书,是经过两个多月的恶补,主要是数据结构、并发多线程、更加简化容易理解的关于JVM的一些博客文章(如常见JVM垃圾回收算法、类加载机制、内存分配策略等),把里面的比较核心的基础概念一点点蚕食。对于一些复杂晦涩难懂的文章,个人感觉纸质版的比电子阅读资料好得多,电子阅读版本的需要比较认真的阅读才有效果,主要是每天吸纳的流量信息过于庞大,能留存下来的实在很少,往往效率也不高;而实体资料阅读的时候有出自本能的学习意识,往往能加深学习印象,反复阅读都也能深刻的记忆当中的某段话。在进行第二次阅读本书,是在工作下班以后,每天晚上看一两章,难懂的勾选出来,反复看,结合一些工作的经验也渐渐的有了明悟。
 

       第三次阅读,是工作一年多了以后,工作之余再次有时间余力,继续对第二次阅读操作进行迭代,当然这一次操作加深了相关强度,例如阅读的博客文章不再那么浅薄的、理解也不再那么片面,会挖掘一些成名的解析深刻的系统化相关技术文章阅读。从概念到实战案例,尽管还不是所有的都十分理解但是有些部分说个所以然也还是可以的。目前第三次阅读目标就是尽量的扩大范围的扫盲,理清整本书中疑难概念,为下一次的深入阅读裂解做战斗准备。

              
二、本书概述:
        这本书主要分为四部分,这四部分的知识点有五个层次:基础入门介绍;深入JVM相关设计简介;JVM核心原理;JVM拓展应用;高效并发

   第一部分:走近Java

        第一部分主要为后面Java虚拟机深入理解做的一些基础铺垫。这一部分篇章比较少,只有一章,并且似乎跟后续篇章没什么关联,大概是为了唤起读者的Java情怀,营造一种厚重的学习氛围。通过Java的JDK各个版本的演变——过去、现在和未来的发展趋势,去了解Java技术的来龙去脉,以及通过编译自己的OpenJDK实践去加深Java技术的认识。

       

   第二部分:自动内存管理机制

        自动内存管理机制,这部分不太好理解,因为里面涉及到操作系统的内存管理方面的知识,即使反复的看这本书,把本书作者的一些话理解了但是对于Java虚拟机实际工作还是没能根本的深刻把握,或许是因为自己没有相关技术积累做铺垫。
 

        在实际开发使用的第一门语言是Java,所以并没有对Java内存管理机制感到任何的诧异或者兴奋,认知中是理所当然的,但是同行的C++的程序员却说,他们实在太羡慕Java的垃圾回收机制,太羡慕我们的封装性、JVM的内存管理机制……看来当初选择Java语言还是挺不错的。
 

        从开发的一年多以来,实际开发中比较少接触需要这部分知识点的东西,更多地倾向于业务逻辑开发,至于内存泄露和溢出虽有发生,但是主程也很快找到问题所在并解决了,所以这部分只是更多时候只存在理论概念认识中,例如知道有四种垃圾回收算法、一些垃圾回收器的设计,堆-栈-方法区-运行时常量池等基本划分。但是没接触过里面的实际代码或者从根本上认识,一知半解的话跟别人让探讨也不过是五十步笑百步而已。
 

        当然再次仔细阅读了本书的这部分知识还是有很多收获的,并且这一部分的内存划分管理机制对整个Java技术能力的提升很关键。第二部分主要包括第2~5章:

       第二章  讲解了虚拟机中的内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。

      第三章  分析了几种常见的垃圾回收算法和JDK1.6中提供的几款垃圾收集器的特点以及运作原理,通过代码实例验证了Java虚拟机中的自动内存分配以及回收的主要规则。

      第四章  介绍了随JDK发布的6个命令行工具和2个可视化的故障处理工具的使用方法

      第五章  与读者分享了几个比较有代表性的实际案例,还准备了一个所有开发人员都能亲身实战的练习,读者可通过时间来获得故障处理和调优的经验。

       

    第三部分:虚拟机执行子系统

       执行子系统是JVM虚拟机必不可少的一部分,这部分的讲解比较麻烦,实际为深入解析到JVM如何执行.Java文件。第一次看这部分的内容,里面的概念贼多,很多都模模糊糊晕晕的,直到第二次第三次看才有了一点明悟(当然这种明悟也仅仅是对这个概念有个认识,找到其在Java技术中对应的映射)。

        虚拟机执行子系统的博客文章相对来说较少,似乎没那么重要,其实不然,要想深入最底层代码认识Java技术这部分是必不可少的,因为跨平台的.class字节码执行文件文件是Java原语最底层的组成(相当于汇编的作用),.class文件结构也像汇编语言一样,概念分类贼多,要想深入掌握是真正要花功夫耐心研磨的。
         有人说我不应该过早接触这么深入的东西,并且网上博客文章有很多往往是理解有误的。其实我觉得,看博客文章的时候,虽然有时候文章的理解不一定是正确的,但是无所谓对错,对于彼时的水平,只要有个概念模型就好,如果看过一篇文章你脑海中什么也没留下才真正可怕。有误解以后可以慢慢纠正,也并不是阅读过一遍以后就不会重新理解,这些知识经验往往通过理论积累到量化的增大,最后通过自己实践再转化为经验的,也从来没想到过一蹴而就。

 

       第六章  讲解了Class文件结构中各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的

方式演练了Class的数据是如何存储和访问的。

      第七章 介绍了在类加载过程的“加载”、“验证”、“准备”、“解析”和“初始化”这五个阶段中虚拟机分别执行了那些动作,还介绍了类加载机制的工作原理以及其对虚拟机的意义。

       第八章  分析了虚拟机咋执行代码时如何找到正确的方法,如何执行方法内的字节码,以及执行代码时设计的内存结构。

       第九章  通过四个类加载及执行子系统的案例,分享了使用类加载器和处理字节码的一些值得欣赏和借鉴的思路,并通过一个实战练习来加深对前面理论知识的理解。

     
       第六章的概念很多,要记忆的东西也很多,只是浏览个大概,认识到.class文件的组成以及相关原理就达到本次的目的了;第七章类加载机制是重点,比较好理解,贴近实践开发流程,过去也接触过本书的简化描述,当下再次阅读解决了当初的一些遗漏;第八章虚拟机执行引擎相对繁杂,涉及到操作系统的一些概念理解、相关运作原理,要想真正掌握这部分知识还要掌握更多的知识铺垫。第九章是案例分析,四个经典案例分析对掌握这部分知识理解很有意义,以后能力提升上来可以自己参考着写符合自己业务需求的自定义用户类加载器。

   

   第四部分:程序编译与代码优化

        第四部分的程序编译和代码优化的知识点,对于一般的程序员来说,距离有点远,基本的代码优化提升可以参考基础的改进(例如《编写高质量代码:改善Java程序的151个建议》),深层次的整体性的优化参考《重构:改善既有代码质量》等,而从根本性提升还是有一些积累才能实现的,往往通过Java语言特性以及底层虚拟机特性上面做最合适的调整。  

     第十章  分析了Java语言中的泛型、自动装箱、拆箱、边间编译等多种语法糖的前因后果,并通过实战案例延时了如何使用插入式注解处理器来实现一个检查程序命名规范的编译器插件。

     第十一章 讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果。此外,还讲解了几种常见的编译器优化技术。

       第十章不太好理解,从编译器源码实现的层次上了解Java源码编译为字节码的过程,分析Java语言中的泛型、自动装箱拆箱等多种语法糖对于没有深厚的积累理解起来很费劲,感觉像高中阶段的语文说明文阅读填空选择。即使反复看也是一脸懵。第十章是对代码编译器的优化,上面第一本书151个建议就是在这个原理上进行封装的,第十章是对代码在运行期的优化,这两章对于编写高质量代码有较大帮助,在底层上解析了在实际开发过程中的一些坑,一些常见经验总结。
 

   第五部分: 高效并发

        Java语言和虚拟机提供了原生的、完善的多线程支持,使得他天生就是和开发多线程并发的应用程序。

不过我们不能期望系统来完成所有与并发相关的处理,了解并发的内幕也是一个高级程序员不可缺少的课程。
         对于多线程并发的认识是在入行半年多后,才有时间余力学习的。第一个简单层面接触多线程,仅仅是Thread和Runnable以及五种常见运行态的认识,那时对于多线程的简例(生产者与消费者模式)也还要看好一会儿,经过两个多月的深化学习,对于这些概念认识也有了比较牢固的把握。彼时接触更深一些的知识(如线程池、lock等并发处理)还没有系统化认识,知识模糊的知道这是一个疑难点,不好掌握的东西,直到入行一年多,面试三七互娱的时候才知道原来这些知识也是我等必备的技能点。 
          新的工作岗位,项目前期业务需求并不多,做完任务就深入学习 多线程并发,或许是有了当初的一些相关技术积累,并不困难理解。把四种线程池实现反复看写实例demo,对Executor、ExecutorService等反复透析,对Java并发的相关面试试题翻出来背诵和练习。相关堵塞队列、java.lang.concurrent包、lock、concurrentLock等都翻了几遍。当然一网打尽是不可能,只能算是为下一次的技能实践迭代减轻压力。

      

     第十二章   讲解了虚拟机的Java内存模型的结构和操作,以及原子性、可见性和有序性在Java内存模型中的体现,介绍了线性发展原则以及使用,还讲解了线程在Java语言中是如何实现的。

    第十三章  介绍了线程安全所涉及的概念和分类、同步实现的方式以及虚拟机的底层运作原理,并且还介绍了虚拟机实现高效并发所采取的一些列优化措施。

        这两章都是从底层实现来解析Java并发的一些实现控制,深入理解对与多线程并发确实有较大的触动帮助,同时可以根据相关知识点做一些优化作业。

   三、本书感悟
           花了两周多看完整本书,写的电子档笔记四十页,两万多字。回头看了看,算是理清了JVM的一些思路并且跟JDK和Java技术连接起来,对Java特性也有了一些新的认识。
          如果单纯使用Java技术语言实现基本的业务需求,不需要深入接触JVM,一方面不好理解,需要相关铺垫知识较多,需要较大耐心;另一方面对于基本的也无需求这部分知识相对理论不实用,即使看过也不是能马上使用出来的,知识一本内功心法需要长期修习才能有深厚的内功做大的事情。
          要想有更高的追求,尽快让自己提升起来,学习这些知识技术很有必要。而当前是一次全面系统化学习,后面还会有第二次第三次迭代,希望以后的学习容易些。


                                                                                            ——————2018.2.9     ---- 修扬

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值