一、深入JVM--类加载器

JVM(JAVA virtual machine)

1.jvm运行在操作系统之上,操作系统运行在硬件系统(Intel系统等)之上jvm与硬件系统是没有交互的。

2.jvm体系架构分为5个部分
ClassLoader:
class静态文件由ClassLoader负责加载并初始化生成Class模板放在方法区中。

运行时数据区:
jvm运行时数据区(Runtime Data Area)包括5个区域:堆内存、方法区、栈、程序计数器、本地方法栈。
堆内存和方法区是线程共享,GC只负责处理堆内存和方法区内的垃圾回收。
栈、本地方法栈、程序计数器是线程独有的。
程序计数器(PC寄存器):每个线程都有一个程序计数器,是线程私有的,本质上就是一个指针。

执行引擎:
执行引擎(Execution Engine)负责从java栈中获取执行的代码然后翻译成操作系统可识别的命令,交给操作系统去执行。

本地方法:
本地接口和本地方法库,是为了融合其他的编程语言为java所用。java是从1995.5.23诞生,当时是C、C++的统治时代,迫于无奈,引入了本地接口与本地方法库。
于是在内存中特地引入了本地方法栈,用于登记native方法。执行引擎执行时就会加载本地方法库。

在这里插入图片描述

3.ClassLoader类加载器
Class文件是一个静态文件,如果要被加载到内存中,需要ClassLoader进行装载进入内存。ClassLoader只负责类的加载,并不负责执行,执行的过程由Execution Engine负责。
在这里插入图片描述

4中类加载器:
BootStrap ClassLoader 启动类加载器
负责加载jre/lib/下的所有类库。由C、C++语言编写,所以在JAVA程序中获取这个累加器时会返回Null,不是因为没有,而是因为底层是有其他语言编写的。

Extension Classloader 扩展类加载器
负责加载jre/lib/ext下的类库

App ClassLoader 系统类加载器
负责加载ClassPath路径的jar文件

User-Definied 自定义加载器
继承 java.lang.ClassLoader类实现里面的方法,自定义加载类的方法

在这里插入图片描述

双亲委派机制
双亲委派机制:当类加载器收到类加载的请求,不会直接去加载该类,而是将请求委派给父类加载器去加载,其他加载器也会如此。直到该请求传递给启动类加载器(BootStrap ClassLoader),启动类加载器会去加载该类。如果加载完成,其余加载器就不在加载。如果加载失败,就会通知子加载器去加载。加载不到,继续通知子类加载。

系统类加载器(AppClassLoader)委派给扩展类加载器(ExtentionClassLoader),扩展类加载器委派给根加载器(BootStrapClassLoader)。根加载器加载不到,才由系统类加载器加载。【儿子委托给爸爸去加载】

双亲委派机制的意义:
1、 保证运行环境中一个类文件只对应一份字节码文件。
2、 保证系统类的安全,不让JDK中的代码被篡改

沙箱机制
沙箱机制是目标,双亲委派机制是实现。沙箱机制是JVM的自我保护机制。
如果你手动写了java.lang.string 类,加载该类时,首先请求会被系统类加载器接收,系统类加载会把请求委派给Extention ClassLoader去加载,Extention Classloader又会把请求委派给根加载器BootStrap ClassLoader加载。根加载器根据包名+类名会在lib/rt.jar中去查找,有就会去加载。因此保证了JVM的运行机制不会被破坏。

在这里插入图片描述
报错原因:AppClassLoader委派给ExtentionCalssLoader,ExtentionClassLoader委派给启动类加载器BootStrapClassLoader加载。根加载器发现rt.jar中有一个java.lang.string 方法,然后运行。发现没有main方法。执行报错。

Native Interface 本地方法接口
本地接口的作用:融合不同的语言编程语言为JAVA所用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值