设为首页 加入收藏

TOP

Java虚拟机工作原理
2017-04-07 10:25:32 】 浏览:3242
Tags:Java 虚拟 工作 原理

  首先我想从宏观上介绍一下Java虚拟机的工作原理。从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,然后JRE加载Java字节码文件,载入系统分配给JVM的内存区,然后执行引擎解释或编译类文件,再由即时编译器将字节码转化为机器码。主要介绍下图中的类加载器和运行时数据区两个部分。



  类加载指将类的字节码文件(.class)中的二进制数据读入内存,将其放在运行时数据区的方法区内,然后在堆上创建java.lang.Class对象,封装类在方法区内的数据结构。类加载的最终产品是位于堆中的类对象,类对象封装了类在方法区内的数据结构,并且向JAVA程序提供了访问方法区内数据结构的接口。如下是类加载器的层次关系图。



注意如上的类加载器并不是通过继承的方式实现的,而是通过组合的方式实现的。而JAVA虚拟机的加载模式是一种委派模式,如上图中的1-7步所示。下层的加载器能够看到上层加载器中的类,反之则不行。类加载器可以加载类但是不能卸载类。说了一大堆,还是感觉需要拿点代码说事。


首先我们先定义自己的类加载器MyClassLoader,继承自ClassLoader,并覆盖了父类的findClass(String name)方法,如下:


  我们如何利用我们定义的类加载器加载指定的字节码文件(.class)呢?如通过MyClassLoader加载C:\\Users\\Administrator\\下的Test.class字节码文件,代码如下所示:


  字节码的加载第一步,其后分别是认证、准备、解析、初始化,那么这些步骤又具体做了哪些工作,以及他们会对运行时数据区缠身什么影响呢?如下图所示:



  如下我们将介绍运行时数据区,主要分为方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。其中方法区和Java堆一样,是各个线程共享的内存区域,而虚拟机栈、本地方法栈、程序计数器是线程私有的内存区。



  写了这么多,感觉还是少一个例子。通过最简单的一段代码解释一下,程序在运行时数据区个部分的变化情况。


  通过编译器将Test.java文件编译为Test.class,利用javap -verbose Test.class对编译后的字节码进行分析,如下图所示:



  我们在看看运行时数据区的变化:




 


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java多线程的实现方法 下一篇TCP协议设计原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目