每个程序都运行在一个虚拟机实例上
JVM生命周期
当启动一个java程序时,一个虚拟机的实例就产生了,当程序关闭退出时,JVM也随着消失,如果一个同一台计算机上运行3个java程序,那么就有3个JVM实例。
JVM的体系结构
每个JVM都有一个方法区和一个堆,是所有线程共享的,方法区放置类数据,当程序运行时把创建的对象放到堆中。当每一个线程被创建时,它得到自己的PC寄存器以及一个java栈,如果线程执行的是java-method,pc寄存器总是指示下一条将被执行的指令,java栈总是存储java-method调用的状态(局部变量,传入的参数,返回值,以及中间结果等)
JVM没有寄存器,指令集使用java栈来存储中间数据,java栈有许多栈桢stack frame组成,一个stack frame 包含一个java-method调用的状态,当线程调用一个java-method的时候,JVM压入一个新的stack frame到该线程的java栈中,当方法返回时,这个statck frame被从java栈中弹出并抛弃。这样的存储结构保持了JVM的指令集尽量紧凑,也有助于运行动态编译和即时编译的代码优化,同时增加了通用性。
数据类型:
字长的考量:
JVM中最基本的数据单元是字word
字长必须足够大,至少是一个字单元就足以持有byte,short,int ,char,float,returnAddress,reference的值,2个字长足以持有long,double的值。
类装载子系统:
装载方式:启动类装载器在系统类的安装路径查找要装入的类
用户自定义的的类装载器在classpath中查找要装载的类。
常量池,JVM必须为每个被装载的类型维护一个常量池,所有常量的有序集合
字段信息,所有的字段都在方法区保存为,字段名,类型,修饰符
方法信息,方法区存放 方法名,返回类型,修饰符,如果方法不是抽象的,还要存放方法的字节码,操作数栈和该方法的栈桢的局部变量区的大小,异常表
类(静态)变量,类变量是由所有类实例共享的,即使没有实例,他们也是可被访问的,这些变量只和类有关,和实例无关,在使用某个类之前,必须在方法区为类变量分配空间
指向ClassLoader类的引用 类装载的时候,JVM必须跟踪它是由谁装载的
指向Class类的引用,对于每个被装载的类型,JVM都会相应的为它创建一个java.lang.Class类的实例,而且以某种方式把这个实例与存储在方法区的类型数据关联起来,因此用户可以得到任何已装载的类的Class实例的引用 public static Class forName(String className);也可以根据类对象的引用得到Class,instance.getClass();
方法表 , JVM对每个装载的类都生成一个方法表,它是一个数组,它的元素是所有它的实例都可能被调用的实例方法的直接引用
常量池解析,把常量池中的符号引用替换为直接引用
堆
java程序运行时创建的所有实例或数组都放在同一个堆中,JVM实例中只存放一个堆空间,因此所有的线程都共享这个堆,又由于一个java程序独占一个JVM实例,那么java程序都有自己的堆空间,互不干扰。JVM有一条在堆中分配新对象的指令,却没有释放内存的指令,正如java代码中无法明确释放一个对象一样,字节码也没有对应的功能,只能用GC
GC
自动回收不在被运行的程序引用的对象所占的内存,或者移动那些还在使用的对象,减少堆碎片。
对象的内部表示
java对象中包含的基本数据由它所属的类及其所有超类声明的实例变量组成,只要有一个对象引用,JVM必须能快速的定位对象实例的数据,并且必须能通过该对象的引用访问相应的类数据,因为当程序运行时需要转换类型时JVM必须要检查这个转换是否被运行,在程序执行instanceof的时候,JVM也进行这样的操作
程序计数器
PC的大小是一个字长,它总是下一条将被执行的指令的地址,如果该线程在在执行一个本地方法,那么PC的值是undefined
Java栈
每当线程调用一个Java方法时,JVM都会在该线程的Java栈中压人一个新桢,这个新桢就成了当前桢,用来存放参数,局部变量,中间运算结果等数据。不管java方法是通过return返回还是Exception终止,JVM都会释放当前桢,这样上一个方法的桢就成了当前桢了,java栈上的数据都是线程私有的。
栈桢
共分为三部分:局部变量区,操作数栈,桢数据区,其中前2个的大小都是按字长计算的,在编译时就确定了并放在class文件中,后者则是依赖于具体的实现。
局部变量区:以字长为单位,从0开始计数的数组,byte,short,bolean都存储为int
操作数栈:不是通过索引访问,而是通过栈操作(压栈出栈)来访问,类型同上
桢数据区:存放来支持常量池解析,正常方法返回以及异常派发机制的数据信息
执行引擎
java中的每个线程都是一个独立的JVM执行引擎
- 描述: JVM数据类型图
- 大小: 25.4 KB
分享到:
相关推荐
JVM(Java虚拟机)的整个流程:发展,运行区域,垃圾回收器,内存分配策略,垃圾收集,JVM分析工具,JVM优化
深入了解jvm,理解java虚拟机底层实现。是一个很不错的额视频教程
JVM,jvm,Java虚拟机知识相关图示.pdf
### 2024年Java面试题:JVM之Java虚拟机面试题 #### Java内存模型及基础知识 **1. Java代码如何被计算机识别** Java程序最初由开发人员使用Java语法编写,这些代码人类可读但计算机无法直接理解。为了使计算机...
JVM(Java虚拟机)详解 一、JVM 概念 JVM(Java虚拟机)是一个抽象的计算模型,提供了一个运行环境,能够运行 Java 字节码。JVM 可以解读指令代码并与底层进行交互,包括操作系统平台和执行指令并管理资源的硬件...
JVM(Java虚拟机)知识思维导图
资源概要:JVM基础知识;类加载子系统;运行时数据区;对象的创建流程与内存分配;...从广义上讲Java,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系中的一员。
Java虚拟机(JVM,Java Virtual Machine)是Java平台的核心组成部分,它负责执行Java程序,为Java代码提供了跨平台的运行环境。Java虚拟机的概念始于Sun Microsystems,现在由Oracle公司继续发展和维护。JVM的设计...
第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...
### JVM(Java虚拟机)的详细讲解 #### Java运行原理概览 Java作为一种跨平台的编程语言,其核心优势在于“一次编写,到处运行”的特性。实现这一目标的关键技术是Java虚拟机(JVM)。简单来说,Java源代码在编译后...
### JVM内幕:java虚拟机详解 #### 一、概述 Java虚拟机(JVM)是运行Java应用程序的核心组件,它提供了一个可移植、安全且高性能的环境。本文将深入探讨JVM的内部架构及其各个组成部分的功能。 #### 二、Java虚拟机...
Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一、Java 虚拟机的概念 ...
jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识
**JAVA虚拟机(JVM)规范** JAVA虚拟机(JVM)是Java语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能在任何支持JVM的平台上运行,实现了“一次编写,到处运行”的目标。JVM规范定义了Java程序如何...
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
### Java虚拟机规范(JVM)概览 #### 核心概念与重要性 《Java虚拟机规范(JavaSE7版)》是理解Java虚拟机(JVM)运作机制的基石,由Tim Lindholm、Frank Yellin、Gilad Bracha和Alex Buckley等人撰写,后由周志明、...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...