标签:new extc 技术 教程 ext jvm cat 恶意代码 概述
假设我们现在有app.java这个程序要运行,那么具体的流程到底是怎么样的呢?
我们会先运行 javac app.java, 然后这个程序会被编译,产生了app.class这个file,然后我们会用java app去执行整个程序。下面几幅图解释了这背后发生的事。
步骤一:
这是一个简化的流程:class loader先将开发者编译的app.class和基本的.class文件load到RAM里面,这过程也load了其它基本的.class文件: 比如说,String对应的的.class, collection 的 .class,或者object的 .class文件。
经过了class loader的处理后,产生了byte code instruction, 放到execution engine里面, 然后execution engine会通过Native method calls来执行程序。
步骤二:
这个流程还可以分成3个主要成分去分析
下面会一一介绍每个部分的功能。
loader subsystem:
load:
link:
initialize:
图示说明:
1.灰色区域不会有垃圾回收;
2.暗黄色区域会发生垃圾回收,99%发生在堆中。
负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
类装载器的运行示意图:
虚拟机自带的加载器(3种)
?启动类加载器(Bootstrap)C++
?扩展类加载器(Extension)Java
?应用程序类加载器(App)Java,也叫系统类加载器,加载当前应用的classpath的所有类
需要进行如下两点说明:
第一点:
sun.misc.Launcher它是一个java虚拟机的入口应用。
? 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
// 自定义的类
class Demo{
}
public class TestClassLoader {
public static void main(String[] args) {
// 自带的
Object o = new Object();
System.out.println("=============================== Object ClassLoader ===============================");
System.out.println(o.getClass().getClassLoader());
System.out.println("=============================== Demo ClassLoader ===============================");
Demo demo = new Demo();
System.out.println("demo的爷爷 : " + demo.getClass().getClassLoader().getParent().getParent());
System.out.println("demo的爸爸 : " + demo.getClass().getClassLoader().getParent());
System.out.println("demo : " + demo.getClass().getClassLoader());
}
}
程序输出结果:
=============================== Object ClassLoader ===============================
null
=============================== Demo ClassLoader ===============================
demo的爷爷 : null
demo的爸爸 : sun.misc.Launcher$ExtClassLoader@2503dbd3
demo : sun.misc.Launcher$AppClassLoader@18b4aac2
Process finished with exit code 0
第二点:
自顶向下加载class文件,先到先得。什么意思呢?
举个例子说明:
我们自定义一个String类,和JVM自带的String类再同一个包下,那么此时就会有冲突。此时,我们遵循自顶向下加载原则,对于后加载的class,全部忽略,以防止恶意代码对于源码的修改。
用户自定义加载器 (第4种)
Java.lang.ClassLoader的子类,用户可以定制类的加载方式。
本文主要整理自互联网,主要是便于自己复习知识所用,侵权联系删除,以下为原文参考链接!
【1】JVM architecture介绍
【2】尚硅谷jvm教程
标签:new extc 技术 教程 ext jvm cat 恶意代码 概述
原文地址:https://www.cnblogs.com/ch-forever/p/10223763.html