JVM主要组成

如同讲汇编必先讲计算机组成原理,在开始字节码之前,我们先了解一下JVM的主要构成。 在JVM的内部,主要由如下几个部分构成:


    1.数据区

  • 方法区:存放类定义信息、字节码、常量等数据,在Sun HotSpot JVM中,这块也称为Perm Gen。
  • 堆:创建的对象信息将放入堆中,堆内部如何实现各虚拟机各不相同,对于Sun HotSpot JVM来说又分为Young Gen和Tenured Gen,更详细描述参见《[Java性能剖析]Sun JVM内存管理和垃圾回收 》
  • Java栈:对于每个执行线程,会分配一个Java栈,JVM在执行过程当中,每执行一个方法,都会为方法在当前栈中增加一个栈帧,每个栈帧的信息与具体实现相关,但一般会由3部分组成:变量区,方法参数和本地变量会放入这个位置,大小是固定的,在进行方法时会先分配好,在类定义中,会由max local来指定这块区的大小;方法信息区,会包括当前类常量池的入口地址等信息,这块大小也是固定的;操作栈,与Intel体系架构中的运算使用寄存器来进行不一样,JVM的字节码的方法调用、运算等需要的参数,都是通过操作栈来传递的,在后面详细介绍中我们会进一步了解到,在类定义中,会由max stack指定最大的操作栈。关于Java栈的更详细描述参见《Java 栈内存介绍 》
  • 本地方法栈:对本地方法的调用,并不会使用Java栈而是使用本地方法栈,本地方法栈的组成取决于所使用的平台和操作系统
  • PC寄存器:对于每个执行线程会分配一个PC寄存器,寄存器中存放当前字节码的执行位置

2.类加载器子系统
      类加载器完成类的加载工作,包括查找和装载类定义(.class)信息、连接(包括字节码验证、类变量内存分配和初始化、符号解析)和类初始化的过程

    • 查找和装载类定义(.class)信息:关于这块的内容可以google到无数的描述文档,JVM内部也提供了多种查找和装载类定义的途径,譬如从本地加载类定义、从远程加载类定义,甚至需要的话,我们可以对类定义进行加密在装载的时候做处理等等,更详细的描述也可以参见《[Tomcat源码系列] Tomcat 类加载器结构 》
    • 连接—字节码验证:对于加载的类定义,JVM必须确保其是合法的,包括定义的结构是合法的、声明的类信息(包括属性、方法等等)是合法的、字节码的正确性(包括确保操作码是合法的、有合法操作栈、goto语句能够到达一个合法的地址上等等)等等
    • 连接—类变量内存分配和初始化:在这个阶段,类变量将分配内存,并设置一个合法的初始化值,譬如对象是null、数值型是0、布尔值是false等等
    • 连接—符号解析:符号定义了类提供给外部可访问的服务以及类需要访问到的外部的服务,譬如类提供了方法给外部调用,或者类调用外部的方法,这些就是符号,符号解析过程就是将符号型的描述(譬如字符串)转换成实际的引用地址(譬如方法入口字节码指针地址),符号解析可能是在加载时进行,也有可能推迟到实际被使用到才去解析,但不管怎么样,JVM应该对外提供迟解析的印象,即不管何时解析符号,总是在符号被第一次访问的时候才会抛出异常,关于符号解析,后面会有专门的篇章更详细地介绍
    • 类初始化:类的初始化是在类第一次被引用到的时候进行,类初始化包括给类属性(static)设置初始化值、调用类中的static块代码,在字节码中,会有一个专门的<clinit>方法,类初始化的时候会调用这个方法,譬如如下
public class Test2  {
    public static int cout = 0;
    static  {
        for (int i=0; i<100; i++)  {
            cout += i;
        }
    }
}  

3.执行引擎:可以理解为CPU,是JVM最核心的部分。在Java虚拟机规范中,执行引擎的行为使用指令集来定义。对于每条指令,规范都详细规定了当实现执行到该指令时应该处理什么,但却没有定义如何处理,具体策略交给JVM的具体实现
     在后面的篇章,将继续介绍符号解析和字节码

时间: 2024-10-25 01:00:01

JVM主要组成的相关文章

JVM原理讲解和调优

一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

JVM垃圾回收算法

1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)     Major GC|| Full GC (永久代)Permanent Generation (Permanent  space)[方法区(method area)]    Major GC 本地化的String从JDK 7开始就被移除了永久代(Permanent Generation ) JDK

Java 详解 JVM 工作原理和流程

作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(JavaAPI).它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执

JVM 什么时候会full gc

除直接调用System.gc外,触发Full GC执行的情况有如下四种.1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space 为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收.让对象在新生代多存活一段时间及不要创建过大的对象及数组.2. Permanet Generation空间

jvm java内存区域的介绍

jvm虚拟机在运行时需要用到的内存区域.广泛一点就是堆和栈,其实不然,堆和栈只是相对比较笼统的说法,真正区分有如下几个 先上图一: 总的就是 java的内存模型 内存模型又分堆内存(heap)和方法区(有时也称为non-heap)和栈 堆又分新生代(Young)和老年代(old/Tenured) 新生代又分默认比例为8:1:1的eden空间.from survivor空间.to survivor空间 当进行垃圾回收时,eden.survivor from 存活得对象会复制到servivor to

JVM Safepoint 安全点

一.什么是安全点: 在可达性分析算法中查找存活的对象,首先要找到哪些是GC Roots: 有两种查找GC Roots的方法: 一种是遍历方法区和栈区来查找(保守式GC): 一种是通过OopMap的数据结构来记录引用的位置(准确式GC),如在类加载过程中,JIT编译过程中,分别记录下 类成员 和 调用栈 中的引用的调用信息.对应OopMap的位置即可作用一个安全点.线程只有到达安全点时才能暂停下来进行可达性分析. OopMap:你可以把oopMap简单理解成是调试信息. 在源代码里面每个变量都是有

关于 JDK jre jvm

JDK 全名是 JAVA development kit  是JAVA语言的软件开发工具 包:是整个JAVA开发的核心,没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE. JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码: jar – 打包工具,将相关的类文件打包成一个文件: javadoc – 文档生成器,从源码注释中提取文档: jdb – debugger,查错工具: java – 运行编译后的java程序(.class后缀的):

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结--转载http://www.cnblogs.com/kubixuesheng/p/5202561.html

转载自---http://www.cnblogs.com/kubixuesheng/p/5202561.html 俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JV