jvm结构浅析

jvm全称是Java Virtual
Machine(java虚拟机)。它之所以被称之为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机。我们平时经常使用的Sun
HotSpot虚拟机只是其中一个具体的实现(另外还有BEA JRockit、IBM
J9等等虚拟机)。在实际的计算机上通过软件来实现一个虚拟计算机。与VMWare等类似软件不同,你是看不到jvm的,它存在于内存。

当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图1所示。

图1 Java虚拟机的内部体系结构

下面先对图中各部分做个简单的说明:

1.class文件:虚拟机并不关心Class的来源是什么语言,只要它符合Java
class文件格式就可以在Java虚拟机中运行。使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的
编译器一样可以把程序代码编译成Class文件。

2.类装载器子系统:负责查找并装载Class 文件到内存,最终形成可以被虚拟机直接使用的Java类型。

3.方法区:在类装载器加载class文件到内存的过程中,虚拟机会提取其中的类型信息,并将这
些信息存储到方法区。方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。由于所有线程都共享方法区,因此它们对方法
区数据的访问必须被设计为是线程安全的。

4.堆:存储Java程序创建的类实例。所有线程共享,因此设计程序时也要考虑到多线程访问对象(堆数据)的同步问题。

5.Java栈:Java栈是线程私有的。每当启动一个新线程时,Java虚拟机都会为它分配一
个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。当线程调用java方法时,
虚拟机压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。一个栈帧包含一个java方法的调用状态,它存储有
局部变量表、操作栈、动态链接、方法出口等信息。

6.程序计数器:一个运行中的Java程序,每当启动一个新线程时,都会为这个新线程创建一个
自己的PC(程序计数器)寄存器。程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取
下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。如果线程正在执行的是一个Java方法,这个
计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

7.本地方法栈:本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态链接并直接调用指定的本地方法。如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。

8.执行引擎:
负责执行字节码。方法的字节码是由Java虚拟机的指令序列构成的。每一条指令包含一个单字节的操作码,后面跟随0个或多个操作数。执行引擎执行字节码
时,首先取得一个操作码,如果操作码有操作数,取得它的操作数。它执行操作码和跟随的操作数规定的动作,然后再取得下一个操作码。这个执行字节码的过程在
线程完成前将一直持续。

jvm结构浅析,码迷,mamicode.com

时间: 2024-10-10 03:48:13

jvm结构浅析的相关文章

JVM结构、GC工作机制详解

JVM结构.内存分配.垃圾回收算法.垃圾收集器. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中.(右图表示了从java源文件到JVM的整个过程,可配合理解. 关于类的加载机制,可以参考http://blog.csdn.net/tonytfjing/article/details/47212291) 2.执行引擎:负责执行

Jvm 内存浅析 及 GC个人学习总结

从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C语言的同学都知道,在C语言中内存的开辟和释放都是由我们自己来管理的,每一个new操作都要对于一个delete操作,否则就会参数内存泄漏和溢出的问题,导致非常槽糕的后果.但在Java开发过程中,则完全不需要担心这个问题.因为jvm提供了自动内存管理的机制.内存管理的工作由jvm帮我们完成.这样我们就不

JVM——结构

Java体系: JDK(Java development Kit)包括:java程序设计语言,java虚拟机,java API类库.如图: Java技术体系:Java Card(Applets),Java ME(Micro Edition),Java SE(Standard Edition),Java EE(Enterprise Edition). Jvm结构概念:   运行时数据区域(Runtime Data Areas) Jvm定义了一组运行时数据区域,这些区域在Jvm运行程序时使用.一些区

深入理解JVM结构

JVM结构探究---- 1.JVM结构示意图 2.JVM运行时数据区 1)程序计数器(Program Counter Register) 程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则程序计数器中不存储任何信息 2)JVM栈(JVM Stack) JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean.char.byte.short.int.long.float.d

通俗易懂理解JVM结构

通俗易懂理解JVM结构 说明:本篇内容是结合网上各位大牛的关于JVM的文章,通过作者的理解,希望以一种比较易懂的方式,让各位朋友们理解JVM到底是怎么一回事儿,其中部分图片和内容引用来自于网络,如有雷同,请见谅~~ 一.JVM内存区域模型是啥样? 这个是JVM大致的内存分布模型,看起来比较直观: 这个是更精细化的JVM内存模型,区别主要是方法区和堆是公共内存区,其他是私有的: 1.方法区: 也称"永久代" ."非堆", 它用于存储虚拟机加载的类信息.常量.静态变量.

业余草分享面试题,JVM结构、GC工作机制详解

题外话:最近在应聘阿里2015暑期实习,感触颇多.机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累.知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你?关于JVM和GC,我相信学java的绝大部分人都听过,很多公司的面试官都爱问,一开始我也很头痛,问这么底层干什么,所以我每次面试也只是看看答案敷衍了事.最近面完阿里感觉真不能这样,知识不仅要知其然,还要知其所以然.其实弄懂了JVM和GC,对我们理解很多java知识都有帮助.网上有很多关于GC和JVM的文章,这篇博文主要是根据我

好程序员Java分享JVM结构

好程序员Java分享JVM结构,jvm的基本结构,也就是我们俗称概述.内容很多,而且概念量也很大,关于概念方面,让概念在你的脑子里变成图形,所以只要你有耐心.仔细,发挥自己的想象力,会让你充满信心.当然,不是说看完,就对jvm了解啦,jvm学习的知识非常的多.在你看完,后续我们还会来学jvm的细节,但是如果你在看完的前提下去学习,再学习其他jvm的细节会事半功倍. 1.什么是java虚拟机 首先我们先写一个类 然后打开cmd窗口输入:java test.JVMForJava,打开任务管理器-进程

Java核心知识点-JVM结构之常量池

触摸java常量池 java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂. 本地方法栈是jvm调用操作系统方法所使用的栈. 虚拟机栈是jvm执行java代码所使用的栈. 方法区存放了一些常量.静态变量.类信息等,可以理解成class文件在内存中的存放位置. 虚拟机堆是jvm执行java代码所使用的堆. Java中的

ASP.NET5 Web默认的项目结构浅析(学习笔记)

1.说明 通常一些错误的知识见解发表出来,有可能误导部分读者, 势必造成一定程度伤害. 说实话,试问那个人没有被别人坑过?理解万岁吧!所以本人的博文,如有误人子弟的地方,还望大侠们扶正! 如题,本章的知识点介绍只能算浅析了.理解得对不对?不好说.同样算是我的学习笔记就够了. ASP.NET5 beta7已经发布一个多月了,预计近几天内该发布beta8了. 按照官方产品路线图公布来说,beta8该是所有功能开发大体上盖棺定论(不会大变动了)了. 然后再到RC版,就可用于生产环境中了,这是正式版前,