转自:https://mp.weixin.qq.com/s/EjVfk1iOuQUjLfPxt_DJ7Q

是大名鼎鼎的Java 虚拟机,  据说这个星球上每天有900多万程序员和我打交道,这真是一个惊人的数字。 这900多万人中不少人对我的技术内幕非常感兴趣, 有事儿没事儿都要把我“大卸八块”, 深入了解一下。甚至还有人从我的出生地--源代码--开始看起,弄得人家连一点隐私都没有了。

当然也有很多人对我的运行机理爱理不理, 理由很简单: Java虚拟机相关的事情只有在面试时才会问道,背诵一下那些垃圾回收算法,应付过去就可以了!

真的是这样吗?  面试官为什么喜欢问JVM原理? 难道他们没什么可问的了? 或者是只是为了展示他们的卓尔不群? 高人一等?压你一头?

我想都不是,  请注意一下我的名字: Java虚拟机,  我是一个虚拟机啊!

虽然不是像VMWare, VirtualBox那样可以完全虚拟出一个包括内存,硬盘,CPU的硬件计算机出来, 我至少也是个Soft CPU啊, 有自己的指令集,有自己独有的可执行文件格式, 有自己独特的基于栈而不是寄存器的执行方式,还有那久经考验的垃圾回收机制......

作为一个口口声声说热爱编程,立志有写出伟大软件来改变世界的程序员, 少年, 难道你竟然对这么有趣的东西视而不见?

对软件技术的好奇心是你最终成为伟大程序员的第一驱动力, 如果你对技术不愿意深究, 不愿意了解背后的原理,如果你不愿意像一个调皮捣蛋的熊孩子那样把一个玩具变成零件,然后再组装起来(嗯, 实际上永远都组装不起来了) , 我真的怀疑你在这个行业能呆多久,走多远。

我刚才提到了有趣, 那真的有用吗?

表面上看是没有用处的,至少短期看来是没有用处的, 你写程序,运行程序,然后吃饭,睡觉。

管你什么基于栈的虚拟机,什么方法区,堆, 垃圾回收,  生活很美好,世界也很大, 我想去看看, 不要用这些烦心事来烦我。

如果你想一直生活在软件开发的表层, 那肯定是没有问题的, 如果你想像Neo那样,把这个世界看个清清楚楚,明明白白,真真切切, 就需要修炼一下内力, 做为Java 程序员, 理解Java虚拟机就是那个扎马步的基本功。

举个例子, 理解Class 文件格式, 就能理解ASM是怎么在运行时“艰难的”动态生成字节码的, 然后就会知道CGLib是怎么改善它, 让它容易使用的。  而CGLib可是Spring AOP赖以生存的一大基础啊。 这一路走来,是不是对AOP的理解更加透彻了?

你脑海中甚至能想象出来字节码怎么被动态的创建,被Classloader 加载, 形成新的Class,   然后对你的业务类进行拦截的过程。

看透世界的感觉不要太爽,    如果你非要说我会用Spring 的AOP就行了, 那我也没办法, 人各有志嘛。

扩展一下, 现在我的家中上入住了不少动态语言, Jython, JRuby , Clojure , Scala 等等, 他们可都需要动态的生成字节码来运行啊(码农翻身备注: Scala 也可以直接编译成class 文件), 你看看理解了Class 文件格式得有多大的好处。

还有啊, 理解了一些重要的字节码指令以后,你就会知道所谓的面向对象, 尤其是你写的那些个漂亮的OO代码, 在我这里已经“退化”成函数调用了, 不知道你会不会沮丧, 但是没有办法, 咱们计算机的本质就是这样,顺序,循环,分支, 函数调用。 作为补偿, 我会让你了解多态的秘密, 这可是很多面向对象语言的基础。

说到函数调用, 你写的Java程序在运行时会形成的栈帧, 这可真是一个超级重要的概念, 不仅在我这里有,物理CPU和内存在运行本地代码的时候也有,虽然我和他们的结构不同, 但都是为了完成一个目的:  表达一个函数在运行时的结构。

了解了这个家伙, 你就知道函数在机器级是怎么调用的, 参数是怎么传递的, 递归是怎么回事, 尾递归是怎么回事(我竟然不支持!) 。  也许你会跑去看看汇编, 去看看缓冲区溢出攻击, 各种知识点开始连接,形成一张大网,这种感觉是极爽的。

这样的例子我还可以举出很多,但是估计很多人已经不耐烦了,就此打住。

你们人类说计算机是门科学, 但是科学的成分在哪里呢?  在我看来更像一门工程或者技术,  核心的基础概念真的不多, 花点功夫把他们掌握了,受益终生。

前些天我偷偷地阅读了你们的小说《天龙八部》, 里边的扫地僧可真是厉害, 轻轻松松就把慕容博和萧远山两位绝顶高手制得服服帖帖,老老实实, 这说明的什么问题? 内功的修炼真是很重要啊。

jvm.png

前言

 JVM(Java Virtual Machine)Java 虚拟机是整个 java 平台的基石,是 java 系统实现硬件无关与操作系统无关的关键部分,是保障用户机器免于恶意代码损害的屏障。Java开发人员不需要了解JVM是如何工作的,**但是,**了解 JVM 有助于我们更好的开(通)发(过) java(公司) 程(面)序(试)。

写这篇文章的目的:

  • 总结所学的 JVM 知识
  • 帮助想了解 JVM 的朋友,知无不言,言无不尽

本篇文章将会介绍一下内容:

什么是 JVM

要想说明白什么 JVM 就不得不提另外两个概念,JRE 和 JDK,初学者总是把这几个概念搞混

java-tutorial.png

Jvm,Jre,Jdk 都是 java 语言的支柱,他们分工协作。但不同的是 Jdk 和 Jre 是真实存在的,而 Jvm 是一个抽象的概念,并不真实存在。

JDK
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。JDK 物理存在,是 programming tools、JRE 和 JVM 的一个集合

jdk.png

JRE
JRE(Java Runtime Environment)Java 运行时环境,JRE 物理存在,主要由Java API 和 JVM 组成,提供了用于执行 java 应用程序最低要求的环境。

jre.png

JVM
JVM(Java Virtual Machine) 是一种软件实现,执行像物理机程序的机器(即电脑)。
本来,Java被设计基于从物理机器分离实现WORA( 写一次,随处运行 )的虚拟机上运行,虽然这个目标已经几乎被遗忘。
JVM 并不是专为 Java 所实现的运行时,实际上只要有其他编程语言的编译器能生成正确 Java bytecode 文件,则这个语言也能实现在JVM上运行。
因此,JVM 通过执行 Java bytecode 可以使 java 代码在不改变的情况下运行在各种硬件之上。
jVM 有如下特点:

  • 基于堆栈的虚拟机 :最流行的计算机体系结构,如英特尔X86架构和ARM架构上运行基于寄存器 。 但是,JVM是基于栈的。
  • 符号引用 :除了基本类型以外的数据(类和接口)都是通过符号来引用,而不是通过显式地使用内存地址来引用。
  • 垃圾收集 :一个类的实例是由用户明确创建的代码和垃圾回收自动销毁。
    通过明确界定的基本数据类型的保证平台的独立性 :传统的语言,如C / C ++根据平台有不同的int型的大小。 JVM中明确规定了基本数据类型,以保持它的兼容性和保证平台的独立性。
  • 网络字节顺序 :Java class文件用网络字节码顺序来进行存储:为了保证和小端的Intel x86架构以及大端的RISC系列的架构保持无关性,JVM使用用于网络传输的网络字节顺序,也就是大端。

**Java bytecode **
为了实现WORA,JVM使用Java字节码,java(用户语言)和机器语言之间的中间语言。
该Java字节码是部署Java代码的最小单位。

JVM 用来做什么

基于安全方面考虑,JVM 要求在 class 文件中使用许多强制性的语法和机构化约束,但任意一门功能性语言都可以表示为一个能被 JVM 接受的有效的 class 文件。作为一个通用的、机器无关的执行平台,任何其他语言的实现者都可将 JVM 当作他的语言产品交付媒介。

JVM 中执行以下操作:

  • 加载代码
  • 验证代码
  • 执行代码
  • 提供运行环境

JVM 提供定义了:

  • 存储区
  • 类文件格式
  • 寄存器组
  • 垃圾回收堆
  • 致命错误报告等

JVM 生命周期

  • 启动:任何一个拥有main函数的class都可以作为JVM实例运行的起点
  • 运行:main函数为起点,程序中的其他线程均有它启动,包括daemon守护线程和non-daemon普通线程。daemon是JVM自己使用的线程比如GC线程,main方法的初始线程是non-daemon。
  • 消亡:所有线程终止时,JVM实例结束生命。

JVM 的整体架构

先看一下 java 代码执行过程

关于Jvm知识看这一篇就够了

转自: 纯洁的微笑 纯洁的微笑 3月11日

2016年左右的时候读了周志明《深入理解Java虚拟机:JVM高级特性与最佳实践》,读完之后受益匪浅,让我对Java虚拟机有了一个完整的认识,这是Jvm书籍中最好的读物之一。

后来结合实际工作中遇到的问题,写了一系列关于Jvm的文章,其中开篇的几篇内容大部分参考于此书,后期加入自己一些实战的理解,转载了几篇高质量的文章,就形成了此系列读物。

在金三银四的跳槽季中,很多小伙伴们都已经蠢蠢欲动,将此系列文章整理出来,希望可以帮助到大家。

第一篇文章讲的是Java类的加载机制,也是我在博客园最收欢迎的Jvm文章,读完之后你会了解什么是类加载器、类加载机制、双亲委派模型等内容。

这篇文章描述了Java虚拟机的内存结构,内存每个区域作用,如何通过参数对各个区域进行控制。

讲述了Jvm垃圾回收的经典算法,以及各种垃圾回收机制,对象存活判断等。

这篇文章讲述了如何通过Jvm命令去调优,各Jvm命令使用方法。

这是非常有名的一张图,简单明了展示了GC日志的构成

文章介绍如何分析GC日志来诊断Java项目的运行状态,GC分析是生产调优的重要手段之一。

一名网友根据GC日志,进行Jvm调优的经典案例

介绍了Jvm调优各种工具的使用

如何你只是想通过面试,其实只要看一篇就够了,这篇文章将Jvm中的关键知识点进行了汇总。

翻译自国外的一篇Java GC文章,文章详细描述几种GC调优的方式,值得借鉴。

也是线上一场线上Jvm实战调优的经历,看着挺爽。

Java 8 Jvm内存变化

杜琪翻译的 Java 8 的新特性。

我们曾经线上出现事故后,定位分析的经历,结局出乎意料。

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理的更多相关文章

  1. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  2. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  3. 深入理解Java虚拟机之JVM内存布局篇

    内存布局**** ​ JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的稳定高效运行.不同的JVM对于内存的划分方式和管理机制存在部分差异.结合JVM虚拟机规范,一起来 ...

  4. 深入理解Java虚拟机(六)——JVM调优分析与实战

    大内存硬件上的程序部署策略 单个虚拟机管理大内存 出现问题 如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿.如果扩大计算的内存的大小,就能 ...

  5. 深入理解Java虚拟机之JVM垃圾回收随笔

    1.对象已经死亡? 1.1引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用 的.但是它很难解决 ...

  6. 《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)

    第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 Ope ...

  7. 深入理解Java虚拟机:JVM高级特性与最佳实践

    第一部分走近Java第1章走近Java21.1概述21.2Java技术体系31.3Java发展史51.4Java虚拟机发展史91.4.1SunClassicExactVM91.4.2SunHotSpo ...

  8. 深入理解JAVA虚拟机之JVM性能篇---垃圾回收

    一.基本垃圾回收算法 1. 判断对象是否需要回收的方法(如何判断垃圾): 1) 引用计数(Reference Counting)  对象增加一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...

  9. 《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

    第一部分 走进Java 一.走进Java 1.概述 java广泛应用于嵌入式系统.移动终端.企业服务器.大型机等各种场合,摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想 2.java技术体系 ...

随机推荐

  1. nginx实战操作(常用命令及配置)

    1. nginx介绍 2. nginx常用命令 验证配置是否正确: nginx -t 查看Nginx的详细的版本号:nginx -V 查看Nginx的简洁版本号:nginx -v 启动Nginx:st ...

  2. android网络编程_socket(一)

    转载http://www.eoeandroid.com/thread-97477-1-1.html 小知识点:UDP协议和TCP协议的不同.UDP是把数据都打成数据包,数据包上自带通信的地址,但是数据 ...

  3. 预学第二天:计算机的基础知识+python安装+pycharm安装+思维导图

    目录 计算机的基础知识 计算机是由什么组成的 什么是操作系统

  4. android 发送邮件--实现 send email for android

    Android 发送邮件消息 用途:发送验证码,通过邮箱找回密码 不需要调用客户端直接使用代码进行发送 本项目使用到的jar包–本文结尾会附带下载链接 activation.jar additionn ...

  5. git,github,gitlab,码云的区别

    git 是版本控制工具. github https://github.com/和gitlab https://about.gitlab.com/都是基于git仓库的web开发流程代码托管平台.两者的区 ...

  6. ThinkPHP 5.0 控制器-》请求-》数据库

    ThinkPHP 5.0 控制器->请求->数据库 控制器总结 无需继承其他的类(若继承了Think/Controller,可直接调用view函数渲染模板),位置处于application ...

  7. typescript 公共,私有与受保护的修饰符

    public理解 当你在程序中没有指明修饰符时,默认为public,也就是在类内类外都可以访问,我们以下面的例子来解释. class Person{ name:string sex:string ag ...

  8. 图像相似度中的Hash算法

           度量两张图片的相似度有许多算法,本文讲介绍工程领域中最常用的图片相似度算法之一--Hash算法.Hash算法准确的说有三种,分别为平均哈希算法(aHash).感知哈希算法你(pHash) ...

  9. 在 Windows 上搭建 PHP 网站

    PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用.PHP的语法借鉴吸收C语言. ...

  10. ArchSummit分享 | 高德地图App架构演化与实践

    讲师介绍 郝仁杰,高德地图无线开发专家.在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享. 背景概述 高德是国内领先的数字地图内容.导航和位置服务 ...