【最新Android高级面试知识点干货分享(三)】

【最新Android高级面试知识点干货分享(二)】
转载请说明出处

七、Java运行时数据区 与 JVM内存模型

优秀博文推荐:https://www.cnblogs.com/czwbig/p/11127124.html

$7.1、Java运行时数据区

在JDK8以前,Java运行时数据区域具体分为以下五块:

  • 程序计数器(程序寄存器/PC寄存器Program Count Register):每个新开的线程都会有自己的PC。
  • 栈(Java栈/堆栈Stack):用来存储对像的引用,基本类型的数据。优点:存取速度快,仅次于寄存器,栈数据可以共享。缺点:存在栈中的数据大小与生存期必须是确定的。
  • 本地方法栈(Native Stack):
  • 方法区(Method Area):JVM会将二进制class文件的类型信息(类信息、常量,静态变量)放到方法区中,所有线程共享。此区域会开辟一块特殊的空间做”常量池“
  • 堆(Heap):用来存储对像实例。也叫GC堆,垃圾回收器主要是对此进行回收。堆是运行时动态分配内存。优点:灵活,因为动态分配内存。缺点:存取速度比栈慢

JDK8后(图片来源于网络):
image

$7.2、JVM内存模型

Java内存模型(图片来源于网络):

image

主内存与工作内存的交互流程:
lock(锁定)—>unlock(解锁)---->read(读取主内存变量)---->load(将从主内存读取的变量载入至工作内存)—>use(在工作内存中使用此变量)---->assign(在工作内存中进行赋值操作)---->store(存储,把工作内存的变量传递给主内存)---->write(将从工作内存中得到的变量写入主内存变量中)

volatile关键字,就是用于确保这些变量在主内存到工作内存或工作内存到主内存的流程是完整的,确保数据的同步性。

八、 Java垃圾回收机制

像这些知识点,有时间的话,推荐阅读一下《深入理解Java虚拟机》。
下面这些是针对垃圾回收机制面试题的知识要点。

  • 确定一个对象可被回收的算法:【引用计数法】、【可达性分析算法】(又叫GC_Root,根据引用链查找,跟GC_Root无关联的,将被回收)
  • 垃圾收集算法:标记清除算法(对有引用的对象进行标记,清除未标记的对象)、复制算法、标记整理算法(先标记,再进行碎片整理)、分代收集算法(新生代、老年代、永久代)
  • 根据分代收集算法,垃圾回收有2种类型:
    • Minor GC(针对新生代,不会影响老年代,主要是回收刚创建没多久的对象,Minor GC比较频繁,速度快,效率高)
    • Full GC(又称Major GC,是对整个堆进行回收,包括新生代,老年代,永久代,速度慢,效率低)

九、 Java多线程

$9.1、 Excutor、ExcutorService、Excutors的区别
  • Excutor为父类接口;
  • ExcutorService为Excutor的子类接口,一般都是用ExcutorService;
  • Excutors为工厂类,用来获取ExcutorService实例。
$9.2、 ThreadPoolExcutor自定义线程池
$9.2.1、 线程池参数
  • corePoolSize:核心线程池数量(即使线程处于空闲状态,线程也不会被回收)
  • maximumPoolSize:线程池中允许的最大线程数
  • keepAliveTime:线程池中除核心线程外,其他线程允许的最长空闲时间,时间一到就会被回收
  • workQueue:线程池所使用的任务缓冲队列
  • RejectedExecutionHandler:线程池对拒绝任务的处理策略
    • AbortPolicy:为线程池默认策略。丢弃/中止任务,并抛出RejectedExecutionException异常;
    • DiscardPolicy:丢弃任务,不会抛出异常。
    • DiscardOldestPolicy:丢弃执行队列中最老的任务,为当前提交的任务腾出空间
    • CallerRunsPolicy:直接由提交者执行所提交的任务。
$9.2.2、 核心线程数的配置

按照程序是【CPU密集型】(又称计算密集型)还是【IO密集型】分:

  • CPU密集型:核心线程数 = CPU核数 + 1

  • IO密集型: 核心线程数 = CPU核数*2

      注意:有时间且愿意钻研的同学,可以看下《Java 虚拟机并发编程》
    

十、 JVM类加载

同样推荐有时间阅读《深入理解Java虚拟机》
作为面试知识要点,我只是简单的记录了下类加载过程,还有参考博客。并没有做深入研究。

JVM把描述类的数据的Class文件(Class对象在堆中创建,而class二进制文件及其他类信息放在方法区)加载进内存,并对数据进行校验、转换解析与初始化的过程。

image
(图片来源于网上)
参考资料:https://www.cnblogs.com/czwbig/p/11127222.html

下一篇开始正式分享我的面试笔记《Android篇》

原创文章 80 获赞 34 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u011153817/article/details/105854582