当里个当

来源:互联网 发布:c语言保留三位小数 编辑:程序博客网 时间:2024/04/28 18:54

(1)JVM如何加载一个类的过程,双亲委派模型中有哪些方法?

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括七个阶段:

加载(Loading);
验证(Verification);
准备 (Preparation);
解析(Resolution);
初始化(Initialization);
使用(Using)
卸载 (Unloading)

其中验证、准备和解析三部分称为连接,在Java语言中,类型的加载和连接过程都是在程序运行期间完成的(Java可以动态扩展的语言特性就是依赖运行期动态加载、动态连接这个特点实现的),这样会在类加载时稍微增加一些性能开销,但是却为Java应用程序提供高度的灵活性

加载、验证、准备、初始化和卸载这5个阶段的顺序是固定的(即:加载阶段必须在验证阶段开始之前开始,验证阶段必须在准备阶段开始之前开始等。这些阶段都是互相交叉地混合式进行的,通常会在一个阶段的执行过程中调用或激活另一个阶段),解析阶段则不一定,在某些情况下,解析阶段有可能在初始化阶段结束后开始,以支持Java的动态绑定(动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。)

加载

在加载阶段,虚拟机主要完成三件事:

      1.通过一个类的全限定名来获取定义此类的二进制字节流。

      2.将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。

      3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口




验证

 验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。验证过程分为四个阶段

     1.文件格式验证:验证字节流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理。

     2.元数据验证:是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言的规范。

     3.字节码验证:主要是进行数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机。

     4.符号引用验证:符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生。


准备

准备阶段为变量分配内存并设置类变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对已非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值:

        pirvate static int size = 12;

        那么在这个阶段,size的值为0,而不是12。 final修饰的类变量将会赋值成真实的值。

解析

解析过程是将常量池内的符号引用替换成直接引用。主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。

初始化

在准备阶段,类变量已经经过一次初始化了,在这个阶段,则是根据程序员通过程序制定的计划去初始化类的变量和其他资源。这些资源有static{}块,构造函数,父类的初始化等。

        至于使用和卸载阶段阶段,这里不再过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。

使用
新线程---程序计数器----jvm栈执行(对象引用)-----堆内存(直接引用)----方法区
卸载
GC垃圾回收

  2)、双亲委派机制、意义、方法

机制

启动(Bootstrap)类加载器----->标准扩展(Extension)类加载器--->系统(System)类加载器---->上下文(Custom)类加载器
从左到右加载:首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。


意义

 防止内存中出现多份同样的字节码 

使用委托机制,会递归的向父类查找,如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器去加载类B,如果A加载器已加载类A,那么B使用A的类加载器进行加载时,就不会在加载类A的字节码了

方法
《1》启动(Bootstrap)类加载器
《2》标准扩展(Extension)类加载器
《3》应用程序类加载器(Application )
《4》上下文(Custom)类加载器

(2)HashMap如何实现的?


(3)HashMap和Concurrent HashMap区别, Concurrent HashMap 线程安全吗, Concurrent HashMap如何保证 线程安全?


(4)HashMap和HashTable 区别,HashTable线程安全吗?


(5)进程间通信有哪几种方式?


(6)JVM分为哪些区,每一个区干吗的?


(7)JVM如何GC,新生代,老年代,持久代,都存储哪些东西?


(8)GC用的引用可达性分析算法中,哪些对象可作为GC Roots对象?


(9)快速排序,过程,复杂度?


(10)什么是二叉平衡树,如何插入节点,删除节点,说出关键步骤。


(11)TCP如何保证可靠传输?三次握手过程?


(12)TCP和UDP区别?


(13)滑动窗口算法?


(14)Linux下如何进行进程调度的?


(15)Linux下你常用的命令有哪些?


(16)操作系统什么情况下会死锁?


(17)常用的hash算法有哪些?


(18)什么是一致性哈希?


(19)如何理解分布式锁?


(20)数据库中的范式有哪些?


(21)数据库中的索引的结构?什么情况下适合建索引?


(22)Java中的NIO,BIO,AIO分别是什么?


(23)用什么工具调试程序?JConsole,用过吗?


(24)现在JVM中有一个线程挂起了,如何用工具查出原因?


(25)线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?


(26)同步和异步有什么区别?


(27)线程池用过吗?


(28)如何创建单例模式?说了双重检查,他说不是线程安全的。如何高效的创建一个线程安全的单例?


(29)concurrent包下面,都用过什么?


(30)常用的数据库有哪些?redis用过吗?


(31)了解hadoop吗?说说hadoop的组件有哪些?hdfs,hive,hbase,zookeeper。说下mapreduce编程模型。


(32)开源协议有哪些?


(33)开源软件有哪些?


(34)了解哪些设计模式?说说都用过哪些设计模式


(35)如何判断一个单链表是否有环?


(36)操作系统如何进行分页调度?


(37)匿名内部类是什么?如何访问在其外面定义的变量?

0 0
原创粉丝点击