话不多说直接上干货,先来看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. 1.JVM前奏篇(看官网怎么说)

    JVM(Java Virtual Machine) 前奏篇(看官网规范怎么说) 1.The relation of JDK/JRE/JVM 在下图中,我们所接触的,最熟悉,也是经常打交道的 最顶层 J ...

  2. jvm前奏篇

    javac编译原理 源文件----->类文件 词法分析------>语法分析------>语义分析----字节码生成器------.class 文件 javap  反编译 之所以能到 ...

  3. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  4. 初步了解JVM第二篇

    在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...

  5. JVM学习篇-第一篇

    JVM学习篇-第一篇 JDK( Java Development Kit): ​ Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...

  6. JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转

    http://www.kuqin.com/java/20111031/314144.html 在<Java虚拟机规范>之中,详细描述了虚拟机指令集中每条指令的执行过程.执行前后对操作数栈. ...

  7. 初步了解JVM第一篇

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 废话不多说,直接带大家来初步认识一下JVM. 什么是JVM? ...

  8. JVM 第二篇:垃圾收集器以及算法

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 0. 引言 一说到 JVM ,大多数人第一个想到的可能就是 GC ,今天我们就来聊一聊和 GC 关系最大的垃圾收集器以及垃圾收集算法,希望能通过 ...

  9. 【JVM第二篇--类加载机制】类加载器与双亲委派模型

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.什么是类加载器 在类加载过程中,加载阶段有一个动作是"通过一个类的全限 ...

随机推荐

  1. DAY 3 数论专场

    2019-07-23 今天的题目一个比一个神仙,很早之前就在讨论今天是不是晚上回宾馆就没脑子了,后来发现,是中午.... 一上午就讲了一个PPT,然而标题就两个子---数论... 这谁顶的住....整 ...

  2. unittest使用总结

    unittest简介 Unittest是python内置的一个单元测试框架,主要用于自动化测试用例的开发与执行 简单的使用如下 import unittest class TestStringMeth ...

  3. 【集合系列】- 初探java集合框架图

    一.集合类简介 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中.从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数 ...

  4. JS 暴虐算法查找

      @dd|ad|fds|d@dd|ad|fds|d@dd|ad|fds|d@   var e = [];     window.onload = function () {         var ...

  5. 【Swift】UNNotificationServiceExtension

    一.简介 An object that modifies the content of a remote notification before it's delivered to the user. ...

  6. 矢量图形(Vector Picture, SVG, PDF)转TiKZ代码

    在使用LaTeX的过程中,我们需要往往需要使用一些图片,譬如,在样式文件中,但是如果在样式文件中使用外部的图片,总感觉不是那么地舒服「请原谅强迫症」.因此,想办法将图形内嵌入LaTeX文件. 首先,我 ...

  7. 张孝祥java高新技术 --- jkd1.5 新特性 -- 精华总结

    1. 抽象方法的使用 如果一个方法中大量出现if语句, 那么, 就应该考虑使用抽象来处理. 如下例: package com.lxl; public class Weekend { //周日 publ ...

  8. 【并发编程】synchronized的使用场景和原理简介

    1. synchronized使用 1.1 synchronized介绍 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁.但是,随着Java SE 1.6对sy ...

  9. 力扣(LeetCode)两数相加 个人题解

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  10. 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...