【最新Android高级面试知识点干货分享(二)】
转载请说明出处!
优秀博文推荐: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后(图片来源于网络):
Java内存模型(图片来源于网络):
主内存与工作内存的交互流程:
lock(锁定)—>unlock(解锁)---->read(读取主内存变量)---->load(将从主内存读取的变量载入至工作内存)—>use(在工作内存中使用此变量)---->assign(在工作内存中进行赋值操作)---->store(存储,把工作内存的变量传递给主内存)---->write(将从工作内存中得到的变量写入主内存变量中)
volatile关键字,就是用于确保这些变量在主内存到工作内存或工作内存到主内存的流程是完整的,确保数据的同步性。
八、 Java垃圾回收机制像这些知识点,有时间的话,推荐阅读一下《深入理解Java虚拟机》。
下面这些是针对垃圾回收机制面试题的知识要点。
按照程序是【CPU密集型】(又称计算密集型)还是【IO密集型】分:
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型: 核心线程数 = CPU核数*2
注意:有时间且愿意钻研的同学,可以看下《Java 虚拟机并发编程》
十、 JVM类加载
同样推荐有时间阅读《深入理解Java虚拟机》
作为面试知识要点,我只是简单的记录了下类加载过程,还有参考博客。并没有做深入研究。
JVM把描述类的数据的Class文件(Class对象在堆中创建,而class二进制文件及其他类信息放在方法区)加载进内存,并对数据进行校验、转换解析与初始化的过程。
(图片来源于网上)
参考资料:https://www.cnblogs.com/czwbig/p/11127222.html
下一篇开始正式分享我的面试笔记《Android篇》
安静的Sunny 原创文章 80获赞 34访问量 17万+ 关注 私信 展开阅读全文作者:安静的Sunny