我是小菜,大家能说说java虚拟机具体是怎么运行的?和class类的关系的啦。
发布网友
发布时间:2022-04-12 19:42
我来回答
共3个回答
热心网友
时间:2022-04-12 21:12
Java基础很重要 当Java编译器编译好.class文件之后,我们需要使用JVM来运行这个class文件。那么最开始的工作就是要把字节码从磁盘输入到内存中,这个过程我们叫做【加载 】。加载完成之后,我们就可以进行一系列的运行前准备工作了,比如: 为类静态变量开辟空间,将常量池存放在方法区内存中并实现常量池地址解析,初始化类静态变量等等。这篇文章我们要好好谈谈JVM是如何加载class文件的?
1、JVM加载类的过程
当我们使用命令来执行某一个Java程序(比如Test.class)的时候:java Test
(1) java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。
(2) 虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类装载器 ―― Bootstrap Loader(启动类装载器 ) 。
(3) Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader(扩展类装载器) ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。
(4) 然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader(用户自定义类装载器 ) ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。
这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。
初学者对这个过程很难理解,我们将在下面详细的讲讲类装载器和"Parent"是什么。
2、类装载器体系结构
JVM加载class文件必须通过一个叫做类装载器的程序,它的作用就是从磁盘文件中将要运行代码的字节码流加载进内存(JVM管理的方法区)中。下面是几个比较重要的概念:
(1) 启动类装载器 : 每个Java虚拟机实现都必须有一个启动类装载器。它只负责在系统类(核心Java API的class文件)的安装路径中查找要装入的类。这个装载器的实现由C++ 所撰写而成,是JVM实现的一部分。
(2) 扩展类装载器和自定义类装载器 : 负责除核心Java API以外的其它class文件的装载。例如、用于安装或下载标准扩展的class文件,在类路径中发现的类库的class文件,用于应用程序运行的class文件等等。这里有一点需要注意:自定义类装载器并非由应用程序员自己实现,它也是JVM
(3) 命名空间: Java虚拟机为每一个类装载器维护一个唯一标识的命名空间。一个Java程序可以多次装载具有同一个全限定名的多个类。 Java虚拟机要确定这"多个类"的唯一性,因此,当多个类 装载器都装载了同名的类时,为了唯一地标识这个类,还要在类名前加上装载该类的类装载器的标识(指出了类所位于的命名空间)。下图显示了两个类装载器有关的命名空间,显然,不同的类装载器允许装载相同的类Volcano。
命名空间有助于安全的实现,因为你可以有效地在装入了不同命名空间的类之间设置一个防护罩。在Java虚拟机中,在同一个命名空间内的类可以直接进行交 互,而不同的命名空间中的类甚至不能察觉彼此的存在,除非显式地提供了允许它们进行交互的机制。一旦加载后,如果一个恶意的类被赋予权限访问其他虚拟机加 载的当前类,它就可以潜在地知道一些它不应该知道的信息,或者干扰程序的正常运行。
热心网友
时间:2022-04-12 22:30
先编译成.class文件,在有Java虚拟机执行.class文件。
热心网友
时间:2022-04-13 00:04
java虚拟其实就是一个模拟平台,简单点说,windows就是一个平台了,linux也是一个平台,各种不同内核的系统都可以算是一个平台,但是不同平台间的软件是不可以跨平台运行的,你不能拿windows下的一个exe文件到linux下运行,但是,你装了java虚拟机后,他会虚拟出一个平台,来让你运行jar文件,这样就实现了跨平台软件,也就是说你用java写的jar程序可以在任何一种平台上运行,前题是那个系统上要有java虚拟机,一般你下载个完整的java jdk里面就有虚拟平台了,当然,也可以单独下载,这个你可以以后学到这里再了解。class是定义一个类,java是一种面向对象开发的语言,习惯的把一个对象定义为一个类,类的作用很多,你只要按书里的例子写几个,慢慢就会理解,主要来说,我感觉这是一种规范,能让程序开发更方便,例如,你可以定义一个class Student{private String name;private String age;//get set 方法略 //里面同时可以写一些方法,当然真正开发不会这样写,这只是举个例子public void fun(){ //代码实现}}这是你一个问题,你最好找本java程序设计重头到尾看一遍,哪个版本的书无所谓,基础都一样,然后再去弄些corejava的知识,其实corejava就是java基础,只是我们说的corejava是java基础的完整版,而java程序设计的书,就单是最基础的那些入门了,学完corejava你基本可以写出一个比较完整的cs通讯方式的软件另外数据算法这些可有可无,学java不一定要会,但也可以说一定要会,因为要处理一些逻辑关系优化算法这些的很重要,因为程序不止要可以运行,还要有效率。