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

#我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习

作者:崔浩博

Java作为最成熟的工业级编程语言,其从业人员也是世界上最多的。刚从学校毕业时候,对于编程世界一知半解的我,也随着大流懵懵懂懂地成为了一名Java初级工程师。

得益于多年的改进与发展,Java底层封装的相当之好,“一次编译,处处运行”的特点,也屏蔽了底层操作系统的差异,对于刚入门的学习者相当友好,使用者免于纠缠在大量繁杂的细节,专心于上层逻辑,因此也会给初学者一种“学习Java很容易”的错觉。然而这是不可能的,代码界前辈有云:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决----抽象过多这个问题除外。”虽然Java通过引入了Java虚拟机,解决了C++中令无数开发者头痛的内存控制问题,但是不可避免的,JVM本身也成为了Java开发者工作中进一步攀升需要克服的一座大山。

对于我来说,经过了“make it run”甜蜜的初级阶段之后,很快遇到了一系列令人头疼的问题:为什么这个Java程序耗费的内存如此之多?程序中报出的“OutOfMemoryError”错误是什么意思?为什么技术老大说这个程序延迟过大是因为gc频繁的原因......一连串的疑问迎面而来,让我意识到我在之前的学习中忽略了一些东西,通过在网上搜索和请教他人,我知道了这些都和Java虚拟机有关,那么应该怎么学习JVM呢?网上大部分人都对周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》交口称赞,推荐初学者通过这本书入门。怀着将信将疑的心情,我马上入手了一部周志明老师的书,开始了对JVM的学习。

第一次对JVM的学习,是通过第二版的“小蓝”,开篇对于Java世界的技术体系进行了介绍,并对Java虚拟机一路走来的历史娓娓道来,让我觉得兴趣盎然。接着介绍了对JVM内存区域的划分,以及至今为止有哪几种垃圾收集策略,并以Hotspot JVM为例,阐明了各种收集策略对应的垃圾收集器。还对如何解读GC日志进行了分析,这些都让我受益匪浅。然而我高兴地太早了,在我觉得自己已经大有长进的时候,看到了虚拟机执行子系统这一章节,JVM复杂的类文件结构以及各种繁杂的字节码指令,让我学的昏昏欲睡,痛苦的坚持了一段时间之后,我放弃了对JVM的进一步学习。

一段时间之后,我在工作中需要用到Java并发编程的一些技术,而这又和Java的内存模型,线程安全以及锁等知识密不可分。我回忆起《深入理解Java虚拟机》书中后面章节正是对这些知识的介绍,于是重拾起对JVM的学习,钻研理解了happens-before原则,Java线程状态与调度等等,这些使得我大大增强了Java并发编程的技巧。

回顾过往短短几年编程经历,周志明老师的书发挥了不可或缺的作用,最近听说周老师又出版了第三版的《深入理解Java虚拟机》,其中增加了JDK 12和预览版JDK 13的相关知识,准备继续研读一遍,相信对最新的java技术能够有所裨益。

推荐阅读

《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

推荐语:这是一部从工作原理和工程实践两个维度深入剖析JVM的著作, 自2011年上市以来,前两个版本累计印刷36次,销量超过30万册,大厂面试最佳参考手册,进阶架构师必读、Java优化神书,这些标签成就了它成为原创计算机图书领域不可逾越的丰碑。

第3版在第2版的基础上做了重大修订,内容更丰富、实战性更强:根据新版JDK对内容进行了全方位的修订和升级,围绕新技术和生产实践新增逾10万字,包含近50%的全新内容,并对第2版中含糊、瑕疵和错误内容进行了修正。

你与世界

只差一个

公众号

相关文章:

  • InfoQ 编辑部开年聊聊 2020 年值得关注的十大技术趋势
  • 达摩院十大科技趋势发布:2020 非同小可!
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • 新书推荐 | 深入浅出图神经网络:GNN原理解析
  • 新书推荐 | 现代机器人学:机构、规划与控制
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • 什么是机器学习?有哪些应用?终于有人讲明白了
  • TIOBE 1 月编程语言排行榜:C 语言再度「C 位」出道!
  • 新书推荐 | 数据流机器学习:MOA实例
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • 2020大风口!什么是图神经网络?有什么用?终于有人讲明白了
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • 机器学习入门必读:6种简单实用算法及学习曲线、思维导图
  • 什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • ERLANG 网工修炼笔记 ---- UDP
  • github指令
  • go append函数以及写入
  • js如何打印object对象
  • JS学习笔记——闭包
  • Linux中的硬链接与软链接
  • mysql中InnoDB引擎中页的概念
  • Quartz初级教程
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 浏览器缓存机制分析
  • 少走弯路,给Java 1~5 年程序员的建议
  • 我与Jetbrains的这些年
  • 自制字幕遮挡器
  • FaaS 的简单实践
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)STL算法之遍历容器
  • (libusb) usb口自动刷新
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (动态规划)5. 最长回文子串 java解决
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三)c52学习之旅-点亮LED灯
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)Controller接口控制器详解(三)
  • (循环依赖问题)学习spring的第九天
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NetCore项目nginx发布
  • .net快速开发框架源码分享
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • []T 还是 []*T, 这是一个问题