话不多说直接上干货,先来看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. 使用webpack+babel构建ES6语法运行环境

    1.前言 由于ES6语法在各个浏览器上支持的情况各不相同,有的浏览器对ES6语法支持度较高,而有的浏览器支持较低,所以为了能够兼容大多数浏览器,我们在使用ES6语法时需要使用babel编译器将代码中的 ...

  2. .Net Core Vue Qucik Start

    .Net Core Vue Qucik Start This is a ASP.NET Core 3.0 project seamlessly integrationed with Vue.js te ...

  3. 连接xshell 时 连不上的问题

      最近这一周由于自己的xshell突然连接不到虚拟机,在网上找了很多种方法也没能解决,以至于自己在学习很多知识的时候都没能很好的去验证,去尝试.最后在求助大佬的时候终于将xshell重新连接到了虚拟 ...

  4. Non-local Neural Networks 原理详解及自注意力机制思考

    Paper:https://arxiv.org/abs/1711.07971v1 Author:Xiaolong Wang, Ross Girshick, Abhinav Gupta, Kaiming ...

  5. C++中对C的扩展学习新增内容———面向对象(继承)函数扩展性及虚函数机制

    1.c语言中的多态,动态绑定和静态绑定 void do_speak(void(*speak)()) { speak(); } void pig_speak() { cout << &quo ...

  6. 配置SElinux环境,将SELinux设置为enforcing

    SELinux是 美国国家安全局 (NSA) 对于 强制访问控制的实现 =>可以使root受限的权限 关闭SELinux=>修改配置文件,永久生效; sed -i 's/SELINUX=e ...

  7. nyoj 257 郁闷的C小加(一)(栈、队列)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. requests模块使用代理

    1.创建try_proxies.py文件import requestsproxies = {"http":"http:117.135.34.6:8060"}he ...

  9. python:类5——Python 的类的下划线命名有什么不同?

    首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注 ...

  10. centos安装后第一次重启,许可协议、Kdump

    1.许可协议,服务器键盘操作找到许可 确定(遇到过,第一次懵逼了) 2.Kdump是RHEL提供的一个崩溃转储功能,用于在系统发生故障时提供分析数据,它会占用系统内存,一般选择关闭(默认是关闭)(这个 ...