From: https://blog.csdn.net/luanlouis/article/details/40043991

Step 1.根据JVM内存配置要求,为JVM申请特定大小的内存空间 ?

使用java.exe 启动JVM

JVM启动时按照其配置要求,申请一块内存,并根据JVM规范和实现将内存划分为几个区域。

所有的类的定义信息都会被加载到方法区。

https://blog.csdn.net/xiangzhihong8/article/details/65657914

配置JVM装载环境

  JVM.dll文件的查找和装载

虚拟机参数解析、处理、验证

设置线程栈大小

新建JVM实例

Step 2. 创建一个引导类加载器实例,初步加载系统类到内存方法区区域中;

JVM申请好内存空间后,JVM会创建一个引导类加载器(Bootstrap Classloader)实例,引导类加载器是使用C++语言实现的。
引导类加载器(Bootstrap Classloader)会读取{JAVA_HOME}/jre/lib下的rt.jar(java核心类库)和配置(JVM虚拟机运行时所需的基本系统级别的类),然后将这些系统类加载到方法区内。

rt.jar 如java.lang.String, java.lang.Object等等。

Step 3. 创建JVM 启动器实例 Launcher,并取得系统类加载器ClassLoader

此时,JVM虚拟机调用已经加载在方法区的类sun.misc.Launcher 的静态方法 getLauncher(), 获取 sun.misc.Launcher 实例

sun.misc.Launcher launcher = sun.misc.Launcher.getLauncher(); //获取Java启动器
ClassLoader classLoader = launcher.getClassLoader(); //获取类加载器ClassLoader用来加载class到内存来;
// 返回 AppClassLoader 实例,AppClassLoader将ExtClassLoader作为自己的父加载器。
sun.misc.Launcher 使用了单例模式设计,保证一个JVM虚拟机内只有一个sun.misc.Launcher实例。
在Launcher的内部,其定义了两个类加载器(ClassLoader),分别是sun.misc.Launcher.ExtClassLoader和sun.misc.Launcher.AppClassLoader,
这两个类加载器分别被称为拓展类加载器(Extension ClassLoader) 和 应用类加载器(Application ClassLoader).

拓展类加载器(Extension Class Loader):

  该加载器是用于加载 java 的拓展类 ,拓展类一般会放在 {JAVA_HOME}/jre/lib/ext/ 目录下,用来提供除了系统类之外的额外功能。

  拓展类加载器是是整个JVM加载器的Java代码可以访问到的类加载器的最顶端,即是超级父加载器,拓展类加载器是没有父类加载器的?(即bootstrap classLoader?)。

应用类加载器/系统类加载器(Applocatoin Class Loader):

  该类加载器是用于加载用户代码,是用户代码的入口。我经常执行指令 java   xxx.x.xxx.x.x.XClass , 实际上,JVM就是使用的AppClassLoader加载 xxx.x.xxx.x.x.XClass 类的。

  双亲委托模型:应用类加载器将拓展类加载器当成自己的父类加载器,当其尝试加载类的时候,首先尝试让其父加载器-拓展类加载器加载;如果拓展类加载器加载成功,则直接返回加载结果Class<T> instance,加载失败,则会询问是否引导类加载器已经加载了该类;只有没有加载的时候,应用类加载器才会尝试自己加载。

Step 4. 使用类加载器ClassLoader加载Main类

通过 launcher.getClassLoader()方法返回AppClassLoader实例,接着就是AppClassLoader加载我们写的 xxx.xxx.TestMain类的时候了。

当AppClassLoader要加载 xxx.xxx.TestMain.class时,会去查看该类的定义,class文件中有一个叫常量池(Constant Pool)的结构体来存储该class的常量信息。常量池中有CONSTANT_CLASS_INFO类型的常量,表示该class中声明了要用到那些类。.xxx.xxx.TestMain类要想正常工作,首先要能够保证这些其内部声明的类加载成功。所以AppClassLoader要先将这些类加载到内存中。

JVM方法区的类信息区是按照类加载器进行划分的,每个类加载器会维护自己加载类信息;
某个类加载器在加载相应的类时,会相应地在JVM内存堆(Heap)中创建一个对应的Class<T>,用来表示访问该类信息的入口

Step 5. 使用Main类的main方法作为程序入口运行程序

Step 6. 方法执行完毕,JVM销毁,释放内存

038.[转] JVM启动过程与类加载的更多相关文章

  1. JVM启动过程

    JVM启动过程包括:加载.连接.初始化 1.加载:就是将class文件加载到内存.详细的说是,将class文件加载到运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封 ...

  2. JVM系列(一):jvm启动过程速览

    jvm是java的核心运行平台,自然是个非常复杂的系统.当然了,说jvm是个平台,实际上也是个泛称.准确的说,它是一个java虚拟机的统称,它并不指具体的某个虚拟机.所以,谈到java虚拟机时,往往我 ...

  3. JVM启动过程 类加载器

    下图来自:http://blog.csdn.net/jiangwei0910410003/article/details/17733153 package com.test.jvm.common; i ...

  4. JVM启动过程——JVM之一

    JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间. JVM体系主要是两个JVM的内部体系结构分为三个子系统和两大组件,分别是:类装 ...

  5. 【JVM学习笔记】类加载过程

    在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的:提供了更大的灵活性,增加了更多的可能性 JVM启动过程包括:加载.连接.初始化 加载:就是将class文件加载到内存.详细的说是 ...

  6. JVM 启动参数及原理 转

    Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码.更通俗地说,JVM是指对这个规范的具体实 ...

  7. JVM 启动类加载器2

    在运行期,一个Java类是由该类的完全限定名(binary name,二进制名)和用于加载该类的定义类加载器(defining loading)所共同决定的.如果同样名字(即相同的完全限定名)的类由两 ...

  8. CentOS7 Tomcat 启动过程很慢,JVM上的随机数与熵池策略

    1. CentOS7 Tomcat 启动过程很慢 在centos启动官方的tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的: <co ...

  9. JVM学习十五 - (复习)类加载的时机、类加载过程、类加载器

    一.类加载的时机 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括以下 7 个阶段: 加载 验证 准备 解析 初始化 使用 卸载 验证.准备.解析 3 个阶段统称为连接 ...

随机推荐

  1. 64-Weave 如何与外网通信?

    上一节我们学习了 Weave 网络内部如何通信,今天讨论 Weave 如何与外界通信. weave 是一个私有的 VxLAN 网络,默认与外部网络隔离.外部网络如何才能访问到 weave 中的容器呢? ...

  2. oop面向对象【类与对象、封装、构造方法】

    今日内容 1.面向对象 2.类与对象 3.三大特征——封装 4.构造方法 教学目标 1.能够理解面向对象的思想 2.能够明确类与对象关系 3.能够掌握类的定义格式 4.能够掌握创建对象格式,并访问类中 ...

  3. [20191206]隐含参数_db_always_check_system_ts.txt

    [20191206]隐含参数_db_always_check_system_ts.txt --//今年年头我做tab$删除恢复时,遇到的问题,就是遇到延迟块清除的问题.参考链接:http://blog ...

  4. web 自动化遇到 shadowDOM 节点你会操作吗?

    本文转载自: http://www.lemfix.com/topics/971 近期有同学在做web自动化的时候,发现页面上有些元素,在selenium中无法通过xpath来定位,各种原因找了半天,都 ...

  5. 基于XML的开发

    基于XML的开发 1.定义一个切面类 /** * Created by zejian on 2017/2/20.*/ public class MyAspectXML { public void be ...

  6. 【30天自制操作系统】day04:C语言与目前执行流程图

    用 C 语言直接写入内存 原来依靠汇编 void io_hlt(void); void write_mem8(int addr, int data); void HariMain(void){ int ...

  7. python语言的鸭子类型和强类型语言的多态

    python语言的鸭子类型和强类型语言的多态 前面讲接口类的时候举过一个有关支付方式的例子,支付方式可以有几种,微信支付,支付宝支付,苹果支付等,这几个不同的支付都统一于支付,像这样几个类都统一于 某 ...

  8. Mac Electron 应用的签名(signature)和公证(notarization)

    背景 在MacOS 10.15之前,应用如果没有签名,那么首次打开时就会弹出这种“恶意软件”的提示框. 这时只要应用签名了,就不会弹这个框. 但在MacOS 10.14.5之后,应用如果没有公证(简单 ...

  9. [转]企业创新平台—Power Platform 的架构与应用场景

    本文转自:https://www.microsoft.com/china/events/video_311

  10. Registering current configuration as safe fallback point

    14:28:23,255 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@f5f2bb7 - URL [jar:file: ...