当前位置: 首页 > news >正文

#我与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版中含糊、瑕疵和错误内容进行了修正。

你与世界

只差一个

公众号

相关文章:

  • 机器学习入门必读:6种简单实用算法及学习曲线、思维导图
  • 什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • 小程序三周年:超8000亿交易额,商业生态正当时
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • 新手学Python, 如何从入门到入土变为从入门到快速上车?
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • 沿用70多年的经典数据可视化方法,如何用Python实现?
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • 学AI哪家强?2019全球排行清华第1,北大第2
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • 华为、阿里等知名公司年终奖发了多少?
  • 2020 云原生 7 大趋势预测
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • 给平庸程序员的12条建议
  • .pyc 想到的一些问题
  • 【Linux系统编程】快速查找errno错误码信息
  • 78. Subsets
  • Android 架构优化~MVP 架构改造
  • C++11: atomic 头文件
  • CSS盒模型深入
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • HTTP 简介
  • IOS评论框不贴底(ios12新bug)
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java概述
  • Linux中的硬链接与软链接
  • React的组件模式
  • React中的“虫洞”——Context
  • Redash本地开发环境搭建
  • 程序员该如何有效的找工作?
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零搭建Koa2 Server
  • 两列自适应布局方案整理
  • 前端存储 - localStorage
  • 前端技术周刊 2019-02-11 Serverless
  • 三栏布局总结
  • 我看到的前端
  • 异步
  • 终端用户监控:真实用户监控还是模拟监控?
  • kubernetes资源对象--ingress
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #162 (Div. 2)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)Honghu Cloud云架构一定时调度平台
  • (新)网络工程师考点串讲与真题详解
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .cfg\.dat\.mak(持续补充)
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?