java class 加载机制

.class 文件 二进制内容分析


image.png

类加载过程


image.png

prepareation: 静态变量赋默认值
resolution: 常量池符号引用,变成直接引用(直接可以访问的内存地址)

initializing:静态变量赋初始值

classloader 加载类
所有的类加载器,都需要继承ClassLoader 顶级抽象类
类加载到内存会创建两个对象,1 . class 类文件,2 类对象
这块数据(方法区)存放在 metaspace (1.8 及以上版本), Permanent Generation (永久代)

类加载器


类加载器层次

classloader 如果为 null , 就是用 Bootstrap classloader 加载的( bootstrap 是c++ 写的一个模块,java里面没有一个class和其对应,所以返回 null)。
ExtClassLoader 对应的是 Extension classloader加载的

import org.junit.Test;

public class TestClassloader {
    @Test
    public void test1() {
        System.out.println(String.class.getClassLoader());
        System.out.println(sun.awt.HKSCS.class.getClassLoader());
        System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());
        System.out.println(this.getClass().getClassLoader());
    }
}
// 结果
null
null
sun.misc.Launcher$ExtClassLoader@65b54208
sun.misc.Launcher$AppClassLoader@18b4aac2
双亲委派机制

自底向上检查该类是否已经加载 parent 方向
自顶向下进行实际查找和加载 child 方向
why 使用双亲委派机制 ? 主要为了安全

父加载器不是 “类加载器的加载器”, 也不是"类加载器的父类加载器"

@Test
    public void test2() {
        System.out.println(TestClassloader.class.getClassLoader());
        System.out.println(TestClassloader.class.getClassLoader().getClass().getClassLoader());
        System.out.println(TestClassloader.class.getClassLoader().getParent());
        System.out.println(TestClassloader.class.getClassLoader().getParent().getParent());
    }
// 结果
sun.misc.Launcher$AppClassLoader@18b4aac2
null
sun.misc.Launcher$ExtClassLoader@65b54208
null
image.png
image.png
image.png

-XX:compileThreshold=10000

以上资料来自:马士兵大学学习资料学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机。 只有...
    阿菜的博客阅读 1,896评论 0 8
  • ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见...
    时待吾阅读 1,176评论 0 1
  • 转发:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 ClassLoader翻译过来就是类加载...
    尼尔君阅读 628评论 0 1
  • 虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转换解析和初始化, 最终形成可以被虚拟机直接使...
    好好学习Sun阅读 1,394评论 0 3
  • 0、前言 读完本文,你将了解到: 一、为什么说Jabalpur语言是跨平台的 二、Java虚拟机启动、加载类过程分...
    vivi_wong阅读 1,403评论 0 10

友情链接更多精彩内容