关闭

JVM-体系结构

224人阅读 评论(0) 收藏 举报
分类:
大家都知道,java号称一次编译,处处运行。之所以能够这么强大,jvm功不可没。直接上图:

笔者看过这张图很多次,一直没能理解。一直到最近,觉得能够明白到写博客了。一个java文件通过编译可以得到class文件,class文件就是java虚拟机能够执行的二进制文件。而程序在运行的时候,需要在内存中有数据空间。在jvm中,这个数据空间叫做运行时数据区。运行时数据区,一共有5类空间,分别是:方法区,堆区,java栈,PC寄存器(我更喜欢叫程序计数器,jvm中没有寄存器)以及本地方法栈。
当jvm运行的时候,会先把class文件以二进制数据流的形式加载到方法区,这个过程通过类加载器系统完成(之所以叫做类加载器系统,是因为类加载器可以不只有一个,但常用的是启动类加载器)。一个个说吧!
方法区存储的是类的元数据,包括类的名称,超类等等元数据信息。这些信息中有3个比较重要的:
1 类的常量池
2 一个到当前类的Class类对象的引用
3 一个到当前类的ClassLoader类对象的引用

对于第二个,我想用过java反射机制的都应该明白了他的设计。在java反射机制中,通过Class.forName()等几种方法可以得到特定类的对象。对于第三个,用于记录装载当前类的类装载器对象。对于第一个,这里想重点说下:jvm为每一个被装载的类都维护一个常量池,这个常量池包含了直接常量和对其他类型,字段和方法的符号引用。其中,直接常量很好理解,比如String str="hello";那么str就是一个直接常量。什么是符号引用呢?比如MyClass mc=new MyClass();当类装载器装载这条语句所在类的时候,就会在常量池中记录MyClass xxx.xxx.MyClass,这个就叫做类型的符号引用,当然还有字段的符号引用,方法的符号引用等等。因为常量池中包含了当前类所用到的所有的符号引用(符号引用之后会变成直接引用),所以他在java程序的动态连接中有很重要的位置。
有些时候,为了提高jvm的性能,可能方法区会包含除了上述数据以外的其他数据,比如方法表:jvm对每个装载的非抽象类,都生成一个方法表,把他作为类信息的一部分存储在方法区。这样,以后再查找类方法时就不需要读取类信息,而是根据方法表直接访问。
当类装载器将class文件装载到了方法区,执行引擎就开启从指定类的public static void main()方法执行了,执行过程中会产生对象实例,这些对象实例存储在堆区。我们知道,在类的对象中,对象的数据是属于对象的,但对象的方法是调用类的方法,因此堆区中的类对象需要“记得”自己在方法区的类方法。因此,对于堆区的设计,可以是下面几种方案:







上面的几种方案就不具体说了,很容易理解。对于堆区,还有个很重要的事情,就是垃圾回收,我们知道垃圾回收是java的一大特色,垃圾回收主要的作用空间就是堆区。关于垃圾回收,以后再说。关于堆区和方法区,下面举个例子:
对于下面的代码,我们来看他的执行过程。
public class A{
    private int speed;
    public void set(){
        speed=4;
    }
} 
public class B{
    public static void main(String [] args){
        A a=new A();
        a.set();
    }
}

当运行java B的时候,执行过程如下:首先类装载器加载类B到方法区(其中在常量池中有A的符号引用),接着执行第一行命令,看到使用new关键字,执行引擎需要在堆区新建一个A的对象空间。执行引擎查看B的常量池,发现对A存储的只是一个符号引用,不是直接引用。因此可能需要装载类A到方法区,装载完毕后,返回一个方法区类A的指针引用给类B的常量池(以后类B的常量池可以直接通过引用找到类A)。之后,由于类B知道了类A的详细信息,执行引擎就可以在堆区分配一个类A的实例对象,并将改对象的引用压如到当前线程的java栈中。第一条命令执行结束。
接着说其他三个区域。java栈,程序计数器,本地方法栈(不一定每个线程都有)对应一个线程。就是说,jvm每有一个线程被创建,就会为这个线程对应一个java栈和程序计数器(本地方法栈看是否需要)。由于java栈是线程独有,因此不存在同步问题。与此相对,方法区和堆区都是所有线程共享的区域(从代码角度很容易理解),因此存在线程安全问题。下图能够说明这一点:

java栈是线程执行过程中存放局部变量,操作数等信息的空间他的基本单位是帧。java栈对应的线程每执行一个方法,就会向栈中压如一个栈帧。这个栈帧包括局部变量区,操作数栈和帧数据区。
PC寄存器实际上是程序计数器,用来记录当前线程要执行的下一条指令是什么。
当一个线程在执行过程中需要调用本地方法时,就会创建一个本地方法栈功本地方法使用。

至此,大概介绍了下jvm的基本结构以及他的运行时数据区的基本功能。
  • 大小: 129.5 KB
  • 大小: 65.8 KB
  • 大小: 65.5 KB
  • 大小: 92.8 KB
  • 大小: 20.5 KB
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

互联网体系结构的一点认识

xxx
  • hkhkhk180
  • hkhkhk180
  • 2015-01-14 16:59
  • 486

软件体系结构基本概念汇总

这门课与UML建模,程序设计方法学一样,都是站在比较高的角度来看整个软件结构。并不是对算法,或者语言的关注。如果以后有志于成为软件架构师,就应该好好学这门课。现在我把自己整理的这门课的资料与大家分享。 二、名词解释(每题2分,共20分) 1、B/S(期中)     答:...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2015-07-28 00:36
  • 4310

Java虚拟机体系结构

Jvm基础知识
  • u014134766
  • u014134766
  • 2016-04-03 12:16
  • 282

windows体系结构

Windwos 体系结构: -------------------------------------- 用户模式(ring3) 系统进程、服务进程、应用程序、环境子系统(向应用程序提供环境和应用程序编程接口 Appplication Progra mming&...
  • zxxSsdsd
  • zxxSsdsd
  • 2013-11-28 18:39
  • 1022

软件体系结构风格

MarShaw和DavidGarlan 中提出的软件体系结构定义为:能够用来具体描述软件系统控制结构和整体组织的一种体系结构,能够表示系统的框架结构,用于从较高的层次上来描述各部分之间的关系和接口。         软件体系结构是对系统的一种高层次的...
  • u011731233
  • u011731233
  • 2015-04-16 15:32
  • 2866

Apache软件体系结构

Apache不同的版本,软件体系结构差别还是比较大,一种是进程式处理connection request,另外一种是线程式处理connection request. 进程式处理如下图所示: 如果连接比较多,parent进程会fork很多的child子进程来处理connection,每一个子进程一...
  • kobejayandy
  • kobejayandy
  • 2013-08-30 00:05
  • 1139

软件体系结构

软件体系结构笔记 L1.pdf 课程简介源起... 现状系统分析员遇到的困境解决之道 基于软件体系结构的开发 示意图软件体系结构的生命周期 体系结构的非形式化描述 通常使用自然语言描述概念和原则该阶段是创造性和开拓性需要与软件用户进行不断地交互 体...
  • luyan1992
  • luyan1992
  • 2014-10-30 20:28
  • 2216

软件体系结构

架构定义:某个软件或计算系统的软件构架是该系统的一个或多个结构,它由软件元素、这些元素的外部可见属性以及这些元素之间的关系组成。 2.含义: •首先,构架定义了软件元素。构架必须省略元素中与其交互无关的某些信息 •第二,该定义明确指出系统可能而且确实由多个结构组成。–其中任何一个结构并不能与构...
  • LGCSSX
  • LGCSSX
  • 2013-06-18 00:50
  • 4161

MySQL Study之--MySQL体系结构深入解析

MySQL Study之--MySQL体系结构深入解析 MySQL体系架构   由:连接池组件、管理服务和⼯工具组件、sql接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理⽂文件组成。mysql是独有的插件式体系结构,各个存储引擎有自己的特点。 MySQL内...
  • lqx0405
  • lqx0405
  • 2015-07-09 17:00
  • 5096

Oracle 11g体系结构

详细介绍Oracle 11g体系结构。
  • Fortyone41
  • Fortyone41
  • 2017-01-10 16:32
  • 970
    个人资料
    • 访问:143393次
    • 积分:1702
    • 等级:
    • 排名:千里之外
    • 原创:139篇
    • 转载:10篇
    • 译文:0篇
    • 评论:37条
    最新评论