JVM前奏篇(大局观)
话不多说直接上干货,先来看oracle官网中是怎么描述JDK的:https://docs.oracle.com/javase/8/docs/index.html
这是官网中JDK、JRE、JVM的一个关系图

看了这张图我们要学什么呢?
以前我们在用java开发代码的时候只知道把JDK下载下来然后进行写代码,其实这样我们只用到了JDK的一个Tools,也就是上图中的Tools,我们只站在了JDK的一个应用层,那么现在这篇博客的目的就是要我们站在Java Virtual Machine(JVM)层面去做开发。
想一个问题,我们的电脑是怎么加载和识别.java文件的呢?
故事就从这里开始:
当我们编写一个.java文件后首先通过上图中最上面的Javac去编译成.class文件,然后也是通过上图中最上面的java进行去运行(这时候只是停留在java的一个应用层面),现在有一定的开发经验以后我们要把眼光放在底层的JVM当中,因为我们的代码最终是运行在JVM当中的,有必要去谈谈JVM了。
首先来看看在jdk中javac是怎么将java文件编译成class文件?【了解内容】
词法分析==》语法分析==》语法树==》字节码生成器生成class文件(这块作为了解就行了,个人也没有深究它)
下图是我随意找的一个class文件,看不懂没关系,简单了解一下他是怎么生成的:

他是机器所能识别的16进制的字符,前面的cafe babe是class的文件的格式,任何一个class文件都会有cafe babe,后面的一些是根据一些特有的符号组成的(怎么组成的这里不讨论,官网https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html中有)
下面来看下class文件是怎么被加载的?
1、先找到类所在位置(全路径)
2、装载它通过ClassLoader(怎么装载?ClassLoader的双亲委派机制(jdk自带的java.net包下面的String类,若自己也有一个java.net包且有一个String类,这样就会有冲突,所以需要双亲委派机制只加载一次),先自底向上寻找父类知道找到它的祖宗,然后找到就自顶向下一层一层返回,必须保证只被加载一次)
3、解析和初始化(初始化数据在运行时数据区)
将class里面的内容进行打散放入JVM的运行时数据区【看下图】:

方法区:方法区是所有线程共享的内存区域,带有static关键字的都放在方法区中,比如静态文件,常量池,类信息(当方法区内存不够用则抛出OutOfMemoryError(OOM)内存溢出异常)
堆:凡是new出来的对象或者数组都在堆内存中,他也是所有线程共享的内存区域(堆区内存不够用则抛出OutOfMemoryError(OOM)内存溢出异常)
虚拟机栈:它是线程的执行区域(当一个线程被创建的时候虚拟机栈也就被创建了,他的生命周期是随着线程的结束而结束)
本地方法栈:它是当java调用C语言的时候创建的,也就是native关键字(这个作为了解,没多大意义)
程序计数器:多个线程之后CPU的一个计数器(作为了解,没多大意义)
总结:JDK包含了JRE和java的Tools组件,JRE包含了一些常用的jar包和JVM
JDK通过Javac进行将java文件编译成class文件,通过classloader进行加载,加载完毕将class的内容打散放入jvm中,其中class的信息静态文件常量放在方法区,对象放在堆中,虚拟机栈相当于线程。
特别说明:子JDK1.8开始方法区变成了元空间。
JVM前奏篇(大局观)的更多相关文章
- 1.JVM前奏篇(看官网怎么说)
JVM(Java Virtual Machine) 前奏篇(看官网规范怎么说) 1.The relation of JDK/JRE/JVM 在下图中,我们所接触的,最熟悉,也是经常打交道的 最顶层 J ...
- jvm前奏篇
javac编译原理 源文件----->类文件 词法分析------>语法分析------>语义分析----字节码生成器------.class 文件 javap 反编译 之所以能到 ...
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
- 初步了解JVM第二篇
在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...
- JVM学习篇-第一篇
JVM学习篇-第一篇 JDK( Java Development Kit): Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...
- JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转
http://www.kuqin.com/java/20111031/314144.html 在<Java虚拟机规范>之中,详细描述了虚拟机指令集中每条指令的执行过程.执行前后对操作数栈. ...
- 初步了解JVM第一篇
大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 废话不多说,直接带大家来初步认识一下JVM. 什么是JVM? ...
- JVM 第二篇:垃圾收集器以及算法
本文内容过于硬核,建议有 Java 相关经验人士阅读. 0. 引言 一说到 JVM ,大多数人第一个想到的可能就是 GC ,今天我们就来聊一聊和 GC 关系最大的垃圾收集器以及垃圾收集算法,希望能通过 ...
- 【JVM第二篇--类加载机制】类加载器与双亲委派模型
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...
随机推荐
- 【ObjectC—浅copy和深copy】
一.OC设计copy的目的 为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象. 二.实现copy协议 OC提供了两种copy方法:copy和mutableCop ...
- python学习之【第五篇】:Python中的元组及其所具有的方法
1.前言 Python的元组(tuple)与列表很相似,不同之处在于元组不能被修改,即元组一旦创建,就不能向元组中的增加新元素,不能删除元素中的元素,更不能修改元组中元素.但是元组可以访问任意元素,可 ...
- vue proxyTable代理 解决开发环境的跨域问题
如果我们项目请求的地址为 htttp://xxxx.com/a/b/c 可以设置代理为: dev:{ assetsSubDirectory: 'static',// 静态资源文件夹 assetsPub ...
- js设置Date
function getDate (yyyy, MM, dd) { let t = new Date() t.setFullYear(yyyy) t.setMonth(Number(MM) - 1) ...
- SparkSQL--数据源Parquet的加载和保存
一.通用的load和save操作 对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作.load操作主要用于加载数据,创 ...
- 微擎修改 icon.jpg 后项目主页未变
微擎修改 icon.jpg 后项目主页Logo未变 产生原因: 设置了自定义图标,但系统未找到该图标,就选择使用默认的起始图标 解决办法: 在项目根目录位置上传一个图标名为 icon-custom.j ...
- ssm 不能将查询的结果返回到界面的一个原因
* 在controller类中,应先定义一个ArrayList的集合即就是: List<Product> defaultProductList = new ArrayList(); // ...
- ZeroC ICE的远程调用框架 ServantLocator与Locator
ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...
- 用例图浅谈以及OOA再到情景分析的面向对象电梯的设计(慕课东北大学)面向对象设计思维模式
上班初期还不太适应,平时学习进度也跟不上,节奏慢下来会有时间更新的了. Diagram 这边以学生课程报名系统为例 这就是一种简单的用例图 用例图可以给读者提供的信息非常丰富,但是缺点是都是概 ...
- C++控制台闪回;编译器警告C4305,C4244
这是我以前解决问题时,收集在印象笔记里的内容,为了以后整理方便,把它转移至这里.以下内容,均来自微软官方网站相关. 问题:C++控制台闪回 解决办法: 1,在程序结尾添加system( ...