⑩⑧. 字节码文件中都有什么?
- ①. 魔术、版本(副版本、主版本)、常量池(字节码文件的基石)、访问标识、类索引|父类索引|接口索引集合、字段表集合、方法表集合、属性表集合
⑩⑨. 常量池中都有什么?
- ①. 字面量和符号引号
- ②. 字面量:Java中的常量和字符串
- ③. 符号引号:
类和接口的全限定名
属性的名称和修饰符
方法的名称和修饰符
②0.JVM的永久代中会发生垃圾回收么?
①. 方法区中的垃圾回收主要是:废弃的常量和不再使用的类型
②. HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收
③. 判定一个常量是否"废弃”还是相对简单,而要判定一个类型是否属于"不再被使用的类”的条件就比较苛刻
了。需要同时满足下面三个条件:
该类所有的实例都已经被回收。也就是Java堆中不存在类以及任何派生子类的实例
加载该类的加载器已经被回收。这个条件除非是经过设计的可替换类加载器的场景,入OSGI、JSP的重加载等,否则通常是很难达成的
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法
②①. JVM在加载类的时候,是否按照类的加载、链接(验证、准备、解析)和初始化的顺序执行的?
不过Java虚拟机规范并没有明确要求解析阶段一定要按照顺序执行。在HotSpot VM中,加载、验证、准备和初始化会按照顺序有条不紊地执行,但链接阶段中的解析操作往往会伴随着JVM在执行完初始化之后再执行
②②."父加载器"和"子加载器"之间的关系是继承的吗?
- 不是继承的关系,是包含的关系
②③. 如果我们自定义加载器,没有使用双亲委派机制,那么Java中的核心类库是不是还是会进行加载?
会由引导类加载器进行加载,这是因为不管是自定义加载器还是系统类加载器或者扩展类加载器,最终都必须调用java.lang.ClassLoader.defineClass(String,byte[],int,int,ProtectionDomain)方法,而该方法会执行preDefineC lass()接口,该接口中提供给了对JDK核心类库的保护
②④. 为什么JDBC需要打破双亲委派机制?(tomcat也打破了)
JDBC的Driver接口定义在JDK中,其实现由各个数据库的服务商来提供,比如MySQL驱动包,DriverManager类中要加载各个实现了Driver接口的类,然后进行管理,也就是说BootStrap类加载器还要去加载jar包中的Driver接口的实现类,这就打破了双亲委派机制