1.软文推荐

2.软文推荐

3.软文推荐

目录: 1、jvm底层原理是什么呢?有大神可以说说吗? 2、JVM 为什么要3个类加载器? 3、java的类加载器有哪些,它们的顺序是什么 4、java重新加载class文件 5、如何理解不同类加载器加载的类不可以互相调用 jvm底层原理是什么呢?有大神可以说说吗?

JVM是Java虚拟机的简称,它是Java语言的核心,负责解释和执行Java代码。JVM的底层原理包括以下几个方面:

1.类加载器:JVM使用类加载器将编译好的Java文件加载,在运行时将编译后的字节码转换为机器码。

2.内存管理:JVM对内存进行分配和管理,包括堆、栈等多种内存结构。

3.执行引擎:JVM的执行引擎可以将Java代码转换为可执行的机器指令。

4.JVM指令集:JVM指令集定义了Java语言的许多操作。

5.垃圾回收器:JVM垃圾回收器负责回收无用的对象,给新的对象腾出空间。

以上是JVM底层原理的基本内容,掌握了这些原理可以更好地理解Java程序的运行机制。要深入了解JVM的底层原理,还需要懂Java编译原理、内存模型、线程调度、类文件格式等技术。JVM 为什么要3个类加载器?

JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类。他们主要是分工不一样,各自负责不同的区域,另外也是为了实现委托模型。什么是委托模型呢,其实就是当类加载器有加载需求的时候,先请示他的父类使用父类的搜索路径来加入,如果没有找到的话,才使用自己的搜索路径来来搜索类。

当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。

下面的图形可以表示三者之间的关系:

BootstrapLoader ---(Extends)----AppClassLoader ---(Extends)----ExtClassLoader

这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:

BootstrapLoader : sun.boot.class.path

ExtClassLoader: java.ext.dirs

AppClassLoader: java.class.path

这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。

java的类加载器有哪些,它们的顺序是什么

类加载器有四种,分别是 bootstrapClassLoader (主要加载java核心api) , ExtClassLoaders是扩展类的类加载器,AppClassLoader 程序类加载器,还有一个是用户继承ClassLoader重写的类加载器。

java重新加载class文件

Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

Java的类加载器有三个,对应Java的三种类:

Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)

|

- - ExtClassLoader // 负责加载扩展类(就是继承类和实现类)

|

- - AppClassLoader // 负责加载应用类(程序员自定义的类)

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。

委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

我们可以通过这样的代码来获取类加载器:

ClassLoader loader = ClassName.class.getClassLoader();

ClassLoader ParentLoader = loader.getParent();

注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。

前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

1.装载:查找和导入class文件;

2.连接:

(1)检查:检查载入的class文件数据的正确性;

(2)准备:为类的静态变量分配存储空间;

(3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。

这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

如何理解不同类加载器加载的类不可以互相调用

不同类加载器加载的类不可以互相调用

专业术语:定义类加载器、初始类加载器

在java中加载器分为4种:

1、appClassLoad 应用程序加载器

2、etcClassLoad 扩展类加载器

3、bootStrapClassLoad(root) 根加载器

4、自定义加载器

怎么理解 不同类加载器加载的类不可以互相调用?

当创建一个类Test时由appClassLoad类加载器加载,当引入变量String时,String根据双亲委派机制,一层一层往上查询,应该appClassLoad-》etcClassLoad-》bootStrapClassLoad最终由bootstrap加载,在这个过程种appClassLoad和etcClassLoad被定义位初始加载器,bootstrap被定义为定义类加载器,每个加载器当中都有一个命名空间,也就是记录表,记录着所有此类的初始类加载器,所以在Test类是以可使用到String的。

一个类通过不同的加载器,加载到方法区中,会生成两个不同的类,互相是不可以遇见的,而且在堆中也会生成不同的对象实例。

自定义类加载器是为了解决当.class文件不在classpath路径中时,寻找加载.class而存在的

相关文章 8

1

苏日iplc 59秒前

目录:...

2

美国服务器租用后如何进行管理 3分钟前

目录:1、服务器租用之后怎么操作?2、美国服务器租用时要注意什么?3、在租用美国服务器的时候我要注意什么?服务器租用之后怎么操...

3

优化百度上的排名 6分钟前

目录:1、百度排名如何优化2、百度优化怎样提升排名效果3、如何提高百度排名4、百度推广优化排名怎么做5、如何优化网站的百度排名呢,...

4

日本高防服务器有什么优势 7分钟前

目录:1、请问高防服务器有什么优势?2、高防服务器优势有哪些?3、高防服务器咋样,比一般的服务器好吗?4、高防服务器的优势有哪些...

5

法国游戏vps 9分钟前

目录:1、法国VPS要怎么选择?选怎样的供应商好?2、如果想要法国VPS的速度很快,要选择 什么供应商比较好?3、国外VPS云服务器选择攻略...

6

企业邮箱阿里巴巴云 11分钟前

目录:1、阿里邮箱VS网易企业邮箱,哪个好?2、阿里云企业邮箱,腾讯企业邮箱,网易企业邮箱分别有什么区别呢,选哪个比较好呢,各有...

7

国外永久服务器租用延迟高如何解决 12分钟前

目录:1、服务器延迟高怎么解决2、怎么解决国内访问国外服务器速度慢的问题呢?3、如何解决玩国外服务器延迟高的问题4、我有个网站用...

8

云服务器怎么连接使用 13分钟前

目录:1、远程连接云服务器有哪几种方式2、河对岸云服务器怎么使用3、如何连接云服务器4、手机远程连接阿里云腾讯云服务器的方法5、阿...