JVM体系结构概述(一)

一、app.java程序运行具体的流程

假设我们现在有app.java这个程序要运行,那么具体的流程到底是怎么样的呢?

我们会先运行 javac app.java, 然后这个程序会被编译,产生了app.class这个file,然后我们会用java app去执行整个程序。下面几幅图解释了这背后发生的事。

步骤一:

这是一个简化的流程:class loader先将开发者编译的app.class和基本的.class文件load到RAM里面,这过程也load了其它基本的.class文件: 比如说,String对应的的.class, collection 的 .class,或者object的 .class文件。

经过了class loader的处理后,产生了byte code instruction, 放到execution engine里面, 然后execution engine会通过Native method calls来执行程序。

步骤二:

这个流程还可以分成3个主要成分去分析

  1. Loader subsystem
  2. Runtime data area
  3. Execution engine

下面会一一介绍每个部分的功能。

(1)Loader subsystem

loader subsystem:

  1. load:
    1. Application class loader: 主要是load开发者的.class文件
    2. Bootstrap class loader: load JAVA API 的 .class文件
  2. link
    1. Verify, 主要检查class和interface结构的正确性
    2. Prepare, 用于allocate memory给.class file里面的static variables
    3. Resolve, 主要是将symbolic reference改成具体的一个值
  3. initialize:
    1. 主要进行class和interface的初始化

(2)Run time data area


  1. Method(class) data: 主要用于储存class的定义,另外还有method data, field, 和method的code
  2. Heap: 主要用于储存程序运行时所产生的Object
  3. PC Register: 全称是program counter register, 主要用于存放下一个JVM instruction的reference
  4. JAVA Stack:主要用于储存method运行时的数据,
  5. Native method stack: 这是native method被执行的地方. Native method就是用别的语言写出来的编程语言

(3)Execution Engine

  1. Interpreter:主要功能是读bytecode,然后执行相对应的instructions.
  2. JIT(Just-in-time) Compiler:这个部分主要是用以优化execution engine的性能,一般execution engine会先用interpreter去解释bytecode, 然后执行对应的命令。在很多时候,JIT compliler可以将相类似的bytecode都翻译成native code,然后直接运行。直接执行native code会比bytecode快。
  3. Hotspot profiler: 这个部分也是用来优化性能的,当某些method被多次使用时,Hotspot这个部分就会用profiler去记录那些method所对应的native code, 这样就可以直接用native code而不是byte code了。
  4. Garbage collector: 这个部分主要负责内存的管理,当程序中的object不再被用的时候,garbage collector会将其删除。

二、JVM位置

三、JVM体系结构

图示说明:

1.灰色区域不会有垃圾回收;

2.暗黄色区域会发生垃圾回收,99%发生在堆中。

(1)类装载器ClassLoader

负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定

类装载器的运行示意图:


(2)类装载器ClassLoader的类型(4种)

虚拟机自带的加载器(3种)

?启动类加载器(Bootstrap)C++

?扩展类加载器(Extension)Java

?应用程序类加载器(App)Java,也叫系统类加载器,加载当前应用的classpath的所有类

需要进行如下两点说明:

第一点:

sun.misc.Launcher它是一个java虚拟机的入口应用。

? 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载

// 自定义的类
class Demo{

}
public class TestClassLoader {

    public static void main(String[] args) {
        // 自带的
        Object o = new Object();
        System.out.println("===============================   Object  ClassLoader   ===============================");

        System.out.println(o.getClass().getClassLoader());
        System.out.println("===============================   Demo  ClassLoader   ===============================");

        Demo demo = new Demo();
        System.out.println("demo的爷爷 : " + demo.getClass().getClassLoader().getParent().getParent());
        System.out.println("demo的爸爸 : " + demo.getClass().getClassLoader().getParent());
        System.out.println("demo : " + demo.getClass().getClassLoader());
    }
}

程序输出结果:

===============================   Object  ClassLoader   ===============================
null
===============================   Demo  ClassLoader   ===============================
demo的爷爷 : null
demo的爸爸 : [email protected]
demo : [email protected]

Process finished with exit code 0

第二点:

自顶向下加载class文件,先到先得。什么意思呢?

举个例子说明:

我们自定义一个String类,和JVM自带的String类再同一个包下,那么此时就会有冲突。此时,我们遵循自顶向下加载原则,对于后加载的class,全部忽略,以防止恶意代码对于源码的修改。

用户自定义加载器 (第4种)

Java.lang.ClassLoader的子类,用户可以定制类的加载方式。

参考链接

本文主要整理自互联网,主要是便于自己复习知识所用,侵权联系删除,以下为原文参考链接!

【1】JVM architecture介绍
【2】尚硅谷jvm教程

原文地址:https://www.cnblogs.com/ch-forever/p/10223763.html

时间: 2024-10-29 00:28:12

JVM体系结构概述(一)的相关文章

1. JVM体系结构概述

一. JVM的位置 JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN (Java本地接口调用底层硬件接口,了解下就好,已经过时了) 二.JVM体系结构概览 1. 类装载器ClassLoader (4个知识点,①概念,②种类(3种系统自带,1种自定义),③双亲委派机制,④沙箱安全机制) 1.1 类装载器的概念 负责加载class文件,class文件 ** 在文件开头有特定的文件标识 ** ,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行

46张PPT讲述JVM体系结构、GC算法和调优

本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传至Github(点此下载),另外良心推荐阅读<深入理解Java虚拟机JVM高级特性与最佳实践.pdf>(点此下载).

大数据技术之_30_JVM学习_01_JVM 位置+JVM 体系结构概览+堆体系结构概述+堆参数调优入门+JVM 的配置和优化+Tomcat 的配置和优化

1.JVM 位置2.JVM 体系结构概览3.堆体系结构概述4.堆参数调优入门5.JVM 的配置和优化6.Tomcat 的配置和优化 熟悉 JVM 架构与 GC 垃圾回收机制以及相应的 JVM 调优,有过在 Linux 系统下的调优经验. 淘宝的周志明<深入理解 Java 虚拟机>中说 JVM 的优化,其中 99% 优化的是堆,1% 优化的是方法区. 内地女歌手照片--李嘉欣,贴在桌面上. 1.JVM 位置 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2.JVM 体系结构概览 详解如

[转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结

Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知识点总结技术架构原理 https://blog.csdn.net/zhongwen7710/article/details/39213377 写的很好.. 堆栈分不清楚的我 愧对计算机系毕业.. 第一部分:相关的概念 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变

Java虚拟机(JVM)概述

JVM(Java虚拟机)是一个抽象的计算模型.就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域.目的是为构建在其上运行的应用程序提供一个运行环境.JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构.本文主要对JVM进行概述,并介绍Java程序是如何在上面执行的. 虚拟机 从本质上讲,虚拟机是个被构建来提供特定或通用目的服务环境的非实体计算机.这听起来像是一个仿真器,用来仿真机器未配置或不能按要求执行任务的硬件组件.因此,我们要做的

第七章 JVM体系结构与工作方式

JVM能跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台的软件和硬件之间的差异. 7.1 JVM体系结构 7.1.1 何谓JVM 模拟一个计算机来达到一个计算机所具有的计算功能. 以计算为中心来看计算机的体系结构可以分为如下几个部分. 指令集    计算机能识别的机器语言的命令集合. 计算单元  能够识别并且控制指令执行的功能模块. 寻址方式  地址的位数,最小地址和最大地址范围,以及地址的运行规则. 寄存器定义 包括操作数寄存器,变址寄存器,控制寄存器等的定义,数量

JVM解读:JVM体系结构

JVM全称是java Virtual Machine(java虚拟机),JVM屏蔽了与各个计算机平台相关的软件和硬件差异 在接下来的日子里,我要通过写博客的形式学习JVM,让自己更懂得Java 本系列文章是对<深入分析javaweb技术内幕>和<深入理解java虚拟机>的总结,欢迎大家一起吐槽,一起进步 本文是<JVM解读>的第一篇:JVM体系结构 JVM体系结构 JVM的基本组成 (1)指令集:JVM指令集 (2)类加载器:在jvm启动时或者类在运行时将需要的clas

转:用C++实现的一种插件体系结构-----概述

用C++实现的一种插件体系结构-----概述 本文讨论一种简单却有效的插件体系结构,它使用C++,动态链接库,基于面向对象编程的思想.首先来看一下使用插件机制能给我们带来哪些方面的好处,从而在适当时候合理的选择使用.1, 增强代码的透明度与一致性:因为插件通常会封装第三方类库或是其他人编写的代码,需要清晰地定义出接口,用清晰一致的接口来面对所有事情.你的代码也不会被转换程序或是库的特殊定制需求弄得乱七糟.2, 改善工程的模块化:你的代码被清析地分成多个独立的模块,可以把它们安置在子工程中的文件组

C#学习笔记 ----.NET体系结构概述

Microsoft 中间语言 Microsoft Intermediate Language MSIL简称 IL SDK 软件开发工具包 Software Development Kit IDE 集成开发环境 Integrated Development Environment .NET Framework 的核心 是运行库执行环境,称为公共语言运行库(CLR)或.NET运行库. 在.NET中,编译分为俩个阶段: (1) 把源代码编译为Microsoft 中间语言(IL) (2) CLR把IL编