JVM探索笔记之一 ClassLoader

本篇涉及到JVM的几个知识点,也是面试题目中比较常见的

1 什么是类加载器
2 类加载器有几种
3 双亲委派机制是什么
4 沙箱安全
5 手撕JVM结构图

JVM是运行在操作系统之上的,和硬件没有直接交互
在这里插入图片描述
JVM结构图如下
在这里插入图片描述

类装载器ClassLoader是什么:负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。ClassLoader只负责class文件的加载,是否能运行是Execution Engine决定
在这里插入图片描述

多种ClassLoader

在这里插入图片描述

虚拟器自带加载器

启动类加载器Bootstrap (c++写的)那些类加载过了一上来直接就能用

扩展类加载器Extension(java写的) ExtClassLoaderClassLoder的子类,负责装载JRE扩展目录ext下的jar类包。 扩展类加载器 Extension 后期版本加的

应用程序类加载器AppClassLoader 也叫系统类加载器,加载当前classpath的所有类

用户自定义加载器

Java.lang.ClassLoader的子类,用户可以定制类的加载方式

我们看如下代码:

		Object obj = new Object();
		System.out.println(obj.getClass().getClassLoader());

这个得到的是BootStrap,显示是Null

		MyObject mo = new MyObject();	    	

​		System.out.println(mo.getClass().getClassLoader().getParent().getParent());

​		System.out.println(mo.getClass().getClassLoader().getParent());

​		System.out.println(mo.getClass().getClassLoader());


结果是

null
sun.misc.Launcher$ExtClassLoader@15db9742
sun.misc.Launcher$AppClassLoader@73d16e93
双亲委托机制

从顶到底找,避免安全问题,不污染代码。当一个类收到了类加载请求,他首先不会自己区加载这个类,而是把请求委派给父类去完成,每个层次 到类加载器都是如此,因此所有请求都会先到地洞类加载器中(BootStrap),当父类没法完成,字类才会自己去加载。这样保证了使用不同的类加载器都能得到同一个Object对象。自己也找不到就会报ClassNotFoundException

其他

native : 跟java无关的需要调用底层系统的方法,放在本地方法栈中。有声明,无实现

程序计数器:每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法去中的方法字节码(用来存储指向下一条指令的地址),由执行引擎读取下一条指令。非常小的空间,可以忽略不计。是当前线程所执行的字节码行号指示器。如果是native方法,计数器是空的(不归java管)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值