#我与Java虚拟机的故事#连载12:一本书带我深入Java领域
作者:薛生
上大学期间最开始入门C语言,后来跟着学长学习C++,那时候被学长灌输了一些错误的观念,总觉得“C++天下无敌,学好C++才是厉害的技术人”,他们天天说,Java就是调用一下封装好的库,工作了就是增删改查。后来,机缘巧合下,觉得有必要学习一下Java,当时的考虑就是面向求职学习,最开始是跟着视频学习,敲一些代码,因为有C++基础,所以Java这门高度面向对象的语言,学起来也不是那么吃力。
之后就学习所谓的三大框架SSH(Struts2,Spring,Hibernate),然后在网上下载了一些现成代码修改一下就认为学习了Java。大学毕业找工作时确实因为Java找到了工作,不过工作方向却是安卓。工作后发现自己对Java其实远远谈不上会,工作上的焦虑就逼迫自己重新去学习这方面技术,那时候属于病急乱投医阶段,看过《Java编程思想》,最后看到《深入理解Java虚拟机(第一版)》。从这本书里知道了Java字节码、coffee baby,多线程的底层解释等等,也因为这本书有了对JVM的初步理解。同时发现了Java系的伟大,因为这门开源的语言,发现了计算机方面无穷无尽的宝藏,虽然现在还是某种意义上的API程序员。但是正是这本书给我展现了Java世界的美好,才知道了学无止境,有了对技术的更高的追求。
通过对《深入理解Java虚拟机》的学习,对Java内存机制有了更加深入的理解,最开始只是会用,自从在App上发生了OOM异常,才发现这些都是比较有深度的知识。因为之前只是粗略低知道Java有垃圾回收机制,所以在内存上的使用也就很少考虑内存的合理分配和回收,使用的时候都是直接new出来对应的数据结构,对于使用之后及时回收就缺少了考虑,导致发生这种严重的问题。
工作中也发生过内存泄漏的问题,说到底就是生命周期短的对象被一个单例或者生命周期更长的对象引用,在这个对象不使用的时候没有被虚拟机正确的释放,另外的一种情况就是在某个对象内部使用了匿名内部类,而内部类持有了外部类的引用,这就导致如果这个内部类没有执行完毕,导致外部的对象也不能被及时回收。
学习了《深入理解Java虚拟机》之后知道了释放内存算法一些内部实现,例如其中有一个就是测算对象是否可达,如果某个对象依然被别的对象引用,那么通过Root对象到它哪里就是可达的,这时候虚拟机会认为它是被人使用的,这时候就不会去释放它,反之如果从Root没有路径可以到达这个对象,那么它就有被回收的可能了。内存的垃圾回收还有一种方式是分代算法,把不同的对象标记为不同的生代区域(新生代、老年代),落入老年代的更有可能被回收,学习到这些深度的知识后再写代码的时候就会考虑到对象之间的合理引用。
《深入理解Java虚拟机》还让我知道了各种Java关键字的内部实现,例如interface、synchronized、private等等,有了这些基础知识的加成,写代码的时候才会知道用那些关键字更加合理,这时候写出更加健壮和合理的代码才有了基础。
最后,很期待《深入理解Java虚拟机》的第三版,希望可以继续给我带来不一样的惊喜。
推荐阅读
《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
推荐语:这是一部从工作原理和工程实践两个维度深入剖析JVM的著作, 自2011年上市以来,前两个版本累计印刷36次,销量超过30万册,大厂面试最佳参考手册,进阶架构师必读、Java优化神书,这些标签成就了它成为原创计算机图书领域不可逾越的丰碑。
第3版在第2版的基础上做了重大修订,内容更丰富、实战性更强:根据新版JDK对内容进行了全方位的修订和升级,围绕新技术和生产实践新增逾10万字,包含近50%的全新内容,并对第2版中含糊、瑕疵和错误内容进行了修正。
你与世界
只差一个
公众号