前言
本来想着关于写JVM这个专栏,直接写知识点干货的,但是想着还是有必要开篇讲一下为什么要学习JVM,这样的话让一些学习者心里有点底的感觉比较好...

原因一:面试

不得不说,随着互联网门槛越来越高,JVM知识也是中高级程序员阶段必问的一个话题!现在不像以前了,以前会点html都好找工作,现在由于学习软件的人越来越多,而且每年大学生都在毕业(而老一辈的也很少换工作)人只会越来越多,随便在大街上拉一个头发茂盛的大叔都可能就是搞软件的,现在有一股妖风,不管啥公司都慢慢像阿里这样的大公司靠近,面试不问点jvm、并发、分布式都不好意思(虽然公司可能没有用到,虽然可能仅仅CURD),老是觉得问问这些显得逼格高点,不管处于什么原因很多公司的确都是这样的!

所以我不得不相信很多人一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮去学。所以很多人对于为什么要学虚拟机这个问题,一致的答案皆是:因为面试。

其实学习JVM并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。其实说白了,还是得先 好(通)好(过)学(面)java(试)....

然而现实就是这样,毕竟现实源于生活!也正是因为生活学习JVM为了面试的同时也为今后更好的学习java打下了基础!

原因二:为了深入地理解 Java 这门语言

学习 Java 虚拟机能深入地理解 Java 这门语言。对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节。如果你这辈子只甘心做一个平庸的Java码农,那么你完全没有必要去学习JVM相关的知识。

但对于工作了三年以后的朋友来说,很多时候你要解决一个问题必须深入到字节码层次去分析,你才能得到准确的结论,而字节码就是虚拟机的一部分。

深入地理解 Java 这门语言实例:

1、我们常用的布尔型 Boolean,我们都知道它有两个值,true 和 false。但你们知道其实在运行时,Java 虚拟机是没有布尔型 Boolean 这种类型的。Boolean 型在虚拟机中使用整型的 1 和 0 表示。

2、我们都知道类路径和类名唯一确定一个类,但事实上并不是这样。或者说,我们前面说的结论只是表面上的。如果深入到虚拟机层面来说,类加载器、类路径、类名才唯一决定一个类。也就是说,如果两个不同的类加载器它们加载同一个 class 类文件,那这两个类加载器加载的类就是不同的。

以上两个例子如果你不懂虚拟机的一些基础知识,那么你就很难深入理解一些细节。

不说别的,就光和同事聊天,同事说到什么新生代老年代问你一个GC日志排查,你没有JVM基础,贼尬,那个时候你就只会喊我C牛B....

原因三:学习虚拟机是为了今后更好的解决线上排查问题

学习虚拟机是为线上排查问题打下基础。我们知道我们一个 Java 应用部署在线上机器上,肯定时不时会出现问题。除去网络、系统本身问题,很多时候 Java 应用出现问题,就是 Java 虚拟机的内存出现了问题。要么是内存溢出了,要么是 GC 频繁导致响应慢等等。

那如何解决这些问题呢?首先,你必须学会看懂日志吧。那么你就必须要看得懂 GC 日志,这是 Java 虚拟机内容的一部分。你看懂了 GC 日志,那么你就得明白什么是年轻代、老年代、永久代、元数据区等,这些就是 Java 虚拟机的内存模型。你懂了 Java 虚拟机的内存模型,那你就得知道 Java 虚拟机是如何进行垃圾回收的,它们使用的垃圾回收算法是怎样的,它们有何优缺点。接下来就是各种垃圾回收器的特性。

你看,这一切东西都是相关联的。你想要解决线上的 Java 应用崩溃问题,那么你就必须学会 GC 日志。要看懂 GC 日志,就必须学习 Java 虚拟机内存模型。要看懂 Java 虚拟机内存模型,你就要学会垃圾回收机制等等。

学习JVM的好处

学习JVM对于一个Java程序员的好处大概可以概括为下六点:

1、能够明白为什么Java最早期被称为解释型语言,而后来为什么又被大家叫做解释与编译并存的语言(了解JVM中解释器以及即时编译器就可以回答这个问题);
2、你能够理解动态编译与静态编译的区别,以及动态编译相对于静态编译到底有什么好处(JVM JIT);
3、能够利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以辅助你观察Java应用在运行时堆的布局情况,由此你可以通过调整JVM相关参数提高Java应用的性能;
4、可以清楚知道Java程序是如何执行的;
5、可以明白为什么Java等高级语言具有可移植性强的特性。 其实这个问题相当于“为什么C/C++程序员需要学体系结构与编译原理?“
6、能够知道你的头发是怎么没有的

关于我之后的JVM专栏

其实在开始写JVM专栏之前就很想写一个并发编程专栏了,想了很久,最后还是决定先写一个JVM专栏!学习JVM有一个最大的特点就是....学了就忘,嗯哼~

由于虚拟机种类繁多这里就不一一列举,最常用的就是Hotspot虚拟机(翻译过来就是 热 地点、斑点,理解为热点也行)以后该专栏都是以Hotspot虚拟机为准的文章。

如果想要更深入的理解JVM推荐看周志明老师的《深入理解Java虚拟机》。实战类型的,可以看葛一鸣老师的《实战Java虚拟机》

为了方便大家学习JVM,不用去网上找相关书籍,博主准备了周志明老师的《深入理解Java虚拟机》电子书,慢慢啃吧hhhhhhhh...

周志明老师的《深入理解Java虚拟机》:https://pan.baidu.com/s/1JoNm7LWKJNyF6bGX3j6MuQ
提取码:i3xz

以下是本JVM专栏的文章:

别翻了,这篇文章绝对让你深刻理解java类的加载机制【JVM篇二】

尽量抽空更新...

再次提醒:学习JVM有一个最大的特点就是....学了就忘,嗯哼~

最后,欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术...

参考:
《深入理解Java虚拟机》
https://www.cnblogs.com/chanshuyi/p/jvm_serial_00_why_learn_jvm.html

深入理解java虚拟机系列初篇(一):为什么要学习JVM?的更多相关文章

  1. 深入理解java虚拟机系列(一):java内存区域与内存溢出异常

    文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...

  2. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  3. 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域

    一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...

  4. 深入理解java虚拟机系列二——垃圾收集算法

    在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚 ...

  5. 深入理解java虚拟机(十四)正确利用 JVM 的方法内联

    在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法.选中一段代码,敲下这个组合,非常简单.Eclipse也用类似的快捷键,使用 Alt+Shift+M.我讨厌长的方法,提起这个下面这个方 ...

  6. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

  7. java虚拟机全集(31篇文章)

    深入理解java虚拟机系列 深入理解Java虚拟机笔记---内存区域 深入理解Java虚拟机笔记---判断对象是否存活 深入理解Java虚拟机笔记---垃圾收集算法 深入理解Java虚拟机笔记---垃 ...

  8. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  9. Java 虚拟机系列二:垃圾收集机制详解,动图帮你理解

    前言 上篇文章已经给大家介绍了 JVM 的架构和运行时数据区 (内存区域),本篇文章将给大家介绍 JVM 的重点内容--垃圾收集.众所周知,相比 C / C++ 等语言,Java 可以省去手动管理内存 ...

随机推荐

  1. SDN网络IPv6组播机制支持实时视频业务海量用户扩展

    以 OpenFlow 技术为核心的软件定义网络(SDN)框架具有集中控制的功能能够自己感知网络拓扑的变化,在细粒度的路径选择.接入控制.负载均衡方面有着天然的优势,为 IPv6 组播功能的实现提供了好 ...

  2. 02-11 RANSAC算法线性回归(波斯顿房价预测)

    目录 RANSAC算法线性回归(波斯顿房价预测) 一.RANSAC算法流程 二.导入模块 三.获取数据 四.训练模型 五.可视化 更新.更全的<机器学习>的更新网站,更有python.go ...

  3. jsonp与cors跨域解析

    1.浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain的不同 端口port的不 ...

  4. FLask中蓝图(用于分文件)

    一,不使用蓝图,自己分文件 目录结构 -templates -views -__init__.py -user.py -order.py -app.py app.py from views impor ...

  5. 微信小程序开发环境安装以及相关设置配置

    微信小程序开发环境安装以及相关设置配置 一.安装 软件名称:wechat_devtools_1.02.1907232_x64 软件安装地址:https://developers.weixin.qq.c ...

  6. Java微服务(二):负载均衡、序列化、熔断

    本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...

  7. Centos7升级Git版本

    centos 升级 Git 版本 问题描述 centos7 系统默认的 git 安装版本是 1.8,但是在项目构建中发现 git 版本过低,于是用源码编译的方式进行升级.同时该文章也适用于安装新的 g ...

  8. Redis Getshell总结

    Redis默认端口是6379,可以通过zoomeye或者shodan来查找开放6379的端口,能收到很多对外开放6379端口的ip,而且绝大部门是未授权访问的,因为默认redis是未授权访问.但是还有 ...

  9. XSS中的同源策略和跨域问题

    转自 https://www.cnblogs.com/chaoyuehedy/p/5556557.html 1 同源策略 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制.比如源a ...

  10. opencv实践::切边

    问题描述 真实案例,扫描仪扫描到的法律文件,需要切边,去掉边 缘空白,这样看上去才真实. #include <opencv2/opencv.hpp> #include <iostre ...