【Android面试】Java虚拟机相关面试题(二)
一、简述JVM中类的加载机制与加载过程?
1、概述:虚拟机把描述类的数据从Class文件加载到内存,并对数据 进行校验、转换解析和初始化,最终形成可以被虚拟直接使用的java类型,这就是虚拟机的类加载机制。
2、类加载的过程:加 载、验 证、准 备、解 析、初始化、使 用、卸载
3、关于初始化: 5种情况会触发类的初始化
1)遇到new,getstatic,putstatic,invokesstatic这四个字节码指令 时,如果类没有被初始化
2)使用java.lang.reflect包的方法对类进行反射时,如果类没 有被初始化,则先触发其初始化
3)当初始化一个类时,其父类没有被初始化,则需要父类先初始化
4)虚拟机启动时,用户需要制定一个执行的主类,虚拟机会先初始化这个类
5)JDK 1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例后的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic的方 法句柄,并且这个方法句柄所对应的类没有被初始化
二、类加载的过程
通过一个类的全限名来获取定义此类的二进制字节流,将字节流所代表的静态存储结构转化为方法区的运行时 数据结构在内存中生成一个代表这个类的java.lang.Class对象, 作为方法区这个类的各种数据的访问入口
三、JVM、Dalvik、ART三者的原理和区别?
JVM:是Java Virtual Machine的缩写,其并不是指某个特定的虚拟机实现,而指任何能够运行Java字节码(class文件)的虚拟机实现,比如oracle的HotspotVM
Dalvik:是Google写的一个用于Android的虚拟机,但其严格来说并不算JVM(没有遵守Java虚拟机规范,比 如其字节码格式是dex而非class)该虚拟机在5.0时被ART替代
ART:是Android Runtime的缩写,严格来说并不是一个虚拟机,在4.4~6.0时采用安装时全部编译为机器码的 方式实 现,7.0时默认不全部编译,采用解释执行+JIT+空闲时AOT以改善安装耗时ART在安卓4.4时加入,5.0取代dalvik作为唯一实现直到现在
四、请谈谈Java的内存回收机制?
内存分为栈(stack)和堆(heap)两部分:
栈记录了方法调用,每个线程拥有一个栈,栈的每一帧中保存有该方法调用的参数、局部变量、返回地址栈中被调用方法运行结束时,相应的帧会删除,参数和局部变量占用的空间也会释放,堆是用来存储对象的,堆区由所有线程共享
垃圾回收机制有:引用计数算法、可达性分析算法、标记清除算法、复制算法、标记整理算法、分代回收算法。
五、JMM是什么?它存在哪些问题?该如何解决?
#android面试#就是Java内存模型。存在的问题就是多线程对共享数据的读写一致性问题,可以通过synchronized、cas、并发安全的数据结构、aqs 组件来解决