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教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...
随机推荐
- 【PyTorch教程】P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)
温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...
- 考试T1护花
传送门 这题的提议似乎有什么问题,只要约翰选好了要抓那头牛,他就不会吃草了,站在原地傻等? 这题就是贪心,但在用cmp中比较单位时间吃草数量时,要用double型,不然可能会有点一样... 还有就是主 ...
- 最新JetBrainsPyCharm自动部署Python(Django,tornado等)项目至远程服务器
每次开发Python项目时,对于所有Python开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP ...
- php 开启微信公众号开发者模式
php 开启微信公众号开发者模式<pre><?php/** * wechat php test */header('Content-type:text');//define your ...
- docker——数据卷volume:文件共享
volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...
- MyBatis批量插入模板
oracle: <insert id="insertBatch" parameterType="List"> INSERT INTO TStuden ...
- Blob字段
在oracle中有一个特殊的字段类型Blob,Blob是指二进制大对象也就是英文Binary Large Object的缩写: 通过sql取出后,需要进行特殊处理.而我是这样玩的: 1.通过sql查询 ...
- 领扣(LeetCode)检测大写字母 个人题解
给定一个单词,你需要判断单词的大写使用是否正确. 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA". 单词中所有字母都不是大写,比如"l ...
- Day01第一天 Python基础一
变量 就是将一些运算的中间结果暂时存在内存中,以便后续代码的调用. >命名规则: 1,只能以字母,数字,下划线自由组合,且,不能以数字开头.2,不能是 Python 中的关键字.3,要具有可 ...
- 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。
1.先说要怎么做,后面在慢慢讲解: 2.现在来讲解为什么要放这三套: 这三套其实按内容来说就两种,为什么这两种可以适配hdpi,xhdpi,xxhdpi呢? 那么两种类型的dimens就可以了,为什么 ...