深入理解java虚拟机系列初篇(一):为什么要学习JVM?
前言
本来想着关于写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?的更多相关文章
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域
一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小 ...
- 深入理解java虚拟机系列二——垃圾收集算法
在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚 ...
- 深入理解java虚拟机(十四)正确利用 JVM 的方法内联
在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法.选中一段代码,敲下这个组合,非常简单.Eclipse也用类似的快捷键,使用 Alt+Shift+M.我讨厌长的方法,提起这个下面这个方 ...
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- java虚拟机全集(31篇文章)
深入理解java虚拟机系列 深入理解Java虚拟机笔记---内存区域 深入理解Java虚拟机笔记---判断对象是否存活 深入理解Java虚拟机笔记---垃圾收集算法 深入理解Java虚拟机笔记---垃 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- Java 虚拟机系列二:垃圾收集机制详解,动图帮你理解
前言 上篇文章已经给大家介绍了 JVM 的架构和运行时数据区 (内存区域),本篇文章将给大家介绍 JVM 的重点内容--垃圾收集.众所周知,相比 C / C++ 等语言,Java 可以省去手动管理内存 ...
随机推荐
- Jenkins 管道 工作流 自动化部署
jenkins Jenkins是一个用Java编写的开源的持续集成工具.在与Oracle发生争执后,项目从Hudson项目复刻. Jenkins提供了软件开发的持续集成服务.它运行在Servlet容器 ...
- 教你如何判断URL的好坏
1.最核心-网站整体内容质量2.关键词整理拓展及关键词布局3.网站外部链接建设4.网站内链建设合理5.面包屑导航6.友情链接7.404页面网站的SEO站外优化+SEO外链建设 层级:三层为好,301重 ...
- ssrf漏洞学习(PHP)
自己最近原本是想深入的学习一下关于xss.csrf的东西的,可是感觉这些东西需要有很好的js的基础来进行学习..还有感觉自己感觉也差不多该要学习内网渗透了..正好ssrf在内网这一块也是比较有用的.于 ...
- 网页布局——grid语法属性详解
grid目前兼容性目前还可以,主流浏览器对它的支持力度很大,ie9,10宣布它未来不久会对它有很好的支持,目前则需要使用过时的语法.我相信不久的将来grid将成为每一个前端工作人员必备的布局技能. 属 ...
- 带你涨姿势的认识一下 Kafka
Kafka 基本概述 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统 以容错的方式存储记录流 实时记录流 Kaf ...
- [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.1]: exit status 1
问题描述 [root@localhost ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 ...
- Oier们的幸运数字
题目描述 JerryC对数字痴迷到了一种非正常的境界.每天JerryC都有喜欢的一些数字.第 iii 天JerryC就喜欢Ai−BiA_i-B_iAi−Bi中的数字.但是他觉得这样并不是很有趣,于 ...
- Cocos2d-x 学习笔记(11.4) ScaleTo ScaleBy
1. ScaleTo ScaleBy 对node进行缩放.ScaleBy是ScaleTo的子类. 1.1 成员变量 create方法 ScaleTo ScaleBy 成员变量一样: float _sc ...
- Ubuntu 16.04 集成安装Apache+PHP+Kerberos+LDAP+phpLDAPadmin
一.安装Apache 1.1.安装Apache apt-get update apt-get install apache2 过程如下: root@duke01:~# apt-get update命中 ...
- 剑指Offer(十九)——顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 ...