首页 > 其他分享 >JVM基础连环问

JVM基础连环问

时间:2022-08-25 00:12:33浏览次数:50  
标签:ClassNotFoundException Java name 对象 基础 JVM 连环 class 加载

JVM基础连环问

什么是堆吗?

堆用于存放对象实例,是垃圾收集器管理的主要区域,因此也被称作GC堆。堆可以细分为:新生代(Eden空间、From SurvivorTo Survivor空间)和老年代。

堆栈的区别?

  • 堆的物理地址分配是不连续的,性能较慢;栈的物理地址分配是连续的,性能相对较快。
  • 堆存放的是对象的实例和数组;栈存放的是局部变量,操作数栈,返回结果等。
  • 堆是线程共享的;栈是线程私有的。

了解双亲委派模型吗?

  • 当类载器收到一个类的加载请求时,它首先不会自己尝试去加载它,而是把这个请求委派给父类加载器去完成,这样层层委派,因此所有的加载请求最终都会传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

图片

  • 双亲委派模型的具体实现代码在 java.lang.ClassLoader中,此类的 loadClass() 方法运行过程如下:先检查类是否已经加载过,如果没有则让父类加载器去加载。当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。源码如下:
public abstract class ClassLoader {
    // The parent class loader for delegation
    private final ClassLoader parent;

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }

    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    c = findClass(name);
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

    protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }
}

为什么需要双亲委派模型呢?

  • 假如没有双亲委派模型而是由各个类加载器自行加载的话,内存里面可能会出现多个相同的类。
  • 比如用户编写了一个java.lang.Object的同名类并放在ClassPath中,多个类加载器都去加载这个类到内存中,系统中将会出现多个不同的Object类,那么类之间的比较结果及类的唯一性将无法保证。

什么是类加载器呢?

  • 类加载器就是加载所有的类的工具,它加载的类在内存中只会存在一份,也就是堆中的Class对象。不可以重复加载
  • Java 文件在经过 Java 编译器编译之后就被转换成 Java 字节码(class 文件)。类加载器负责读取 Java 字节码,并转换成 java.lang.Class类的一个实例。

有哪些类加载器吗?

  • 启动类加载器:用来加载 Java 核心类库,无法被 Java 程序直接引用。
  • 扩展类加载器:它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器:它根据应用的类路径来加载 Java 类。可通过ClassLoader.getSystemClassLoader()获取它。
  • 自定义类加载器:通过继承java.lang.ClassLoader类的方式实现。

怎么判断一个对象是否存活?

  • 引用计数法。给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。

  • 可达性分析。通过GC Root对象为起点,从这些节点向下搜索,搜索所走过的路径叫引用链,当一个对象到GC Root没有任何的引用链相连时,说明这个对象是不可用的。

图片

可以作为GC Roots的对象有哪些呢?

  • 虚拟机栈中引用的对象
  • 本地方法栈中Native方法引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象

标签:ClassNotFoundException,Java,name,对象,基础,JVM,连环,class,加载
From: https://www.cnblogs.com/faetbwac/p/16622767.html

相关文章

  • Redis连环问
    Redis连环问Redis为什么这么快呢?基于内存:Redis是使用内存存储,没有磁盘IO上的开销。数据存在内存中,读写速度快。单线程实现(Redis6.0以前):Redis使用单个线程处理请求,避......
  • vue3 基础-应用app和组件基本概念
    这篇主要对vue最基础的应用程序Application和组件Components进行一个简要和直观的认知,具体要分析的代码如下:<!DOCTYPEhtml><htmllang="en"><head><metac......
  • Java基础练习题-错题集(三)
    (1)我们在程序中经常使用“System.out.println()”来输出信息,语句中的System是包名,out是类名,println是方法名。选项:A. 对B.错 (2)以下哪些继承自 Collection 接口()选......
  • 盒子模型、 浮动布局、定位属性、 z-index、JavaScript基础语法
    今日内容概要盒子模型浮动布局定位属性z-indexJavaScript基础语法今日内容详细盒子模型所有的标签都可以看成是一个快递盒1.外边距(margin):指标签之间的距离(......
  • JavaScript知识-简介、语言规范、语言基础
    目录JavaScript简介1.ECMAScript和JavaScript的关系2.JavaScript语言3.HTML、CSS、JavaScriptJavaScript基础之语言规范1.如何使用?2.注释3.结束符JavaScript语言基础1.Java......
  • MySQL基础使用命令
    0.MySQL服务的启动和停止Windows下:#以管理员身份运行命令提示符输入如下命令#启动MySQL服务命令:netstartMySQL服务名#停止MySQL服务命令:netstopMySQL......
  • python基础——字典 集合
    字典集合字典列表的延伸,列表只能通过下标找,不好找,指点可以通过名字查找信息,就像查字典一样。创建dict1={}dict2={'key1':'value1','key2':'value2'}dict3=dic......
  • API基础正则表达式8月23日
    API基础第二天:回顾:String:Strings=newString("hello");String常用方法:length():获取长度trim():去掉两边空白toUpperCase()和toLowerCase():转大写/转小写st......
  • 今日内容之 CSS盒子模型和JS基础知识数据类型
    CSS盒子模型所有的标签都可以看成是一个快递盒1.margin(外边距):标签之间的距离            两个快递盒之间的距离2.border(边框):标签的边框 ......
  • python基础——列表 元组
    列表和元组列表的作用是一次性存储多个数据,可以对这些数据进行的操作有:增,删,改,查列表格式[数据1,数据2,数据3,....]创建方式#创建空列表li1=[]#创建空列表li2......