一、谈一谈JAVA垃圾回收机制?
垃圾回收即garbagecollection,简称GC,作用是在某块内存不再使用时及时对其进行释放的管理机制。
GC的几个重点就是怎么找到无用对象,怎么对其进行释放,何时进行GC等等,另外说一句,Hotspot VM里堆是分代回收的(分出新生代和老年代,分别进行回收),不知道ART里有没有类似的机制
二、怎么找到无用对象?
目前来说有两种主流机制
引用计数:最简单的寻找无用对象的机制,当一个对象被引用一次,引用计数+1,当失去引用时引用计数-1,当此对象引用计数为0时可以直接回收。这种方法有一个显而易见的问题:无法回收被循环引用的对象。
可达性分析:从一个根对象(GC Root)开始向下搜寻,可以认为搜寻到的所有有强引用的对象都是活跃对象,所有找不到的对象都是无用对象,无用对象可能会被即刻回收,也可能进行其他操作(比如执行对象的finalize() 方法)
三、如何释放无用对象?
这个具体是看回收器的实现
四、何时开始GC?
任何时候都可能,当系统觉得你内存不足了就会开始回收常见的比如分配对象内存不足时(这里的内存不足有可能
不是占用真的很高,可能是内存足够,但是没有连续内存空间去放这个对象),当前堆内存占用超过阈值时,手动
调用 System.gc() 建议开始GC时,系统整体内存不足时等
五、回答一下什么是强、软、弱、虚引用?
强引用:是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题
软引用(SoftReference):
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
弱引用(WeakReference):
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存
区域的过程中,一旦发现了只具有弱引用的对象, 不管当前内存空间足够与否,都会回收它的内存。不 过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列 联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
虚引用(PhantomReference):
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个
对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中
六、简述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是什么?它存在哪些问题?该如何解决?
就是Java内存模型。存在的问题就是多线程对共享数据的读写一致性问题,可以通过synchronized、cas、并发安全的数据结构、aqs 组件来解决
下面为了帮助大家准备面试,免费分享由八年安卓大佬整理的《2023最新Android大厂高频面试题解析大全》,扫码获取!!