使用java8
一、类加载运行全过程
当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。
package jvmdemo ;
public class Math {
public static final int initData = 666 ;
public static User user = new User ( ) ;
public int compute ( ) {
int a = 1 ;
int b = 2 ;
int c = ( a + b) * 10 ;
return c;
}
public static void main ( String [ ] args) {
Math math = new Math ( ) ;
math. compute ( ) ;
}
}
1.1通过Java命令执行代码的大体流程
流程图地址
1.2 loadClass的类加载过程有如下几步
加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载 ● 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 ● 验证:校验字节码文件的正确性 ● 准备:给类的静态变量分配内存,并赋予默认值 ● 解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用 ● 初始化:对类的静态变量初始化为指定的值,执行静态代码块 类被加载到方法区中后主要包含 运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应class实例的引用 等信息。 类加载器的引用 :这个类到类加载器实例的引用 对应class实例的引用 :类加载器在加载类信息放到方法区中后,会创建一个对应的Class 类型的对象实例放到堆(Heap)中, 作为开发人员访问方法区中类定义的入口和切入点。 注意:主类在运行过程中如果使用到其它类,会逐步加载这些类。 jar包或war包里的类不是一次性全部加载的,是使用到时才加载。
package jvmdemo ;
public class TestDynamicLoad {
static {
System . out. println ( "*************load TestDynamicLoad************" ) ;
}
public static void main ( String [ ] args) {
new A ( ) ;
System . out. println ( "*************load test************" ) ;
B b = null ;
}
}
class A {
static {
System . out. println ( "*************load A************" ) ;
}
public A ( ) {
System . out. println ( "*************initial A************" ) ;
}
}
class B {
static {
System . out. println ( "*************load B************" ) ;
}
public B ( ) {
System . out. println ( "*************initial B************" ) ;
}
}
运行结果:
二、类加载器和双亲委派机制
2.1 Java里几种类加载器
● 引导类加载器(BootstrapLoader) :负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等 ● 扩展类加载器(ExtClassloader) :负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包 ● 应用程序类加载器(AppClassLoader) :负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类 ● 自定义加载器 :负责加载用户自定义路径下的类包
import sun. misc. Launcher ;
import java. net. URL ;
public class TestJDKClassLoader {
public static void main ( String [ ] args) {
System . out. println ( String . class . getClassLoader ( ) ) ;
System . out. println ( com. sun. crypto. provider. DESKeyFactory. class . getClassLoader ( ) . getClass ( ) . getName ( ) ) ;
System . out. println ( TestJDKClassLoader . class . getClassLoader ( ) . getClass ( ) . getName ( ) ) ;
System . out. println ( ) ;
ClassLoader appClassLoader = ClassLoader . getSystemClassLoader ( ) ;
ClassLoader extClassloader = appClassLoader. getParent ( ) ;
ClassLoader bootstrapLoader = extClassloader. getParent ( ) ;
System . out. println ( "the bootstrapLoader : " + bootstrapLoader) ;
System . out. println ( "the extClassloader : " + extClassloader) ;
System . out. println ( "the appClassLoader : " + appClassLoader) ;
System . out. println ( ) ;
System . out. println ( "bootstrapLoader加载以下文件:" ) ;
URL [ ] urls = Launcher . getBootstrapClassPath ( ) . getURLs ( ) ;
for ( int i = 0 ; i < urls. length; i++ ) {
System . out. println ( urls[ i] ) ;
}
System . out. println ( ) ;
System . out. println ( "extClassloader加载以下文件:" ) ;
System . out. println ( System . getProperty ( "java.ext.dirs" ) ) ;
System . out. println ( ) ;
System . out. println ( "appClassLoader加载以下文件:" ) ;
System . out. println ( System . getProperty ( "java.class.path" ) ) ;
}
}
运行结果
null
sun. misc. Launcher $ExtClassLoader
sun. misc. Launcher $AppClassLoader
the bootstrapLoader : null
the extClassloader : sun. misc. Launcher $ExtClassLoader @511d50c0
the appClassLoader : sun. misc. Launcher $AppClassLoader @7f31245a
bootstrapLoader加载以下文件:
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ resources. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ rt. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ sunrsasign. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jsse. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jce. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ charsets. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jfr. jar
file: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ classes
extClassloader加载以下文件:
/ Users / wanghuaikun/ Library / Java / Extensions : / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext: / Library / Java / Extensions : / Network / Library / Java / Extensions : / System / Library / Java / Extensions : / usr/ lib/ java
appClassLoader加载以下文件:
/ Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ charsets. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ deploy. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ cldrdata. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ dnsns. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ jaccess. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ jfxrt. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ localedata. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ nashorn. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ sunec. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ sunjce_provider. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ sunpkcs11. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ ext/ zipfs. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ javaws. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jce. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jfr. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jfxswt. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ jsse. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ management- agent. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ plugin. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ resources. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / jre/ lib/ rt. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ ant- javafx. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ dt. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ javafx- mx. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ jconsole. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ packager. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ sa- jdi. jar: / Library / Java / JavaVirtualMachines / jdk1. 8.0_77 . jdk/ Contents / Home / lib/ tools. jar: / Users / online/ whk1demo/ target/ classes: / Users / wanghuaikun/ . m2/ repository/ org/ springframework/ boot/ spring- boot- starter- web/ 3.1 .1 / spring- boot- starter- web- 3.1 .1 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ springframework/ boot/ spring- boot- starter/ 3.1 .1 / spring- boot- starter- 3.1 .1 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ springframework/ boot/ spring- boot/ 3.1 .1 / spring- boot- 3.1 .1 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ springframework/ boot/ spring- boot- autoconfigure/ 3.1 .1 / spring- boot- autoconfigure- 3.1 .1 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ springframework/ boot/ spring- boot- starter- logging/ 3.1 .1 / spring- boot- starter- logging- 3.1 .1 . jar: / Users / wanghuaikun/ . m2/ repository/ ch/ qos/ logback/ logback- classic/ 1.4 .8 / logback- classic- 1.4 .8 . jar: / Users / wanghuaikun/ . m2/ repository/ ch/ qos/ logback/ logback- core/ 1.4 .8 / logback- core- 1.4 .8 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ apache/ logging/ log4j/ log4j- to - slf4j/ 2.20 .0 / log4j- to - slf4j- 2.20 .0 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ apache/ logging/ log4j/ log4j- api/ 2.20 .0 / log4j- api- 2.20 .0 . jar: / Users / wanghuaikun/ . m2/ repository/ org/ slf4j/ jul- to - slf4j/ 2.0 .7 / jul- to - slf4j- 2.0 .7 . jar: / Users / wanghuaikun/ . m2/ repository/ jakarta
原文地址:https://blog.csdn.net/weixin_40353578/article/details/131674871
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.msipo.com/article-510.html 如若内容造成侵权/违法违规/事实不符,请联系MSIPO邮箱:3448751423@qq.com进行投诉反馈,一经查实,立即删除!