茫茫人海千千万万,感激这一秒你看到这里。心愿我的面试题系列能对你的有所帮忙!共勉!
愿你在将来的日子,放弃酷爱,奔赴山海!
每日三道面试题,成就更好自我
昨天既然你有讲到字符串常量池是吧,那这样吧
1. 你能够讲下 JVM 的运行时数据区或者说内存构造吗?
咱们能够分为线程公有和线程共享的两种状况
线程公有:程序计数器,本地办法栈,虚拟机栈
线程共享:堆和办法区
- 程序计数器:它占用了很小的一块内存空间,记录的是咱们以后线程的一个执行的行数。因为线程它可能一直的切换,如何保障到以后线程时,它执行到哪里呢,就是靠程序计数器来实现的。该内 存区域是惟一一个 Java 虚拟机标准没有规定任何 OOM 状况的区域。
- 虚拟机栈:当 jvm 执行办法时,会在此区域创立栈帧入栈,它存储办法的各种信息比方局部变量表,操作数栈,动静连贯,办法放回地址这些信息。
- 本地办法栈:它也虚拟机栈相似,然而它次要为 native 办法服务,例如 java 须要应用 c 语言的接口服务时。
- 堆:也叫 Java 堆或者是 GC 堆,它是一个线程共享的内存区域,也是 JVM 中占用内存最大的一块区域,简直所有对象都贮存在这里分配内存,也是垃圾回收期次要的治理区域。
- 办法区:存储一些被虚拟机加载的类信息,常量,动态变量,编译器编译后的代码等数据。
不错不错,JVM 都有理解,那再问你一点吧。
2. 类加载过程
零碎加载 Class 类型文件的次要步骤有加载 –> 连贯 –> 初始化,连贯又能够分为验证 –> 筹备 –> 解析
- 加载:依据类的全限定名来获取类的二进制字节流,在内存中生成一个代表该类的 Class 对象
- 验证:次要验证查看 class 文件的正确性,比方文件格式,元数据,字节码,符号援用的验证。
- 筹备:次要就是为类变量分配内存并设置类变量初始的一个阶段。
- 解析:虚拟机将常量池内的符号援用替换成间接援用的一个过程。
- 初始化:它是类加载的最初一步,就是真正执行类中定义的 Java 程序代码的过程。
能够,那问你最初一道:
3. 而其中类加载器是什么,那有哪些呢?
对于任意一个类,都须要由加载它的类加载器和这个类自身一起确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。而类加载器就是依据指定全限定名称将 class 文件加载到 JVM 内存,而后再转化为 class 对象。
次要有一下四品种加载器:
- 启动类加载器(BootstrapClassLoader)用来加载 java 外围类库,无奈被 java 程序间接援用。
- 扩大类加载器(ExtensionClassLoader): 它用来加载 Java 的扩大库。Java 虚拟机的实现会提供一个扩大库目录。该类加载器在此目录外面查找并加载 Java 类。
- 应用程序类加载器(ApplicationClassLoader):它依据 Java 利用的类门路(CLASSPATH)来加载 Java 类。一般来说,Java 利用的类都是由它来实现加载的。能够通过 ClassLoader.getSystemClassLoader() 来获取它。个别状况,如果咱们没有自定义类加载器默认就是用这个加载器。
- 用户自定义类加载器,咱们能够自行去通过继承 java.lang.ClassLoader 类的形式实现。
而对于一个类加载的过程中,如果一个类加载器收到类加载的申请的时候,它首先不会本人去加载这个类,而是把这个申请委派给本人的父类加载器去实现,始终到顶层的启动类加载器时,只有当父加载无奈实现这一加载申请时,就会往下一层一层的尝试去加载类。这种模式就是双亲委派模式,这中模式的益处能够使类有了档次划分,也保障平安。
小伙子不错嘛!明天就到这里,期待你今天的到来,心愿能让我持续放弃惊喜!
注: 如果文章有任何谬误和倡议,请各位大佬纵情留言!如果这篇文章对你也有所帮忙,心愿可恶亲切的您给个三连关注下,非常感谢啦!也能够微信搜寻太子爷哪吒公众号私聊我,感激各位大佬!